[sheepdog] [PATCH v1 2/2] dog: memory leak in vdi_setattr
Hitoshi Mitake
mitake.hitoshi at gmail.com
Wed Jul 23 15:43:58 CEST 2014
At Wed, 23 Jul 2014 12:42:40 +0800,
Meng An wrote:
>
> From: meng an <isolate000 at gmail.com>
>
> In function vdi_setattr, the pointer 'value' is allocated via
> xmalloc, but its memory is not released when returns.
>
> Signed-off-by: Meng An <anmeng.an at alibaba-inc.com>
> ---
> dog/vdi.c | 27 +++++++++++++++++++--------
> 1 files changed, 19 insertions(+), 8 deletions(-)
Applied with a fix for initializing the variable "value" of
vdi_setattr().
Thanks,
Hitoshi
>
> 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
> sheepdog at lists.wpkg.org
> http://lists.wpkg.org/mailman/listinfo/sheepdog
More information about the sheepdog
mailing list