From e11c4327f12df0e1f3ae9a9187a7ee553d1d6e95 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 20cabe7c2e..327391245a 100644 --- a/lib/libzpool/util.c +++ b/lib/libzpool/util.c @@ -173,12 +173,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); }