Restructuring of code to fix #5460. Remove search
authorJeremy Allison <jra@samba.org>
Mon, 19 May 2008 20:11:27 +0000 (13:11 -0700)
committerJeremy Allison <jra@samba.org>
Mon, 19 May 2008 20:11:27 +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.

source/smbd/conn.c
source/smbd/msdfs.c

index 97861edba5b7bde361be39e09aefa5c278929b28..c5a2df47739e15a4fa0a880f09b55615e36fbd43 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 eaa66efffcdb035afc1b78dbcc03cda72ec0228d..f0dd900be8dddc54323225b959e4d2fab50c4387 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));
 
@@ -621,7 +628,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);
@@ -662,17 +669,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)) {
@@ -758,7 +754,7 @@ NTSTATUS get_referred_path(TALLOC_CTX *ctx,
        ZERO_STRUCT(conns);
        *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;
        }
@@ -1244,7 +1240,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;
        }