summaryrefslogtreecommitdiff
path: root/source3/smbd
diff options
context:
space:
mode:
authorChere Zhou <chere.zhou@isilon.com>2010-07-05 17:18:35 -0700
committerSteven Danneman <steven.danneman@isilon.com>2010-07-06 13:28:02 -0700
commit00056e73c1cb54f5d6c10e63b70afc2c84e5883e (patch)
tree72e46bdfe16ab2bbc8aaefef2aa6ff22a87cecbf /source3/smbd
parent502bddf7676b8061a877e7c83b647a64963c3efe (diff)
downloadsamba-00056e73c1cb54f5d6c10e63b70afc2c84e5883e.tar.gz
samba-00056e73c1cb54f5d6c10e63b70afc2c84e5883e.tar.bz2
samba-00056e73c1cb54f5d6c10e63b70afc2c84e5883e.zip
s3:smbd: Align change notify replies on 4-byte boundary
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.
Diffstat (limited to 'source3/smbd')
-rw-r--r--source3/smbd/notify.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/source3/smbd/notify.c b/source3/smbd/notify.c
index dc13aadadd..e473d99ff0 100644
--- a/source3/smbd/notify.c
+++ b/source3/smbd/notify.c
@@ -77,6 +77,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 */
@@ -102,6 +103,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;
@@ -117,6 +123,10 @@ static bool notify_marshall_changes(int num_changes,
*/
prs_set_offset(ps, prs_offset(ps)-2);
+ if (rem != 0) {
+ if (!prs_align_custom(ps, 4)) goto fail;
+ }
+
TALLOC_FREE(uni_name.buffer);
if (prs_offset(ps) > max_offset) {