]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-master: master_service_exec_config() - Build argv using dynamic array
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Fri, 12 Feb 2021 17:15:44 +0000 (19:15 +0200)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Fri, 21 May 2021 07:46:29 +0000 (07:46 +0000)
src/lib-master/master-service-settings.c

index 1fb19d5b6e90003e013a2e2515138a302ae93564..eded8d139bd1cb38e0c63fb2e9ddfb41db38b5c5 100644 (file)
@@ -168,13 +168,18 @@ master_service_settings_check(void *_set, pool_t pool ATTR_UNUSED,
 }
 /* </settings checks> */
 
+static void strarr_push(ARRAY_TYPE(const_string) *argv, const char *str)
+{
+       array_push_back(argv, &str);
+}
+
 static void ATTR_NORETURN
 master_service_exec_config(struct master_service *service,
                           const struct master_service_settings_input *input)
 {
-       const char **conf_argv, *binary_path = service->argv[0];
+       ARRAY_TYPE(const_string) conf_argv;
+       const char *binary_path = service->argv[0];
        const char *error = NULL;
-       unsigned int i, argv_max_count;
 
        if (!t_binary_abspath(&binary_path, &error)) {
                i_fatal("t_binary_abspath(%s) failed: %s", binary_path, error);
@@ -199,36 +204,34 @@ master_service_exec_config(struct master_service *service,
        if (input->use_sysexits)
                env_put("USE_SYSEXITS", "1");
 
-       /* @UNSAFE */
-       i = 0;
-       argv_max_count = 11 + (service->argc + 1) + 1;
-       conf_argv = t_new(const char *, argv_max_count);
-       conf_argv[i++] = DOVECOT_CONFIG_BIN_PATH;
+       t_array_init(&conf_argv, 11 + (service->argc + 1) + 1);
+       strarr_push(&conf_argv, DOVECOT_CONFIG_BIN_PATH);
        if (input->service != NULL) {
-               conf_argv[i++] = "-f";
-               conf_argv[i++] = t_strconcat("service=", input->service, NULL);
+               strarr_push(&conf_argv, "-f");
+               strarr_push(&conf_argv,
+                           t_strconcat("service=", input->service, NULL));
        }
-       conf_argv[i++] = "-c";
-       conf_argv[i++] = service->config_path;
+       strarr_push(&conf_argv, "-c");
+       strarr_push(&conf_argv, service->config_path);
        if (input->module != NULL) {
-               conf_argv[i++] = "-m";
-               conf_argv[i++] = input->module;
+               strarr_push(&conf_argv, "-m");
+               strarr_push(&conf_argv, input->module);
                if (service->want_ssl_settings) {
-                       conf_argv[i++] = "-m";
-                       conf_argv[i++] = "ssl";
+                       strarr_push(&conf_argv, "-m");
+                       strarr_push(&conf_argv, "ssl");
                }
        }
        if (input->parse_full_config)
-               conf_argv[i++] = "-p";
+               strarr_push(&conf_argv, "-p");
 
-       conf_argv[i++] = "-e";
-       conf_argv[i++] = binary_path;
-       memcpy(conf_argv+i, service->argv + 1,
-              (service->argc) * sizeof(conf_argv[0]));
-       i += service->argc;
+       strarr_push(&conf_argv, "-e");
+       strarr_push(&conf_argv, binary_path);
+       array_append(&conf_argv, (const char *const *)service->argv + 1,
+                    service->argc);
+       array_append_zero(&conf_argv);
 
-       i_assert(i < argv_max_count);
-       execv_const(conf_argv[0], conf_argv);
+       const char *const *argv = array_front(&conf_argv);
+       execv_const(argv[0], argv);
 }
 
 static void