Restructuring of code to fix #5460. Remove search
authorJeremy Allison <jra@samba.org>
Mon, 19 May 2008 20:11:00 +0000 (13:11 -0700)
committerJeremy Allison <jra@samba.org>
Mon, 19 May 2008 20:11:00 +0000 (13:11 -0700)
by name code from conn, we were already doing the
same check in the dfs_redirect() function, so move
it into parse_dfs_path() instead.
Jeremy.
(This used to be commit 8a7c6df122c5e4a1d0f74ab0f1bc9376a0a8bcb1)

source3/smbd/conn.c
source3/smbd/msdfs.c

index 159b232b5faf19b230fc6e55e590635f050fff6a..5c75ed719e1dc36374c949790a11876bc81bf3e6 100644 (file)
@@ -84,28 +84,6 @@ connection_struct *conn_find(unsigned cnum)
        return NULL;
 }
 
-/****************************************************************************
- Find a conn given a service name.
-****************************************************************************/
-
-connection_struct *conn_find_byname(const char *service)
-{
-       connection_struct *conn;
-
-       for (conn=Connections;conn;conn=conn->next) {
-               if (strequal(lp_servicename(SNUM(conn)),service)) {
-                       if (conn != Connections) {
-                               /* Promote if not first. */
-                               DLIST_PROMOTE(Connections, conn);
-                       }
-                       return conn;
-               }
-       }
-
-       return NULL;
-}
-
-
 /****************************************************************************
   find first available connection slot, starting from a random position.
 The randomisation stops problems with the server dieing and clients
index 04b9b7deaaa8fc38bc1b2691610735e720d45622..e4760ec4619ec7379ef4244ee3f97bfa115a3de4 100644 (file)
@@ -36,13 +36,17 @@ extern uint32 global_client_caps;
  SVAL(inbuf,smb_flg2) & FLAGS2_DFS_PATHNAMES bit and then
  send a local path, we have to cope with that too....
 
+ If conn != NULL then ensure the provided service is
+ the one pointed to by the connection.
+
  This version does everything using pointers within one copy of the
  pathname string, talloced on the struct dfs_path pointer (which
  must be talloced). This may be too clever to live....
  JRA.
 **********************************************************************/
 
-static NTSTATUS parse_dfs_path(const char *pathname,
+static NTSTATUS parse_dfs_path(connection_struct *conn,
+                               const char *pathname,
                                bool allow_wcards,
                                struct dfs_path *pdp, /* MUST BE TALLOCED */
                                bool *ppath_contains_wcard)
@@ -136,7 +140,10 @@ static NTSTATUS parse_dfs_path(const char *pathname,
        }
 
        /* Is this really our servicename ? */
-       if (NULL == conn_find_byname(servicename)) {
+       if (conn && !( strequal(servicename, lp_servicename(SNUM(conn)))
+                       || (strequal(servicename, HOMES_NAME)
+                       && strequal(lp_servicename(SNUM(conn)),
+                               get_current_username()) )) ) {
                DEBUG(10,("parse_dfs_path: %s is not our servicename\n",
                        servicename));
 
@@ -624,7 +631,7 @@ static NTSTATUS dfs_redirect(TALLOC_CTX *ctx,
                return NT_STATUS_NO_MEMORY;
        }
 
-       status = parse_dfs_path(path_in, search_wcard_flag, pdp,
+       status = parse_dfs_path(conn, path_in, search_wcard_flag, pdp,
                        ppath_contains_wcard);
        if (!NT_STATUS_IS_OK(status)) {
                TALLOC_FREE(pdp);
@@ -665,17 +672,6 @@ static NTSTATUS dfs_redirect(TALLOC_CTX *ctx,
                return NT_STATUS_OK;
        }
 
-       if (!( strequal(pdp->servicename, lp_servicename(SNUM(conn)))
-                       || (strequal(pdp->servicename, HOMES_NAME)
-                       && strequal(lp_servicename(SNUM(conn)),
-                               get_current_username()) )) ) {
-
-               /* The given sharename doesn't match this connection. */
-               TALLOC_FREE(pdp);
-
-               return NT_STATUS_OBJECT_PATH_NOT_FOUND;
-       }
-
        status = dfs_path_lookup(ctx, conn, path_in, pdp,
                        search_wcard_flag, NULL, NULL);
        if (!NT_STATUS_IS_OK(status)) {
@@ -759,7 +755,7 @@ NTSTATUS get_referred_path(TALLOC_CTX *ctx,
 
        *self_referralp = False;
 
-       status = parse_dfs_path(dfs_path, False, pdp, &dummy);
+       status = parse_dfs_path(NULL, dfs_path, False, pdp, &dummy);
        if (!NT_STATUS_IS_OK(status)) {
                return status;
        }
@@ -1245,7 +1241,7 @@ bool create_junction(TALLOC_CTX *ctx,
        if (!pdp) {
                return False;
        }
-       status = parse_dfs_path(dfs_path, False, pdp, &dummy);
+       status = parse_dfs_path(NULL, dfs_path, False, pdp, &dummy);
        if (!NT_STATUS_IS_OK(status)) {
                return False;
        }