[sheepdog] [PATCH] dog: don't free value if it is passed via command line
Ruoyu
liangry at ucweb.com
Wed Aug 20 03:51:20 CEST 2014
On 2014年08月18日 10:26, Hitoshi Mitake wrote:
> At Fri, 15 Aug 2014 10:26:42 +0800,
> Ruoyu wrote:
>>
>> On 2014年08月15日 09:32, Hitoshi Mitake wrote:
>>> vdi_setattr() has two way of obtaining value of attr:
>>> 1. command line parameter
>>> 2. read from stdin
>>>
>>> In a case of 1, the value shouldn't be freed because it is not in heap
>>> area. But current dog does it. This patch removes this invalid free.
>> In case 1, what about value = strdup(argv[optind++]) to alloc the space
>> in stack area?
>> Then, free will fit for both situations.
>> Because I think the new variable value_allocated is confused for developers.
> I want to avoid using strdup() in this case. Because strdup() can fail
> and we need to add another error handling code. It would add another
> complexity.
How about adding a new function xstrdup with error handling bundled,
similar to xmalloc?
>
> How about enhancing comment for the new variable (value_allocated)?
I hope the code is self-explained as far as possible.
>
> Thanks,
> Hitoshi
>
>>> Reported-by: Ruoyu <liangry at ucweb.com>
>>> Signed-off-by: Hitoshi Mitake <mitake.hitoshi at lab.ntt.co.jp>
>>> ---
>>> dog/vdi.c | 4 +++-
>>> 1 file changed, 3 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/dog/vdi.c b/dog/vdi.c
>>> index 84715b3..1d8cc6e 100644
>>> --- a/dog/vdi.c
>>> +++ b/dog/vdi.c
>>> @@ -1278,6 +1278,7 @@ static int vdi_setattr(int argc, char **argv)
>>> const char *vdiname = argv[optind++], *key;
>>> char *value = NULL;
>>> uint64_t offset;
>>> + bool value_alloced = false;
>>>
>>> key = argv[optind++];
>>> if (!key) {
>>> @@ -1289,6 +1290,7 @@ static int vdi_setattr(int argc, char **argv)
>>> value = argv[optind++];
>>> if (!value && !vdi_cmd_data.delete) {
>>> value = xmalloc(SD_MAX_VDI_ATTR_VALUE_LEN);
>>> + value_alloced = true;
>>>
>>> offset = 0;
>>> reread:
>>> @@ -1333,7 +1335,7 @@ reread:
>>> }
>>>
>>> out:
>>> - if (value)
>>> + if (value_alloced)
>>> free(value);
>>>
>>> return ret;
>>
>> --
>> sheepdog mailing list
>> sheepdog at lists.wpkg.org
>> http://lists.wpkg.org/mailman/listinfo/sheepdog
More information about the sheepdog
mailing list