[PATCH] s3:smbd: Align change notify replies on 4-byte boundary

Chere Zhou chere.zhou at isilon.com
Mon Jul 5 18:18:35 MDT 2010


MS-CIFS section 2.2.7.4.2 states this is mandatory.  WinXP clients
don't seem to care, but a Win7 client will send an immediate Close()
to the directory handle when receiving an incorrectly aligned
change notify response.

Fix bug #7662 (Change notify replies must be aligned on 4-byte boundary for
Win7.)
---
 source3/smbd/notify.c |   10 ++++++++++
 1 files changed, 10 insertions(+), 0 deletions(-)

diff --git a/source3/smbd/notify.c b/source3/smbd/notify.c
index 059101c..3c366d7 100644
--- a/source3/smbd/notify.c
+++ b/source3/smbd/notify.c
@@ -69,6 +69,7 @@ static bool notify_marshall_changes(int num_changes,
 	for (i=0; i<num_changes; i++) {
 		struct notify_change *c;
 		size_t namelen;
+		int    rem = 0;
 		uint32 u32_tmp;	/* Temp arg to prs_uint32 to avoid
 				 * signed/unsigned issues */
 
@@ -94,6 +95,11 @@ static bool notify_marshall_changes(int num_changes,
 		 */
 
 		u32_tmp = (i == num_changes-1) ? 0 : namelen + 12;
+
+		/* Align on 4-byte boundary according to MS-CIFS 2.2.7.4.2 */
+		if ((rem = u32_tmp % 4 ) != 0)
+			u32_tmp += 4 - rem;
+
 		if (!prs_uint32("offset", ps, 1, &u32_tmp)) goto fail;
 
 		u32_tmp = c->action;
@@ -111,6 +117,10 @@ static bool notify_marshall_changes(int num_changes,
 
 		SAFE_FREE(uni_name.buffer);
 
+		if (rem != 0) {
+			if (!prs_align_custom(ps, 4)) goto fail;
+		}
+
 		if (prs_offset(ps) > max_offset) {
 			/* Too much data for client. */
 			DEBUG(10, ("Client only wanted %d bytes, trying to "
-- 
1.7.3.4


--liOOAslEiF7prFVr--


More information about the samba-technical mailing list