]> git.ipfire.org Git - thirdparty/openvpn.git/commitdiff
Factor out %sc handling from argv_printf()
authorHeiko Hund <heiko.hund@sophos.com>
Fri, 28 Oct 2016 16:42:40 +0000 (18:42 +0200)
committerGert Doering <gert@greenie.muc.de>
Mon, 14 Nov 2016 19:34:26 +0000 (20:34 +0100)
Move functionality to parse command strings into argv_parse_cmd().
That is a preparation for the upcoming refactoring of argv_printf().

Signed-off-by: Heiko Hund <heiko.hund@sophos.com>
Acked-by: David Sommerseth <davids@redhat.com>
Message-Id: <1477672963-5724-5-git-send-email-heiko.hund@sophos.com>
URL: https://www.mail-archive.com/openvpn-devel@lists.sourceforge.net/msg12816.html
Signed-off-by: Gert Doering <gert@greenie.muc.de>
src/openvpn/argv.c
src/openvpn/argv.h
src/openvpn/errlevel.h
src/openvpn/init.c
src/openvpn/misc.c
src/openvpn/multi.c
src/openvpn/options.c
src/openvpn/socket.c
src/openvpn/ssl_verify.c
tests/unit_tests/openvpn/test_argv.c

index e8bb09fe5023548fdc7c1a8f7fd8d38b5a3f8ecd..f8287b794cae1af4060cf61073312f0cb43c4154 100644 (file)
@@ -198,7 +198,6 @@ argv_msg_prefix (const int msglev, const struct argv *a, const char *prefix)
 static void
 argv_printf_arglist (struct argv *a, const char *format, va_list arglist)
 {
-  struct gc_arena gc = gc_new ();
   char *term;
   const char *f = format;
 
@@ -215,29 +214,6 @@ argv_printf_arglist (struct argv *a, const char *format, va_list arglist)
                 s = "";
               argv_append (a, string_alloc (s, NULL));
             }
-          else if (!strcmp (term, "%sc"))
-            {
-              char *s = va_arg (arglist, char *);
-              if (s)
-                {
-                  int nparms;
-                  char *parms[MAX_PARMS+1];
-                  int i;
-
-                  nparms = parse_line (s, parms, MAX_PARMS, "SCRIPT-ARGV", 0, D_ARGV_PARSE_CMD, &gc);
-                  if (nparms)
-                    {
-                      for (i = 0; i < nparms; ++i)
-                        argv_append (a, string_alloc (parms[i], NULL));
-                    }
-                  else
-                    argv_append (a, string_alloc (s, NULL));
-                }
-              else
-                {
-                  argv_append (a, string_alloc ("", NULL));
-                }
-            }
           else if (!strcmp (term, "%d"))
             {
               char numstr[64];
@@ -295,7 +271,6 @@ argv_printf_arglist (struct argv *a, const char *format, va_list arglist)
           argv_append (a, term);
         }
     }
-  gc_free (&gc);
 }
 
 void
@@ -316,3 +291,26 @@ argv_printf_cat (struct argv *a, const char *format, ...)
   argv_printf_arglist (a, format, arglist);
   va_end (arglist);
 }
+
+void
+argv_parse_cmd (struct argv *a, const char *s)
+{
+  int nparms;
+  char *parms[MAX_PARMS + 1];
+  struct gc_arena gc = gc_new ();
+
+  argv_reset (a);
+  argv_extend (a, 1); /* ensure trailing NULL */
+
+  nparms = parse_line (s, parms, MAX_PARMS, "SCRIPT-ARGV", 0, D_ARGV_PARSE_CMD, &gc);
+  if (nparms)
+    {
+      int i;
+      for (i = 0; i < nparms; ++i)
+        argv_append (a, string_alloc (parms[i], NULL));
+    }
+  else
+    argv_append (a, string_alloc (s, NULL));
+
+  gc_free (&gc);
+}
index c45bec82d685bb45fde3e9cdb6d9a48513fbbc50..9aee641a698259d9801077a76ed2a7752e1de8e9 100644 (file)
@@ -45,6 +45,7 @@ const char *argv_str (const struct argv *a, struct gc_arena *gc, const unsigned
 struct argv argv_insert_head (const struct argv *a, const char *head);
 void argv_msg (const int msglev, const struct argv *a);
 void argv_msg_prefix (const int msglev, const struct argv *a, const char *prefix);
+void argv_parse_cmd (struct argv *a, const char *s);
 
 void argv_printf (struct argv *a, const char *format, ...)
 #ifdef __GNUC__
index ae1f8f497682165608a71045dcf8612e36ba344a..9d56eb4984eecf982ac257abf8df1ef047cc8e4a 100644 (file)
 #define D_PS_PROXY_DEBUG     LOGLEV(7, 70, M_DEBUG)  /* port share proxy debug */
 #define D_AUTO_USERID        LOGLEV(7, 70, M_DEBUG)  /* AUTO_USERID debugging */
 #define D_TLS_KEYSELECT      LOGLEV(7, 70, M_DEBUG)  /* show information on key selection for data channel */
-#define D_ARGV_PARSE_CMD     LOGLEV(7, 70, M_DEBUG)  /* show parse_line() errors in argv_printf %sc */
+#define D_ARGV_PARSE_CMD     LOGLEV(7, 70, M_DEBUG)  /* show parse_line() errors in argv_parse_cmd */
 #define D_CRYPTO_DEBUG       LOGLEV(7, 70, M_DEBUG)  /* show detailed info from crypto.c routines */
 #define D_PID_DEBUG          LOGLEV(7, 70, M_DEBUG)  /* show packet-id debugging info */
 #define D_PF_DROPPED_BCAST   LOGLEV(7, 71, M_DEBUG)  /* packet filter dropped a broadcast packet */
index 1a9340ce0c684e63b5d9f05c5511153e717225bd..d3cf7ab9b518e3e168f8c986acdeff336b58e4b7 100644 (file)
@@ -1350,7 +1350,7 @@ do_route (const struct options *options,
     {
       struct argv argv = argv_new ();
       setenv_str (es, "script_type", "route-up");
-      argv_printf (&argv, "%sc", options->route_script);
+      argv_parse_cmd (&argv, options->route_script);
       openvpn_run_script (&argv, es, 0, "--route-up");
       argv_reset (&argv);
     }
index 3d40f0bfe9affaede4a48fe06275e2c1f1afce28..bc8b33cb7e12aa195dfe1684075741f6b6e62454 100644 (file)
@@ -120,13 +120,9 @@ run_up_down (const char *command,
       struct argv argv = argv_new ();
       ASSERT (arg);
       setenv_str (es, "script_type", script_type);
-      argv_printf (&argv,
-                 "%sc %s %d %d %s %s %s",
-                 command,
-                 arg,
-                 tun_mtu, link_mtu,
-                 ifconfig_local, ifconfig_remote,
-                 context);
+      argv_parse_cmd (&argv, command);
+      argv_printf_cat (&argv, "%s %d %d %s %s %s", arg, tun_mtu, link_mtu,
+                       ifconfig_local, ifconfig_remote, context);
       argv_msg (M_INFO, &argv);
       openvpn_run_script (&argv, es, S_FATAL, "--up/--down");
       argv_reset (&argv);
index dc4cff47e07eea9114ff883764ed2f0c65c84ca7..b497f6ad6d86aa52542ac1d92216a781e0652c75 100644 (file)
@@ -126,10 +126,8 @@ learn_address_script (const struct multi_context *m,
     {
       struct argv argv = argv_new ();
       setenv_str (es, "script_type", "learn-address");
-      argv_printf (&argv, "%sc %s %s",
-                  m->top.options.learn_address_script,
-                  op,
-                  mroute_addr_print (addr, &gc));
+      argv_parse_cmd (&argv, m->top.options.learn_address_script);
+      argv_printf_cat (&argv, "%s %s", op, mroute_addr_print (addr, &gc));
       if (mi)
        argv_printf_cat (&argv, "%s", tls_common_name (mi->context.c2.tls_multi, false));
       if (!openvpn_run_script (&argv, es, 0, "--learn-address"))
@@ -545,7 +543,7 @@ multi_client_disconnect_script (struct multi_context *m,
        {
          struct argv argv = argv_new ();
          setenv_str (mi->context.c2.es, "script_type", "client-disconnect");
-         argv_printf (&argv, "%sc", mi->context.options.client_disconnect_script);
+         argv_parse_cmd (&argv, mi->context.options.client_disconnect_script);
          openvpn_run_script (&argv, mi->context.c2.es, 0, "--client-disconnect");
          argv_reset (&argv);
        }
@@ -1834,9 +1832,8 @@ multi_connection_established (struct multi_context *m, struct multi_instance *mi
             goto script_failed;
           }
 
-         argv_printf (&argv, "%sc %s",
-                      mi->context.options.client_connect_script,
-                      dc_file);
+          argv_parse_cmd (&argv, mi->context.options.client_connect_script);
+          argv_printf_cat (&argv, "%s", dc_file);
 
          if (openvpn_run_script (&argv, mi->context.c2.es, 0, "--client-connect"))
            {
index 5a5e7ef57175e1f4d0744d57d1ee012006f382cc..1b9294aff74a5fa9e4cfe56d14077dd4cce84518 100644 (file)
@@ -2796,7 +2796,7 @@ check_cmd_access(const char *command, const char *opt, const char *chroot)
 
   /* Extract executable path and arguments */
   argv = argv_new ();
-  argv_printf (&argv, "%sc", command);
+  argv_parse_cmd (&argv, command);
 
   /* if an executable is specified then check it; otherwise, complain */
   if (argv.argv[0])
index 1fbb415300a9b28e428e8e6777d3c5a558ffa595..a9aaa2a267ad549b0b8f963ee2df7f837bc57c7e 100644 (file)
@@ -2023,9 +2023,10 @@ ipchange_fmt (const bool include_cmd, struct argv *argv, const struct link_socke
 {
   const char *host = print_sockaddr_ex (&info->lsa->actual.dest.addr.sa, " ", PS_SHOW_PORT , gc);
   if (include_cmd)
-    argv_printf (argv, "%sc %s",
-                info->ipchange_command,
-                host);
+    {
+      argv_parse_cmd (argv, info->ipchange_command);
+      argv_printf_cat (argv, "%s", host);
+    }
   else
     argv_printf (argv, "%s", host);
 
index 99a2f70ec9d6d9c49368c4cf9cbff9d89f12fc0d..0b45972320c1e57815c6678ee50f3642e04329ae 100644 (file)
@@ -516,7 +516,8 @@ verify_cert_call_command(const char *verify_command, struct env_set *es,
        }
     }
 
-  argv_printf (&argv, "%sc %d %s", verify_command, cert_depth, subject);
+  argv_parse_cmd (&argv, verify_command);
+  argv_printf_cat (&argv, "%d %s", cert_depth, subject);
 
   argv_msg_prefix (D_TLS_DEBUG, &argv, "TLS: executing verify command");
   ret = openvpn_run_script (&argv, es, 0, "--tls-verify script");
@@ -983,7 +984,8 @@ verify_user_pass_script (struct tls_session *session, const struct user_pass *up
       setenv_untrusted (session);
 
       /* format command line */
-      argv_printf (&argv, "%sc %s", session->opt->auth_user_pass_verify_script, tmp_file);
+      argv_parse_cmd (&argv, session->opt->auth_user_pass_verify_script);
+      argv_printf_cat (&argv, "%s", tmp_file);
 
       /* call command */
       ret = openvpn_run_script (&argv, session->opt->es, 0,
index f07a5fb49e8b6c784122b779e644e9c8fcdb4b44..3945634b01eb52066240f323aac5d3f9c7618e53 100644 (file)
@@ -99,14 +99,23 @@ argv_printf__combined_path_with_spaces__argc_correct (void **state)
 }
 
 static void
-argv_printf__script_command__argc_correct (void **state)
+argv_parse_cmd__command_string__argc_correct (void **state)
 {
   struct argv a = argv_new ();
 
-  argv_printf (&a, "%sc", SCRIPT_CMD);
+  argv_parse_cmd (&a, SCRIPT_CMD);
   assert_int_equal (a.argc, 3);
 
-  argv_printf (&a, "bar baz %sc %d %s", SCRIPT_CMD, 42, PATH1);
+  argv_reset (&a);
+}
+
+static void
+argv_parse_cmd__command_and_extra_options__argc_correct (void **state)
+{
+  struct argv a = argv_new ();
+
+  argv_parse_cmd (&a, SCRIPT_CMD);
+  argv_printf_cat (&a, "bar baz %d %s", 42, PATH1);
   assert_int_equal (a.argc, 7);
 
   argv_reset (&a);
@@ -184,7 +193,8 @@ main(void)
     cmocka_unit_test (argv_printf__multiple_spaces_in_format__parsed_as_one),
     cmocka_unit_test (argv_printf_cat__multiple_spaces_in_format__parsed_as_one),
     cmocka_unit_test (argv_printf__combined_path_with_spaces__argc_correct),
-    cmocka_unit_test (argv_printf__script_command__argc_correct),
+    cmocka_unit_test (argv_parse_cmd__command_string__argc_correct),
+    cmocka_unit_test (argv_parse_cmd__command_and_extra_options__argc_correct),
     cmocka_unit_test (argv_printf_cat__used_twice__argc_correct),
     cmocka_unit_test (argv_str__multiple_argv__correct_output),
     cmocka_unit_test (argv_insert_head__non_empty_argv__head_added),