summaryrefslogtreecommitdiff
path: root/source3
diff options
context:
space:
mode:
authorSimo Sorce <idra@samba.org>2009-09-05 10:18:12 -0400
committerSimo Sorce <idra@samba.org>2009-09-05 12:49:26 -0400
commitaffed02ef67b495e8785a56545d15eff96d7a749 (patch)
tree18d2e389dd4e4160d9f282023f59c0a6939cf88e /source3
parentbc081cf0cc41ad8da24cc60c27ab7c7931d60c55 (diff)
downloadsamba-affed02ef67b495e8785a56545d15eff96d7a749.tar.gz
samba-affed02ef67b495e8785a56545d15eff96d7a749.tar.bz2
samba-affed02ef67b495e8785a56545d15eff96d7a749.zip
Check we read off the compelte event from inotify
The kernel may return a short read, so we must use read_data() to make sure we read off the full buffer. If somethign bad happens we also need to kill the inotify watch because the filedescriptor will return out of sync structures if we read only part of the data.
Diffstat (limited to 'source3')
-rw-r--r--source3/smbd/notify_inotify.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/source3/smbd/notify_inotify.c b/source3/smbd/notify_inotify.c
index 26570a2216..61599456c6 100644
--- a/source3/smbd/notify_inotify.c
+++ b/source3/smbd/notify_inotify.c
@@ -232,6 +232,7 @@ static void inotify_handler(struct event_context *ev, struct fd_event *fde,
int bufsize = 0;
struct inotify_event *e0, *e;
uint32_t prev_cookie=0;
+ NTSTATUS status;
/*
we must use FIONREAD as we cannot predict the length of the
@@ -248,9 +249,14 @@ static void inotify_handler(struct event_context *ev, struct fd_event *fde,
e0 = e = (struct inotify_event *)TALLOC_SIZE(in, bufsize);
if (e == NULL) return;
- if (sys_read(in->fd, e0, bufsize) != bufsize) {
- DEBUG(0,("Failed to read all inotify data\n"));
+ status = read_data(in->fd, (char *)e0, bufsize);
+ if (!NT_STATUS_IS_OK(status)) {
+ DEBUG(0,("Failed to read all inotify data - %s\n",
+ nt_errstr(status)));
talloc_free(e0);
+ /* the inotify fd will now be out of sync,
+ * can't keep reading data off it */
+ TALLOC_FREE(fde);
return;
}