From cecadffb25e46c283b930a0a599dce9db1172c9b Mon Sep 17 00:00:00 2001 From: David Woodhouse Date: Wed, 31 May 2017 09:45:03 +0100 Subject: [PATCH] Make dup_config_arg() always duplicate the argument .... even when conversion fails. Otherwise we end up trying to free a member of argv[], which never works well. Signed-off-by: David Woodhouse --- main.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/main.c b/main.c index c127b62c..8ea298fd 100644 --- a/main.c +++ b/main.c @@ -913,9 +913,21 @@ static char *xstrdup(const char *arg) #define keep_config_arg() \ (config_file ? xstrdup(config_arg) : convert_arg_to_utf8(argv, config_arg)) -#define dup_config_arg() \ - ((config_file || is_arg_utf8(config_arg)) ? xstrdup(config_arg) : \ - convert_arg_to_utf8(argv, config_arg)) +#define dup_config_arg() __dup_config_arg(argv, config_arg) + +static inline char *__dup_config_arg(char **argv, char *config_arg) +{ + char *res; + + if (config_file || is_arg_utf8(config_arg)) + return xstrdup(config_arg); + + res = convert_arg_to_utf8(argv, config_arg); + /* Force a copy, even if conversion failed */ + if (res == config_arg) + res = xstrdup(res); + return res; +} static int next_option(int argc, char **argv, char **config_arg) { -- 2.50.1