librpc/ndr: don't overwrite the content in ndr_push_relative_ptr2_end()
authorStefan Metzmacher <metze@samba.org>
Fri, 19 Feb 2010 07:11:24 +0000 (08:11 +0100)
committerKarolin Seeger <kseeger@samba.org>
Fri, 19 Feb 2010 13:32:32 +0000 (14:32 +0100)
metze
(cherry picked from commit 76aa37f653fec2d511921768381db7da661750cb)

The last 24 patches address bug #6888 (REGRESSION: printing support for 64 bit
windows clients broken).
(cherry picked from commit b094f4954d0bef08794c5edcf102444908f1971c)

librpc/ndr/ndr.c

index bece6b94e17fc63834fedef787849c031b68fb6b..5030443abce9285c98947e34cd91bd24df33f28f 100644 (file)
@@ -1196,11 +1196,17 @@ _PUBLIC_ enum ndr_err_code ndr_push_relative_ptr2_end(struct ndr_push *ndr, cons
        }
 
        if (len > 0) {
+               uint32_t clear_size = correct_offset - begin_offset;
+
+               clear_size = MIN(clear_size, len);
+
                /* now move the marshalled buffer to the end of the main buffer */
                memmove(ndr->data + correct_offset, ndr->data + begin_offset, len);
 
-               /* and wipe out old buffer within the main buffer */
-               memset(ndr->data + begin_offset, '\0', len);
+               if (clear_size) {
+                       /* and wipe out old buffer within the main buffer */
+                       memset(ndr->data + begin_offset, '\0', clear_size);
+               }
        }
 
        /* and set the end offset for the next buffer */