set_global_var_parse_kv() should pass the pointer from strdup()

A comment says that the caller should free k_out, but the pointer passed
via k_out is not the same pointer we received from strdup(). Instead,
it is a pointer into the region we received from strdup(). The free
function should always be called with the original pointer, so this is
likely a bug.

We solve this by calling `strdup()` a second time and then freeing the
original pointer.

Coverity reported this as a memory leak.

Reviewed-by: Neal Gompa <ngompa@datto.com>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Richard Yao <richard.yao@alumni.stonybrook.edu>
Closes #13867
This commit is contained in:
Richard Yao 2022-09-23 13:51:14 -04:00 committed by GitHub
parent e9b12d4196
commit d25153d555
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -174,12 +174,13 @@ set_global_var_parse_kv(const char *arg, char **k_out, u_longlong_t *v_out)
goto err_free; goto err_free;
} }
*k_out = k; *k_out = strdup(k);
*v_out = val; *v_out = val;
free(d);
return (0); return (0);
err_free: err_free:
free(k); free(d);
return (err); return (err);
} }