grub-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH v2 2/2] Make editenv chase symlinks including those across de


From: Javier Martinez Canillas
Subject: Re: [PATCH v2 2/2] Make editenv chase symlinks including those across devices
Date: Tue, 29 Oct 2019 13:44:14 +0100
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.1.0

Hello Daniel,

On 10/28/19 5:12 PM, Daniel Kiper wrote:
> On Mon, Oct 28, 2019 at 02:11:10PM +0100, Javier Martinez Canillas wrote:
>> From: Peter Jones <address@hidden>

[snip]

>>  grub_util_create_envblk_file (const char *name)
>>  {
>> +  int rc;
>>    FILE *fp;
>>    char *buf;
>>    char *namenew;
>> +  ssize_t size = 1;
>> +  char *rename_target = xstrdup (name);
> 
> What will happen if rename_target is NULL?
>

I've looked at this and it's not possible for rename_target to be NULL since
xstrdup() calls xmalloc() to allocate memory and this function already checks
if the returned pointer is NULL and calls grub_util_error() if that's the case
which exits after printing an error message.

So the code is correct and in fact I see that all xstrdup() callers (or for
any other x* function that makes allocations) don't check the return value.

>>    buf = xmalloc (DEFAULT_ENVBLK_SIZE);
>>
>> @@ -60,7 +64,58 @@ grub_util_create_envblk_file (const char *name)
>>    free (buf);
>>    fclose (fp);
>>
>> -  if (grub_util_rename (namenew, name) < 0)
>> -    grub_util_error (_("cannot rename the file %s to %s"), namenew, name);
>> +  while (1)
>> +    {
>> +      char *linkbuf;
>> +      ssize_t retsize;
>> +
>> +      linkbuf = xmalloc (size+1);
> 
> Please check for NULL here. And "size + 1". In general I will not accept

Ok, will add spaces around the + operator.

> any patch which does not check for NULL for malloc() et consortes.
>

Same, all callers of xmalloc() don't check this since as mentioned the function
already takes care of this.

>> +      retsize = grub_util_readlink (rename_target, linkbuf, size);
>> +      if (retsize < 0 && (errno == ENOENT || errno == EINVAL))
>> +    {
>> +      free (linkbuf);
>> +      break;
>> +    }
>> +      else if (retsize < 0)
>> +    {
>> +      grub_util_error (_("cannot rename the file %s to %s: %m"), namenew, 
>> name);
>> +      free (linkbuf);
>> +      free (namenew);
>> +      return;
>> +    }
>> +      else if (retsize == size)
>> +    {
>> +      free (linkbuf);
>> +      size += 128;
>> +      continue;
>> +    }
>> +
>> +      linkbuf[retsize] = '\0';
>> +      if (linkbuf[0] == '/')
>> +        {
>> +          free (rename_target);
>> +          rename_target = linkbuf;
>> +        }
>> +      else
>> +        {
>> +          char *dbuf = xstrdup (rename_target);
> 
> What happens if dbuf is NULL?
>

Same than above.

>> +          const char *dir = dirname (dbuf);
> 
> Empty line please...
>

Ok.

>> +          free (rename_target);
>> +          rename_target = xasprintf ("%s/%s", dir, linkbuf);
> 
> NULL?
>

Same than above.

> Daniel
> 

Best regards,
-- 
Javier Martinez Canillas
Software Engineer - Desktop Hardware Enablement
Red Hat



reply via email to

[Prev in Thread] Current Thread [Next in Thread]