svn commit: samba r2152 - in branches/SAMBA_3_0/source/smbd: .

jra at samba.org jra at samba.org
Tue Aug 31 22:52:05 GMT 2004


Author: jra
Date: 2004-08-31 22:52:05 +0000 (Tue, 31 Aug 2004)
New Revision: 2152

WebSVN: http://websvn.samba.org/websvn/changeset.php?rep=samba&path=/branches/SAMBA_3_0/source/smbd&rev=2152&nolog=1

Log:
Fix for bug #1674, move the symlinks checks into reduce_name().
Jeremy.

Modified:
   branches/SAMBA_3_0/source/smbd/filename.c
   branches/SAMBA_3_0/source/smbd/vfs.c


Changeset:
Modified: branches/SAMBA_3_0/source/smbd/filename.c
===================================================================
--- branches/SAMBA_3_0/source/smbd/filename.c	2004-08-31 21:34:14 UTC (rev 2151)
+++ branches/SAMBA_3_0/source/smbd/filename.c	2004-08-31 22:52:05 UTC (rev 2152)
@@ -414,26 +414,10 @@
 		}
 	}
 
-	if (!lp_widelinks(SNUM(conn))) {
+	if (!lp_widelinks(SNUM(conn)) || !lp_symlinks(SNUM(conn))) {
 		ret = reduce_name(conn,name);
 	}
 
-	/* Check if we are allowing users to follow symlinks */
-	/* Patch from David Clerc <David.Clerc at cui.unige.ch>
-		University of Geneva */
-
-#ifdef S_ISLNK
-	if (!lp_symlinks(SNUM(conn))) {
-		SMB_STRUCT_STAT statbuf;
-		if ( (SMB_VFS_LSTAT(conn,name,&statbuf) != -1) &&
-				(S_ISLNK(statbuf.st_mode)) ) {
-			DEBUG(3,("check_name: denied: file path name %s is a symlink\n",name));
-			errno = EACCES;
-			ret = False; 
-		}
-	}
-#endif
-
 	if (!ret) {
 		DEBUG(5,("check_name on %s failed\n",name));
 	}

Modified: branches/SAMBA_3_0/source/smbd/vfs.c
===================================================================
--- branches/SAMBA_3_0/source/smbd/vfs.c	2004-08-31 21:34:14 UTC (rev 2151)
+++ branches/SAMBA_3_0/source/smbd/vfs.c	2004-08-31 22:52:05 UTC (rev 2152)
@@ -909,7 +909,8 @@
 		return False;
 	}
 
-	if (strncmp(conn->connectpath, resolved_name, con_path_len) != 0) {
+	/* Check for widelinks allowed. */
+	if (!lp_widelinks(SNUM(conn)) && (strncmp(conn->connectpath, resolved_name, con_path_len) != 0)) {
 		DEBUG(2, ("reduce_name: Bad access attempt: %s is a symlink outside the share path", fname));
 		if (free_resolved_name)
 			SAFE_FREE(resolved_name);
@@ -917,29 +918,24 @@
 		return False;
 	}
 
-	/* Move path the connect path to the last part of the filename. */
-	p = resolved_name + con_path_len;
-	if (*p == '/') {
-		p++;
-	}
+        /* Check if we are allowing users to follow symlinks */
+        /* Patch from David Clerc <David.Clerc at cui.unige.ch>
+                University of Geneva */
+                                                                                                                                                    
+#ifdef S_ISLNK
+        if (!lp_symlinks(SNUM(conn))) {
+                SMB_STRUCT_STAT statbuf;
+                if ( (SMB_VFS_LSTAT(conn,fname,&statbuf) != -1) &&
+                                (S_ISLNK(statbuf.st_mode)) ) {
+			if (free_resolved_name)
+				SAFE_FREE(resolved_name);
+                        DEBUG(3,("reduce_name: denied: file path name %s is a symlink\n",resolved_name));
+                        errno = EACCES;
+			return False;
+                }
+        }
+#endif
 
-	if (!*p) {
-		if (fname[0] == '.' && fname[1] == '/' && fname[2] == '\0') {
-			pstrcpy(resolved_name, "./");
-		} else {
-			pstrcpy(resolved_name, ".");
-		}
-		p = resolved_name;
-	}
-
-	if (!lp_symlinks(SNUM(conn)) && (strcmp(fname, p)!=0)) {
-		DEBUG(3,("reduce_name: denied: file path name %s is a symlink\n",fname));
-		if (free_resolved_name)
-			SAFE_FREE(resolved_name);
-		errno = EACCES;
-		return False;
-	}
-
 	DEBUG(3,("reduce_name: %s reduced to %s\n", fname, p));
 	if (free_resolved_name)
 		SAFE_FREE(resolved_name);



More information about the samba-cvs mailing list