The branch, v3-6-test has been updated
       via  0ace3ca Part 2 of fix for bug #8998 - Notify code can miss a ChDir.
       via  2b92491 Part 1 of fix for bug #8998 - Notify code can miss a ChDir.
      from  6330936 Fix bug #8922.

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


- Log -----------------------------------------------------------------
commit 0ace3ca03df76a1c22e112ea41d491f90afc0f94
Author: Volker Lendecke <volker.lende...@sernet.de>
Date:   Thu Jun 14 11:26:44 2012 -0700

    Part 2 of fix for bug #8998 - Notify code can miss a ChDir.
    
    Do a ChDir for notify_onelevel.

commit 2b92491ba7cc5fd541e3f8988ecf831c3949fb00
Author: Volker Lendecke <volker.lende...@sernet.de>
Date:   Thu Jun 14 11:24:01 2012 -0700

    Part 1 of fix for bug #8998 - Notify code can miss a ChDir.
    
    Factor out notify_parent_dir.

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

Summary of changes:
 source3/smbd/notify.c |   52 +++++++++++++++++++++++++++++++++++-------------
 1 files changed, 38 insertions(+), 14 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/smbd/notify.c b/source3/smbd/notify.c
index 24385c9..d9a28eb 100644
--- a/source3/smbd/notify.c
+++ b/source3/smbd/notify.c
@@ -345,28 +345,52 @@ void 
remove_pending_change_notify_requests_by_fid(files_struct *fsp,
        }
 }
 
-void notify_fname(connection_struct *conn, uint32 action, uint32 filter,
-                 const char *path)
+static void notify_parent_dir(connection_struct *conn,
+                             uint32 action, uint32 filter,
+                             const char *path)
 {
-       char *fullpath;
+       struct smb_filename smb_fname_parent;
        char *parent;
        const char *name;
+       char *oldwd;
 
-       if (path[0] == '.' && path[1] == '/') {
-               path += 2;
+       if (!parent_dirname(talloc_tos(), path, &parent, &name)) {
+               return;
        }
-       if (parent_dirname(talloc_tos(), path, &parent, &name)) {
-               struct smb_filename smb_fname_parent;
 
-               ZERO_STRUCT(smb_fname_parent);
-               smb_fname_parent.base_name = parent;
+       ZERO_STRUCT(smb_fname_parent);
+       smb_fname_parent.base_name = parent;
 
-               if (SMB_VFS_STAT(conn, &smb_fname_parent) != -1) {
-                       notify_onelevel(conn->notify_ctx, action, filter,
-                           SMB_VFS_FILE_ID_CREATE(conn, &smb_fname_parent.st),
-                           name);
-               }
+       oldwd = vfs_GetWd(parent, conn);
+       if (oldwd == NULL) {
+               goto done;
+       }
+       if (vfs_ChDir(conn, conn->connectpath) == -1) {
+               goto done;
+       }
+
+       if (SMB_VFS_STAT(conn, &smb_fname_parent) == -1) {
+               goto chdir_done;
+       }
+
+       notify_onelevel(conn->notify_ctx, action, filter,
+                       SMB_VFS_FILE_ID_CREATE(conn, &smb_fname_parent.st),
+                       name);
+chdir_done:
+       vfs_ChDir(conn, oldwd);
+done:
+       TALLOC_FREE(parent);
+}
+
+void notify_fname(connection_struct *conn, uint32 action, uint32 filter,
+                 const char *path)
+{
+       char *fullpath;
+
+       if (path[0] == '.' && path[1] == '/') {
+               path += 2;
        }
+       notify_parent_dir(conn, action, filter, path);
 
        fullpath = talloc_asprintf(talloc_tos(), "%s/%s", conn->connectpath,
                                   path);


-- 
Samba Shared Repository

Reply via email to