From d25153d55568afc92a7b3ec8329d7fbad7382a80 Mon Sep 17 00:00:00 2001 From: Richard Yao Date: Fri, 23 Sep 2022 13:51:14 -0400 Subject: [PATCH] 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 Reviewed-by: Brian Behlendorf Signed-off-by: Richard Yao Closes #13867 --- lib/libzpool/util.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/libzpool/util.c b/lib/libzpool/util.c index 833e51398..6ff0d2853 100644 --- a/lib/libzpool/util.c +++ b/lib/libzpool/util.c @@ -174,12 +174,13 @@ set_global_var_parse_kv(const char *arg, char **k_out, u_longlong_t *v_out) goto err_free; } - *k_out = k; + *k_out = strdup(k); *v_out = val; + free(d); return (0); err_free: - free(k); + free(d); return (err); }