From: David Woodhouse Date: Wed, 31 May 2017 08:45:03 +0000 (+0100) Subject: Make dup_config_arg() always duplicate the argument X-Git-Tag: v8.00~153 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=cecadffb25e46c283b930a0a599dce9db1172c9b;p=users%2Fdwmw2%2Fopenconnect.git 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 --- 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) {