Hi Anton,

The subject isn't super helpful unless you know the specific
terminology of the statuc analyzer you are using. It would be better to
say something like:

  ar: check whether elf_getarhdr returns NULL

On Thu, 2025-02-13 at 18:00 +0300, Anton Moryakov wrote:
> Report of the static analyzer:
> 1. DEREF_OF_NULL.RET Pointer, returned from function 'elf_getarhdr' at 
> ar.c:498, may be NULL and is dereferenced at ar.c:500.
> 2. DEREF_OF_NULL.RET Pointer, returned from function 'elf_getarhdr' at 
> ar.c:940, may be NULL and is dereferenced at ar.c:943
> 3. DEREF_OF_NULL.RET Pointer, returned from function 'elf_getarhdr' at 
> ar.c:1147, may be NULL and is dereferenced at ar.c:1150.
> 4. DEREF_OF_NULL.RET.STAT Return value of a function 'elf_rawfile' is 
> dereferenced at ar.c:857 without checking for NULL, but it is usually checked 
> for this function (4/5)
> 
> Corrections explained:
> Added check if (arhdr == NULL) goto next;
> 
> Triggers found by static analyzer Svace.
> 
> Signed-off-by: Anton Moryakov <ant.v.morya...@gmail.com>
> 
> ---
>  src/ar.c | 12 ++++++++++++
>  1 file changed, 12 insertions(+)
> 
> diff --git a/src/ar.c b/src/ar.c
> index 9ace28b9..4b90115d 100644
> --- a/src/ar.c
> +++ b/src/ar.c
> @@ -498,6 +498,9 @@ do_oper_extract (int oper, const char *arfname, char 
> **argv, int argc,
>    while ((subelf = elf_begin (fd, cmd, elf)) != NULL)
>      {
>        Elf_Arhdr *arhdr = elf_getarhdr (subelf);
> +       
> +       if (arhdr == NULL)
> +     goto next;
> 

OK, but the identation is completely wrong. There is extra whitespace
on the first line, just remove the line. The if line should be indented
6 spaces, the goto line should be indented one tab.
 
>        if (strcmp (arhdr->ar_name, "/") == 0)
>       {
> @@ -860,6 +863,9 @@ write_member (struct armem *memb, off_t *startp, off_t 
> *lenp, Elf *elf,
>      {
>        /* In case of a long file name we assume the archive header
>        changed and we write it here.  */
> +      
> +       if (arhdr == NULL)
> +     goto next;
>        memcpy (&arhdr, elf_rawfile (elf, NULL) + *startp, sizeof (arhdr));

This doesn't make sense to me, does it even compile?
arhdr is a struct ar_hdr not a pointer to it.

>        snprintf (tmpbuf, sizeof (tmpbuf), "/%-*ld",
> @@ -943,6 +949,9 @@ do_oper_delete (const char *arfname, char **argv, int 
> argc,
>    while ((subelf = elf_begin (fd, cmd, elf)) != NULL)
>      {
>        Elf_Arhdr *arhdr = elf_getarhdr (subelf);
> +       
> +       if (arhdr == NULL)
> +     goto next;

This does make sense, but indentation needs to be fixed like above.

>        /* Ignore the symbol table and the long file name table here.  */
>        if (strcmp (arhdr->ar_name, "/") == 0
> @@ -1152,6 +1161,9 @@ do_oper_insert (int oper, const char *arfname, char 
> **argv, int argc,
>    while ((subelf = elf_begin (fd, cmd, elf)) != NULL)
>      {
>        Elf_Arhdr *arhdr = elf_getarhdr (subelf);
> +       
> +       if (arhdr == NULL)
> +     goto next;

Likewise.

Thanks,

Mark

Reply via email to