diff options
author | Jeremy Allison <jra@samba.org> | 2007-07-06 21:46:43 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 12:23:50 -0500 |
commit | 10c83ace04f675eb88e9686725795b0e965510e8 (patch) | |
tree | 3f233330fc98aa1ef5cfd8bfc1fb7c4aba701062 /source3 | |
parent | c05cbbe41c7512e67fd23f91ad15a9222a4954a6 (diff) | |
download | samba-10c83ace04f675eb88e9686725795b0e965510e8.tar.gz samba-10c83ace04f675eb88e9686725795b0e965510e8.tar.bz2 samba-10c83ace04f675eb88e9686725795b0e965510e8.zip |
r23735: Second part of the bugfix for #4763
This should coalesce identical adjacent notify records - making the "too large"
bug very rare indeed. Please test.
Jeremy.
(This used to be commit 1aaa1f5bbe9222acbe3dea1daa1c6c5ce72e1c2c)
Diffstat (limited to 'source3')
-rw-r--r-- | source3/smbd/notify.c | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/source3/smbd/notify.c b/source3/smbd/notify.c index 746a8f47e5..cbafeccd94 100644 --- a/source3/smbd/notify.c +++ b/source3/smbd/notify.c @@ -50,6 +50,17 @@ struct notify_mid_map { uint16 mid; }; +static BOOL notify_change_record_identical(struct notify_change *c1, + struct notify_change *c2) +{ + /* Note this is deliberately case sensitive. */ + if (c1->action == c2->action && + strcmp(c1->name, c2->name) == 0) { + return True; + } + return False; +} + static BOOL notify_marshall_changes(int num_changes, struct notify_change *changes, prs_struct *ps) @@ -58,11 +69,20 @@ static BOOL notify_marshall_changes(int num_changes, UNISTR uni_name; for (i=0; i<num_changes; i++) { - struct notify_change *c = &changes[i]; + struct notify_change *c; size_t namelen; uint32 u32_tmp; /* Temp arg to prs_uint32 to avoid * signed/unsigned issues */ + /* Coalesce any identical records. */ + while (i+1 < num_changes && + notify_change_record_identical(&changes[i], + &changes[i+1])) { + i++; + } + + c = &changes[i]; + namelen = convert_string_allocate( NULL, CH_UNIX, CH_UTF16LE, c->name, strlen(c->name)+1, &uni_name.buffer, True); |