r23735: Second part of the bugfix for #4763
authorJeremy Allison <jra@samba.org>
Fri, 6 Jul 2007 21:46:43 +0000 (21:46 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 17:23:50 +0000 (12:23 -0500)
This should coalesce identical adjacent notify records - making the "too large"
bug very rare indeed. Please test.
Jeremy.
(This used to be commit 1aaa1f5bbe9222acbe3dea1daa1c6c5ce72e1c2c)

source3/smbd/notify.c

index 746a8f47e5c7ded825175bc56e4a97cc6d2aadfb..cbafeccd943521e309268cd357783a8dca087418 100644 (file)
@@ -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);