]> www.infradead.org Git - users/dwmw2/openconnect.git/commitdiff
Make dup_config_arg() always duplicate the argument
authorDavid Woodhouse <dwmw2@infradead.org>
Wed, 31 May 2017 08:45:03 +0000 (09:45 +0100)
committerDavid Woodhouse <dwmw2@infradead.org>
Mon, 14 Aug 2017 09:48:24 +0000 (10:48 +0100)
.... even when conversion fails. Otherwise we end up trying to free a
member of argv[], which never works well.

Signed-off-by: David Woodhouse <dwmw2@infradead.org>
main.c

diff --git a/main.c b/main.c
index c127b62c7a97ecbca17576a1156861f4dd700fba..8ea298fd7705719f27eef26f9a28031c4c7941a8 100644 (file)
--- 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)
 {