s3:modules:vfs_virusfilter: Recent talloc changes cause infinite start-up failure
authorTrever L. Adams <trever.adams@gmail.com>
Fri, 26 Feb 2021 22:52:03 +0000 (14:52 -0800)
committerNoel Power <npower@samba.org>
Mon, 1 Mar 2021 21:44:55 +0000 (21:44 +0000)
Recent talloc changes cause the current check for failure to allocate to be incorrectly triggered.

This patch ensures the original parameter is not NULL before attempting any talloc or strstr.

BUG: https://bugzilla.samba.org/show_bug.cgi?id=14634
RN: Fix failure of vfs_virusfilter starting due to talloc changes

Signed-off-by: Trever L. Adams" <trever.adams@gmail.com>
Reviewed-by: Jeremy Allison <jra@samba.org>
Reviewed-by: Noel Power <npower@samba.org>
Autobuild-User(master): Noel Power <npower@samba.org>
Autobuild-Date(master): Mon Mar  1 21:44:55 UTC 2021 on sn-devel-184

source3/modules/vfs_virusfilter.c

index e0712b99b4270c117b0d7413c731b7db3ab3bb6e..e7017ee1c7a90182637ccaaa3272afe85f703c19 100644 (file)
@@ -267,18 +267,24 @@ static int virusfilter_vfs_connect(
 
        infected_file_command = lp_parm_const_string(
                snum, "virusfilter", "infected file command", NULL);
-       config->infected_file_command = talloc_strdup(config, infected_file_command);
-       if (config->infected_file_command == NULL) {
-               DBG_ERR("virusfilter-vfs: out of memory!\n");
-               return -1;
+       if (infected_file_command != NULL) {
+               config->infected_file_command = talloc_strdup(
+                                                       config,
+                                                       infected_file_command);
+               if (config->infected_file_command == NULL) {
+                       DBG_ERR("virusfilter-vfs: out of memory!\n");
+                       return -1;
+               }
        }
-
        scan_error_command = lp_parm_const_string(
                snum, "virusfilter", "scan error command", NULL);
-       config->scan_error_command = talloc_strdup(config, scan_error_command);
-       if (config->scan_error_command == NULL) {
-               DBG_ERR("virusfilter-vfs: out of memory!\n");
-               return -1;
+       if (scan_error_command != NULL) {
+               config->scan_error_command = talloc_strdup(config,
+                                                          scan_error_command);
+               if (config->scan_error_command == NULL) {
+                       DBG_ERR("virusfilter-vfs: out of memory!\n");
+                       return -1;
+               }
        }
 
        config->block_access_on_error = lp_parm_bool(
@@ -290,10 +296,12 @@ static int virusfilter_vfs_connect(
        quarantine_dir = lp_parm_const_string(
                snum, "virusfilter", "quarantine directory",
                tmp ? tmp : "/tmp/.quarantine");
-       config->quarantine_dir = talloc_strdup(config, quarantine_dir);
-       if (config->quarantine_dir == NULL) {
-               DBG_ERR("virusfilter-vfs: out of memory!\n");
-               return -1;
+       if (quarantine_dir != NULL) {
+               config->quarantine_dir = talloc_strdup(config, quarantine_dir);
+               if (config->quarantine_dir == NULL) {
+                       DBG_ERR("virusfilter-vfs: out of memory!\n");
+                       return -1;
+               }
        }
 
        if (tmp != config->quarantine_dir) {
@@ -311,42 +319,52 @@ static int virusfilter_vfs_connect(
        quarantine_prefix = lp_parm_const_string(
                snum, "virusfilter", "quarantine prefix",
                VIRUSFILTER_DEFAULT_QUARANTINE_PREFIX);
-       config->quarantine_prefix = talloc_strdup(config, quarantine_prefix);
-       if (config->quarantine_prefix == NULL) {
-               DBG_ERR("virusfilter-vfs: out of memory!\n");
-               return -1;
+       if (quarantine_prefix != NULL) {
+               config->quarantine_prefix = talloc_strdup(config,
+                                                         quarantine_prefix);
+               if (config->quarantine_prefix == NULL) {
+                       DBG_ERR("virusfilter-vfs: out of memory!\n");
+                       return -1;
+               }
        }
 
        quarantine_suffix = lp_parm_const_string(
                snum, "virusfilter", "quarantine suffix",
                VIRUSFILTER_DEFAULT_QUARANTINE_SUFFIX);
-       config->quarantine_suffix = talloc_strdup(config, quarantine_suffix);
-       if (config->quarantine_suffix == NULL) {
-               DBG_ERR("virusfilter-vfs: out of memory!\n");
-               return -1;
+       if (quarantine_suffix != NULL) {
+               config->quarantine_suffix = talloc_strdup(config,
+                                                         quarantine_suffix);
+               if (config->quarantine_suffix == NULL) {
+                       DBG_ERR("virusfilter-vfs: out of memory!\n");
+                       return -1;
+               }
        }
 
        /*
         * Make sure prefixes and suffixes do not contain directory
         * delimiters
         */
-       sret = strstr(config->quarantine_prefix, "/");
-       if (sret != NULL) {
-               DBG_ERR("quarantine prefix must not contain directory "
-                       "delimiter(s) such as '/' (%s replaced with %s)\n",
-                       config->quarantine_prefix,
-                       VIRUSFILTER_DEFAULT_QUARANTINE_PREFIX);
-               config->quarantine_prefix =
-                       VIRUSFILTER_DEFAULT_QUARANTINE_PREFIX;
-       }
-       sret = strstr(config->quarantine_suffix, "/");
-       if (sret != NULL) {
-               DBG_ERR("quarantine suffix must not contain directory "
-                       "delimiter(s) such as '/' (%s replaced with %s)\n",
-                       config->quarantine_suffix,
-                       VIRUSFILTER_DEFAULT_QUARANTINE_SUFFIX);
-               config->quarantine_suffix =
-                       VIRUSFILTER_DEFAULT_QUARANTINE_SUFFIX;
+       if (config->quarantine_prefix != NULL) {
+               sret = strstr(config->quarantine_prefix, "/");
+               if (sret != NULL) {
+                       DBG_ERR("quarantine prefix must not contain directory "
+                               "delimiter(s) such as '/' (%s replaced with %s)\n",
+                               config->quarantine_prefix,
+                               VIRUSFILTER_DEFAULT_QUARANTINE_PREFIX);
+                       config->quarantine_prefix =
+                               VIRUSFILTER_DEFAULT_QUARANTINE_PREFIX;
+               }
+       }
+       if (config->quarantine_suffix != NULL) {
+               sret = strstr(config->quarantine_suffix, "/");
+               if (sret != NULL) {
+                       DBG_ERR("quarantine suffix must not contain directory "
+                               "delimiter(s) such as '/' (%s replaced with %s)\n",
+                               config->quarantine_suffix,
+                               VIRUSFILTER_DEFAULT_QUARANTINE_SUFFIX);
+                       config->quarantine_suffix =
+                               VIRUSFILTER_DEFAULT_QUARANTINE_SUFFIX;
+               }
        }
 
        config->quarantine_keep_tree = lp_parm_bool(
@@ -358,42 +376,50 @@ static int virusfilter_vfs_connect(
        rename_prefix = lp_parm_const_string(
                snum, "virusfilter", "rename prefix",
                VIRUSFILTER_DEFAULT_RENAME_PREFIX);
-       config->rename_prefix = talloc_strdup(config, rename_prefix);
-       if (config->rename_prefix == NULL) {
-               DBG_ERR("virusfilter-vfs: out of memory!\n");
-               return -1;
+       if (rename_prefix != NULL) {
+               config->rename_prefix = talloc_strdup(config, rename_prefix);
+               if (config->rename_prefix == NULL) {
+                       DBG_ERR("virusfilter-vfs: out of memory!\n");
+                       return -1;
+               }
        }
 
        rename_suffix = lp_parm_const_string(
                snum, "virusfilter", "rename suffix",
                VIRUSFILTER_DEFAULT_RENAME_SUFFIX);
-       config->rename_suffix = talloc_strdup(config, rename_suffix);
-       if (config->rename_suffix == NULL) {
-               DBG_ERR("virusfilter-vfs: out of memory!\n");
-               return -1;
+       if (rename_suffix != NULL) {
+               config->rename_suffix = talloc_strdup(config, rename_suffix);
+               if (config->rename_suffix == NULL) {
+                       DBG_ERR("virusfilter-vfs: out of memory!\n");
+                       return -1;
+               }
        }
 
        /*
         * Make sure prefixes and suffixes do not contain directory
         * delimiters
         */
-       sret = strstr(config->rename_prefix, "/");
-       if (sret != NULL) {
-               DBG_ERR("rename prefix must not contain directory "
-                       "delimiter(s) such as '/' (%s replaced with %s)\n",
-                       config->rename_prefix,
-                       VIRUSFILTER_DEFAULT_RENAME_PREFIX);
-               config->rename_prefix =
-                       VIRUSFILTER_DEFAULT_RENAME_PREFIX;
-       }
-       sret = strstr(config->rename_suffix, "/");
-       if (sret != NULL) {
-               DBG_ERR("rename suffix must not contain directory "
-                       "delimiter(s) such as '/' (%s replaced with %s)\n",
-                       config->rename_suffix,
-                       VIRUSFILTER_DEFAULT_RENAME_SUFFIX);
-               config->rename_suffix =
-                       VIRUSFILTER_DEFAULT_RENAME_SUFFIX;
+       if (config->rename_prefix != NULL) {
+               sret = strstr(config->rename_prefix, "/");
+               if (sret != NULL) {
+                       DBG_ERR("rename prefix must not contain directory "
+                               "delimiter(s) such as '/' (%s replaced with %s)\n",
+                               config->rename_prefix,
+                               VIRUSFILTER_DEFAULT_RENAME_PREFIX);
+                       config->rename_prefix =
+                               VIRUSFILTER_DEFAULT_RENAME_PREFIX;
+               }
+       }
+       if (config->rename_suffix != NULL) {
+               sret = strstr(config->rename_suffix, "/");
+               if (sret != NULL) {
+                       DBG_ERR("rename suffix must not contain directory "
+                               "delimiter(s) such as '/' (%s replaced with %s)\n",
+                               config->rename_suffix,
+                               VIRUSFILTER_DEFAULT_RENAME_SUFFIX);
+                       config->rename_suffix =
+                               VIRUSFILTER_DEFAULT_RENAME_SUFFIX;
+               }
        }
 
        config->infected_open_errno = lp_parm_int(
@@ -410,10 +436,12 @@ static int virusfilter_vfs_connect(
 
        socket_path = lp_parm_const_string(
                snum, "virusfilter", "socket path", NULL);
-       config->socket_path = talloc_strdup(config, socket_path);
-       if (config->socket_path == NULL) {
-               DBG_ERR("virusfilter-vfs: out of memory!\n");
-               return -1;
+       if (socket_path != NULL) {
+               config->socket_path = talloc_strdup(config, socket_path);
+               if (config->socket_path == NULL) {
+                       DBG_ERR("virusfilter-vfs: out of memory!\n");
+                       return -1;
+               }
        }
 
        /* canonicalize socket_path */