The branch, v3-6-test has been updated
       via  127691c Don't use asprintf in this library - breaks the build on 
many systems. Fake with malloc/memcpy. (cherry picked from commit 
8d0c16a68bac7c75b4b637c6d6e3377c5461e5d4)
       via  bd01d86 Move to opening an fd on directory opens. Get more careful 
about symlink races.
       via  bf48da1 Remove unneeded stat call.
       via  3691538 tevent: Fix typos
       via  f35ecd0 dlinklist: Change license to LGPLv3+ (checked with 
tridge).(cherry picked from commit d2740976cde8b875c91cff311a688e8a10e4bf30)
      from  2dd37f6 s3-rpc_server: We need a messaging context for rpc.

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=v3-6-test


- Log -----------------------------------------------------------------
commit 127691c1b76e9be52b7cf016a2b7f26961ad0d8a
Author: Jeremy Allison <j...@samba.org>
Date:   Wed Feb 9 10:28:08 2011 -0800

    Don't use asprintf in this library - breaks the build on many systems. Fake 
with malloc/memcpy.
    (cherry picked from commit 8d0c16a68bac7c75b4b637c6d6e3377c5461e5d4)

commit bd01d8638f49714541913922a22e39af66068e8e
Author: Jeremy Allison <j...@samba.org>
Date:   Tue Feb 8 17:04:19 2011 -0800

    Move to opening an fd on directory opens. Get more careful about symlink 
races.

commit bf48da1c6c4fc67fd8db9277594e4edd34f7deb0
Author: Jeremy Allison <j...@samba.org>
Date:   Tue Feb 8 16:51:17 2011 -0800

    Remove unneeded stat call.

commit 36915388da90b4e5f71ba40936c34391a8c16a83
Author: Volker Lendecke <v...@samba.org>
Date:   Wed Feb 9 15:50:34 2011 +0100

    tevent: Fix typos
    
    Autobuild-User: Volker Lendecke <vlen...@samba.org>
    Autobuild-Date: Wed Feb  9 18:13:18 CET 2011 on sn-devel-104
    (cherry picked from commit dcd6764dad7ec636201faf724b011cf03edd4beb)

commit f35ecd0986704850a18a500ce6636266c5010528
Author: Jelmer Vernooij <jel...@samba.org>
Date:   Sun Jan 30 10:59:14 2011 +0100

    dlinklist: Change license to LGPLv3+ (checked with tridge).(cherry picked 
from commit d2740976cde8b875c91cff311a688e8a10e4bf30)

-----------------------------------------------------------------------

Summary of changes:
 lib/tevent/tevent_timed.c           |    4 +-
 source3/libsmb/smb_share_modes.c    |   11 +++++--
 source3/smbd/open.c                 |   51 ++++++++++++++++++++++++++++-------
 source4/lib/ldb/include/dlinklist.h |   26 ++++++++++-------
 4 files changed, 66 insertions(+), 26 deletions(-)


Changeset truncated at 500 lines:

diff --git a/lib/tevent/tevent_timed.c b/lib/tevent/tevent_timed.c
index cc51bf6..f7c3969 100644
--- a/lib/tevent/tevent_timed.c
+++ b/lib/tevent/tevent_timed.c
@@ -197,7 +197,7 @@ struct tevent_timer *tevent_common_add_timer(struct 
tevent_context *ev, TALLOC_C
 /*
   do a single event loop using the events defined in ev
 
-  return the delay untill the next timed event,
+  return the delay until the next timed event,
   or zero if a timed event was triggered
 */
 struct timeval tevent_common_loop_timer_delay(struct tevent_context *ev)
@@ -208,7 +208,7 @@ struct timeval tevent_common_loop_timer_delay(struct 
tevent_context *ev)
        if (!te) {
                /* have a default tick time of 30 seconds. This guarantees
                   that code that uses its own timeout checking will be
-                  able to proceeed eventually */
+                  able to proceed eventually */
                return tevent_timeval_set(30, 0);
        }
 
diff --git a/source3/libsmb/smb_share_modes.c b/source3/libsmb/smb_share_modes.c
index 3174500..e752f61 100644
--- a/source3/libsmb/smb_share_modes.c
+++ b/source3/libsmb/smb_share_modes.c
@@ -267,15 +267,20 @@ static uint32_t smb_name_hash(const char *sharepath, 
const char *filename, int *
 {
        TDB_DATA key;
        char *fullpath = NULL;
-       int ret;
+       size_t sharepath_size = strlen(sharepath);
+       size_t filename_size = strlen(filename);
        uint32_t name_hash;
 
        *err = 0;
-       ret = asprintf(&fullpath, "%s/%s", sharepath, filename);
-       if (ret == -1) {
+       fullpath = malloc(sharepath_size + filename_size + 2);
+       if (fullpath == NULL) {
                *err = 1;
                return 0;
        }
+       memcpy(fullpath, sharepath, sharepath_size);
+       fullpath[sharepath_size] = '/';
+       memcpy(&fullpath[sharepath_size + 1], filename, filename_size + 1);
+
        key.dptr = (uint8_t *)fullpath;
        key.dsize = strlen(fullpath) + 1;
        name_hash = tdb_jenkins_hash(&key);
diff --git a/source3/smbd/open.c b/source3/smbd/open.c
index a9a12ea..89d1375 100644
--- a/source3/smbd/open.c
+++ b/source3/smbd/open.c
@@ -2525,6 +2525,22 @@ static NTSTATUS mkdir_internal(connection_struct *conn,
 }
 
 /****************************************************************************
+ Ensure we didn't get symlink raced on opening a directory.
+****************************************************************************/
+
+static bool check_same_stat(const SMB_STRUCT_STAT *sbuf1,
+                       const SMB_STRUCT_STAT *sbuf2)
+{
+       if (sbuf1->st_ex_uid != sbuf2->st_ex_uid ||
+                       sbuf1->st_ex_gid != sbuf2->st_ex_gid ||
+                       sbuf1->st_ex_dev != sbuf2->st_ex_dev ||
+                       sbuf1->st_ex_ino != sbuf2->st_ex_ino) {
+               return false;
+       }
+       return true;
+}
+
+/****************************************************************************
  Open a directory from an NT SMB call.
 ****************************************************************************/
 
@@ -2591,16 +2607,11 @@ static NTSTATUS open_directory(connection_struct *conn,
        switch( create_disposition ) {
                case FILE_OPEN:
 
-                       info = FILE_WAS_OPENED;
-
-                       /*
-                        * We want to follow symlinks here.
-                        */
-
-                       if (SMB_VFS_STAT(conn, smb_dname) != 0) {
-                               return map_nt_error_from_unix(errno);
+                       if (!dir_existed) {
+                               return NT_STATUS_OBJECT_NAME_NOT_FOUND;
                        }
-                               
+
+                       info = FILE_WAS_OPENED;
                        break;
 
                case FILE_CREATE:
@@ -2731,6 +2742,10 @@ static NTSTATUS open_directory(connection_struct *conn,
 
 #ifdef O_DIRECTORY
        status = fd_open(conn, fsp, O_RDONLY|O_DIRECTORY, 0);
+#else
+       /* POSIX allows us to open a directory with O_RDONLY. */
+       status = fd_open(conn, fsp, O_RDONLY, 0);
+#endif
        if (!NT_STATUS_IS_OK(status)) {
                DEBUG(5, ("open_directory: Could not open fd for "
                        "%s (%s)\n",
@@ -2739,7 +2754,23 @@ static NTSTATUS open_directory(connection_struct *conn,
                file_free(req, fsp);
                return status;
        }
-#endif
+
+       status = vfs_stat_fsp(fsp);
+       if (NT_STATUS_IS_OK(status)) {
+               fd_close(fsp);
+               file_free(req, fsp);
+               return status;
+       }
+
+       /* Ensure there was no race condition. */
+       if (!check_same_stat(&smb_dname->st, &fsp->fsp_name->st)) {
+               DEBUG(5,("open_directory: stat struct differs for "
+                       "directory %s.\n",
+                       smb_fname_str_dbg(smb_dname)));
+               fd_close(fsp);
+               file_free(req, fsp);
+               return NT_STATUS_ACCESS_DENIED;
+       }
 
        lck = get_share_mode_lock(talloc_tos(), fsp->file_id,
                                  conn->connectpath, smb_dname, &mtimespec);
diff --git a/source4/lib/ldb/include/dlinklist.h 
b/source4/lib/ldb/include/dlinklist.h
index 6d525f9..1c577bb 100644
--- a/source4/lib/ldb/include/dlinklist.h
+++ b/source4/lib/ldb/include/dlinklist.h
@@ -3,19 +3,23 @@
    some simple double linked list macros
 
    Copyright (C) Andrew Tridgell 1998-2010
+
+     ** NOTE! The following LGPL license applies to the ldb
+     ** library. This does NOT imply that all of Samba is released
+     ** under the LGPL
    
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
-   
-   This program is distributed in the hope that it will be useful,
+   This library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 3 of the License, or (at your option) any later version.
+
+   This library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-   
-   You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with this library; if not, see <http://www.gnu.org/licenses/>.
 */
 
 /* To use these macros you must have a structure containing a next and


-- 
Samba Shared Repository

Reply via email to