Fix bug 7104 - "wide links" and "unix extensions" are incompatible.
[samba.git] / source3 / smbd / service.c
index 6254d752a15feb4fe1aa1b1968c5325e8f64fb40..8039d16586eb164f576f4c4def3a919aac6feff1 100644 (file)
@@ -56,7 +56,12 @@ bool set_conn_connectpath(connection_struct *conn, const char *connectpath)
        const char *s = connectpath;
         bool start_of_name_component = true;
 
-       destname = SMB_STRDUP(connectpath);
+       if (connectpath == NULL || connectpath[0] == '\0') {
+               return false;
+       }
+
+       /* Allocate for strlen + '\0' + possible leading '/' */
+       destname = SMB_MALLOC(strlen(connectpath) + 2);
        if (!destname) {
                return false;
        }
@@ -259,7 +264,7 @@ int add_home_service(const char *service, const char *username, const char *home
 {
        int iHomeService;
 
-       if (!service || !homedir)
+       if (!service || !homedir || homedir[0] == '\0')
                return -1;
 
        if ((iHomeService = lp_servicenumber(HOMES_NAME)) < 0) {
@@ -1015,19 +1020,6 @@ connection_struct *make_connection_snum(struct smbd_server_connection *sconn,
                goto err_root_exit;
        }
 
-       if (smb_fname_cpath->st.st_ex_mtime.tv_nsec ||
-                       smb_fname_cpath->st.st_ex_atime.tv_nsec ||
-                       smb_fname_cpath->st.st_ex_ctime.tv_nsec) {
-               /* If any of the normal UNIX directory timestamps
-                * have a non-zero tv_nsec component assume
-                * we can fully store hires timestamps. We need
-                * to make a runtime/share level distinction
-                * as on Linux ext3 doesn't have hires timestamps, but
-                * ext4 does, so a compile time test won't work. JRA.
-                */
-               conn->hires_timestamps_avail = true;
-       }
-
        string_set(&conn->origpath,conn->connectpath);
 
 #if SOFTLINK_OPTIMISATION
@@ -1047,12 +1039,20 @@ connection_struct *make_connection_snum(struct smbd_server_connection *sconn,
        }
 #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.
         */
 
-       conn->fs_capabilities = SMB_VFS_FS_CAPABILITIES(conn);
+       conn->fs_capabilities = SMB_VFS_FS_CAPABILITIES(conn, &conn->ts_res);
 
        /*
         * Print out the 'connected as' stuff here as we need
@@ -1202,7 +1202,7 @@ connection_struct *make_connection(struct smbd_server_connection *sconn,
                        return NULL;
                }
 
-               DEBUG(0,("%s (%s) couldn't find service %s\n",
+               DEBUG(3,("%s (%s) couldn't find service %s\n",
                        get_remote_machine_name(),
                        client_addr(get_client_fd(),addr,sizeof(addr)),
                        service));