Fixes issue with preexec scripts creating a share directory, and problems if a smb...
authorJeremy Allison <jra@samba.org>
Fri, 12 Feb 2010 00:09:59 +0000 (16:09 -0800)
committerKarolin Seeger <kseeger@samba.org>
Wed, 24 Feb 2010 15:25:10 +0000 (16:25 +0100)
Includes git refs :
cd18695fc2e4d09ab75e9eab2f0c43dcc15adf0b
94865e4dbd3d721c9855aada8c55e02be8b3881e
5d92d969dda450cc3564dd2265d2b042d832c542
02a5078f1fe6285e4a0b6ad95a3aea1c5bb3e8cf
a6f402ad87ff0ae14d57d97278d67d0ceaaa1d82

from master.

Jeremy.

Fix bug #7104 ("wide links" and "unix extensions" are incompatible.)
(cherry picked from commit ce04bf60499104c166657df959e4033573b5be5c)

source/include/proto.h
source/param/loadparm.c
source/smbd/service.c

index 8dbab9ae118b73f96427a0213f522a2d310d922e..8fdd454eeb326bf27e977791eac4034a4f613047 100644 (file)
@@ -6073,6 +6073,7 @@ void lp_set_posix_pathnames(void);
 enum brl_flavour lp_posix_cifsu_locktype(files_struct *fsp);
 void lp_set_posix_default_cifsx_readwrite_locktype(enum brl_flavour val);
 int lp_min_receive_file_size(void);
+void widelinks_warning(int snum);
 
 /* The following definitions come from param/params.c  */
 
index 6e8a5b7e6a10bf56b036abde075bf964aa6c90ff..ce1e6b639e055d5a37cf890e2d45840bbd92367d 100644 (file)
@@ -5315,7 +5315,6 @@ FN_LOCAL_BOOL(lp_oplocks, bOpLocks)
 FN_LOCAL_BOOL(lp_level2_oplocks, bLevel2OpLocks)
 FN_LOCAL_BOOL(lp_onlyuser, bOnlyUser)
 FN_LOCAL_PARM_BOOL(lp_manglednames, bMangledNames)
-FN_LOCAL_BOOL(lp_widelinks, bWidelinks)
 FN_LOCAL_BOOL(lp_symlinks, bSymlinks)
 FN_LOCAL_BOOL(lp_syncalways, bSyncAlways)
 FN_LOCAL_BOOL(lp_strict_allocate, bStrictAllocate)
@@ -9563,3 +9562,35 @@ const char *lp_socket_address(void)
        }
        return  Globals.szSocketAddress;
 }
+
+/*******************************************************************
+ Safe wide links checks.
+ This helper function always verify the validity of wide links,
+ even after a configuration file reload.
+********************************************************************/
+
+static bool lp_widelinks_internal(int snum)
+{
+       return (bool)(LP_SNUM_OK(snum)? ServicePtrs[(snum)]->bWidelinks :
+                       sDefault.bWidelinks);
+}
+
+void widelinks_warning(int snum)
+{
+       if (lp_unix_extensions() && lp_widelinks_internal(snum)) {
+               DEBUG(0,("Share '%s' has wide links and unix extensions enabled. "
+                       "These parameters are incompatible. "
+                       "Wide links will be disabled for this share.\n",
+                       lp_servicename(snum) ));
+       }
+}
+
+bool lp_widelinks(int snum)
+{
+       /* wide links is always incompatible with unix extensions */
+       if (lp_unix_extensions()) {
+               return false;
+       }
+
+       return lp_widelinks_internal(snum);
+}
index 481f8470dfd99f01639c26ec81ee0ec8442a5cc8..7ba1043c7bc6e09326e29d1995827dead3fec759 100644 (file)
@@ -921,25 +921,6 @@ static connection_struct *make_connection_snum(int snum, user_struct *vuser,
                return NULL;
        }
 
-       /*
-        * If widelinks are disallowed we need to canonicalise the connect
-        * path here to ensure we don't have any symlinks in the
-        * connectpath. We will be checking all paths on this connection are
-        * below this directory. We must do this after the VFS init as we
-        * depend on the realpath() pointer in the vfs table. JRA.
-        */
-       if (!lp_widelinks(snum)) {
-               if (!canonicalize_connect_path(conn)) {
-                       DEBUG(0, ("canonicalize_connect_path failed "
-                       "for service %s, path %s\n",
-                               lp_servicename(snum),
-                               conn->connectpath));
-                       conn_free(conn);
-                       *pstatus = NT_STATUS_BAD_NETWORK_NAME;
-                       return NULL;
-               }
-       }
-
        if ((!conn->printer) && (!conn->ipc)) {
                conn->notify_ctx = notify_init(conn, server_id_self(),
                                               smbd_messaging_context(),
@@ -947,7 +928,11 @@ static connection_struct *make_connection_snum(int snum, user_struct *vuser,
                                               conn);
        }
 
-/* ROOT Activities: */ 
+/* ROOT Activities: */
+       /* explicitly check widelinks here so that we can correctly warn
+        * in the logs. */
+       widelinks_warning(snum);
+
        /*
         * Enforce the max connections parameter.
         */
@@ -973,6 +958,18 @@ static connection_struct *make_connection_snum(int snum, user_struct *vuser,
                return NULL;
        }  
 
+       /*
+        * Fix compatibility issue pointed out by Volker.
+        * We pass the conn->connectpath to the preexec
+        * scripts as a parameter, so attempt to canonicalize
+        * it here before calling the preexec scripts.
+        * We ignore errors here, as it is possible that
+        * the conn->connectpath doesn't exist yet and
+        * the preexec scripts will create them.
+        */
+
+       (void)canonicalize_connect_path(conn);
+
        /* Preexecs are done here as they might make the dir we are to ChDir
         * to below */
        /* execute any "root preexec = " line */
@@ -1034,6 +1031,24 @@ static connection_struct *make_connection_snum(int snum, user_struct *vuser,
                }
        }
 
+       /*
+        * If widelinks are disallowed we need to canonicalise the connect
+        * path here to ensure we don't have any symlinks in the
+        * connectpath. We will be checking all paths on this connection are
+        * below this directory. We must do this after the VFS init as we
+        * depend on the realpath() pointer in the vfs table. JRA.
+        */
+       if (!lp_widelinks(snum)) {
+               if (!canonicalize_connect_path(conn)) {
+                       DEBUG(0, ("canonicalize_connect_path failed "
+                       "for service %s, path %s\n",
+                               lp_servicename(snum),
+                               conn->connectpath));
+                       *pstatus = NT_STATUS_BAD_NETWORK_NAME;
+                       goto err_root_exit;
+               }
+       }
+
 #ifdef WITH_FAKE_KASERVER
        if (lp_afs_share(snum)) {
                afs_login(conn);
@@ -1103,14 +1118,6 @@ static connection_struct *make_connection_snum(int snum, user_struct *vuser,
        }
 #endif
 
-       if (lp_unix_extensions() && lp_widelinks(snum)) {
-               DEBUG(0,("Share '%s' has wide links and unix extensions enabled. "
-                       "These parameters are incompatible. "
-                       "Disabling wide links for this share.\n",
-                       lp_servicename(snum) ));
-               lp_do_parameter(snum, "wide links", "False");
-       }
-
        /* Figure out the characteristics of the underlying filesystem. This
         * assumes that all the filesystem mounted withing a share path have
         * the same characteristics, which is likely but not guaranteed.