From 3d76007f84194f7da2cc4c063aa1d6c47a002832 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Thu, 14 Jun 2012 11:24:01 -0700 Subject: [PATCH] Part 1 of fix for bug #8998 - Notify code can miss a ChDir. Factor out notify_parent_dir. (cherry picked from commit 2b92491ba7cc5fd541e3f8988ecf831c3949fb00) --- source3/smbd/notify.c | 40 ++++++++++++++++++++++++++-------------- 1 file changed, 26 insertions(+), 14 deletions(-) diff --git a/source3/smbd/notify.c b/source3/smbd/notify.c index 24385c94a0d..436a3543901 100644 --- a/source3/smbd/notify.c +++ b/source3/smbd/notify.c @@ -345,28 +345,40 @@ 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; - 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); - } + if (SMB_VFS_STAT(conn, &smb_fname_parent) == -1) { + goto done; + } + notify_onelevel(conn->notify_ctx, action, filter, + SMB_VFS_FILE_ID_CREATE(conn, &smb_fname_parent.st), + name); +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); -- 2.11.4.GIT