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