From: meng an <[email protected]> In function vdi_setattr, the pointer 'value' is allocated via xmalloc, but its memory is not released when returns.
Signed-off-by: Meng An <[email protected]> --- dog/vdi.c | 27 +++++++++++++++++++-------- 1 files changed, 19 insertions(+), 8 deletions(-) diff --git a/dog/vdi.c b/dog/vdi.c index 30739ff..a4eb91e 100644 --- a/dog/vdi.c +++ b/dog/vdi.c @@ -1126,7 +1126,8 @@ static int find_vdi_attr_oid(const char *vdiname, const char *tag, uint32_t snap static int vdi_setattr(int argc, char **argv) { - int ret, value_len = 0; + int value_len = 0; + int ret = EXIT_SUCCESS; uint64_t attr_oid = 0; uint32_t vid = 0, nr_copies = 0; const char *vdiname = argv[optind++], *key; @@ -1136,7 +1137,8 @@ static int vdi_setattr(int argc, char **argv) key = argv[optind++]; if (!key) { sd_err("Please specify the attribute key"); - return EXIT_USAGE; + ret = EXIT_USAGE; + goto out; } value = argv[optind++]; @@ -1149,7 +1151,8 @@ reread: SD_MAX_VDI_ATTR_VALUE_LEN - offset); if (ret < 0) { sd_err("Failed to read attribute value from stdin: %m"); - return EXIT_SYSFAIL; + ret = EXIT_SYSFAIL; + goto out; } if (ret > 0) { offset += ret; @@ -1168,19 +1171,27 @@ reread: if (ret) { if (ret == SD_RES_VDI_EXIST) { sd_err("The attribute '%s' already exists", key); - return EXIT_EXISTS; + ret = EXIT_EXISTS; + goto out; } else if (ret == SD_RES_NO_OBJ) { sd_err("Attribute '%s' not found", key); - return EXIT_MISSING; + ret = EXIT_MISSING; + goto out; } else if (ret == SD_RES_NO_VDI) { sd_err("VDI not found"); - return EXIT_MISSING; + ret = EXIT_MISSING; + goto out; } else sd_err("Failed to set attribute: %s", sd_strerror(ret)); - return EXIT_FAILURE; + ret = EXIT_FAILURE; + goto out; } - return EXIT_SUCCESS; +out: + if (value) + free(value); + + return ret; } static int vdi_getattr(int argc, char **argv) -- 1.7.1 -- sheepdog mailing list [email protected] http://lists.wpkg.org/mailman/listinfo/sheepdog
