[SCM] Samba Shared Repository - branch master updated

Günther Deschner gd at samba.org
Wed Jul 7 07:26:44 MDT 2010


The branch, master has been updated
       via  f706d1a... s3-rpc_parse: fix c++ buildwarning in prs_init().
       via  ca46011... s3-notify: use autogenerated FILE_NOTIFY_INFORMATION marshalling in smbd.
       via  6ab9eaf... s3-notify: add MS-CIFS 2.2.7.4.2 FILE_NOTIFY_INFORMATION to IDL.
      from  2c1279f... s3-build: some makefile cosmetics.

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit f706d1a96e0cc80000c6b87c90becfcbfe26d314
Author: Günther Deschner <gd at samba.org>
Date:   Wed Jul 7 14:56:14 2010 +0200

    s3-rpc_parse: fix c++ buildwarning in prs_init().
    
    Guenther

commit ca460113ea28ca82429845c2b3977989175f8ada
Author: Günther Deschner <gd at samba.org>
Date:   Wed Jul 7 01:50:56 2010 +0200

    s3-notify: use autogenerated FILE_NOTIFY_INFORMATION marshalling in smbd.
    
    Guenther

commit 6ab9eaf90fa732153dc500087b6f7dcea2a94465
Author: Günther Deschner <gd at samba.org>
Date:   Wed Jul 7 01:50:18 2010 +0200

    s3-notify: add MS-CIFS 2.2.7.4.2 FILE_NOTIFY_INFORMATION to IDL.
    
    Guenther

-----------------------------------------------------------------------

Summary of changes:
 source3/librpc/idl/notify.idl |   19 ++++++++++
 source3/rpc_parse/parse_prs.c |    2 +-
 source3/smbd/notify.c         |   81 +++++++++++++++--------------------------
 3 files changed, 49 insertions(+), 53 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/librpc/idl/notify.idl b/source3/librpc/idl/notify.idl
index 0e80679..040f661 100644
--- a/source3/librpc/idl/notify.idl
+++ b/source3/librpc/idl/notify.idl
@@ -60,4 +60,23 @@ interface notify
 		pointer private_data;
 	} notify_event;
 
+	typedef [v1_enum] enum {
+		FILE_ACTION_ADDED		= 0x00000001,
+		FILE_ACTION_REMOVED		= 0x00000002,
+		FILE_ACTION_MODIFIED		= 0x00000003,
+		FILE_ACTION_RENAMED_OLD_NAME	= 0x00000004,
+		FILE_ACTION_RENAMED_NEW_NAME	= 0x00000005,
+		FILE_ACTION_ADDED_STREAM	= 0x00000006,
+		FILE_ACTION_REMOVED_STREAM	= 0x00000007,
+		FILE_ACTION_MODIFIED_STREAM	= 0x00000008
+	} FILE_NOTIFY_ACTION;
+
+	/* structure sent at the CIFS layer */
+	/* Align on 4-byte boundary according to MS-CIFS 2.2.7.4.2 */
+	typedef [public,gensize,flag(NDR_ALIGN4)] struct {
+		uint32 NextEntryOffset;
+		FILE_NOTIFY_ACTION Action;
+		[value(strlen_m(FileName1)*2)] uint32 FileNameLength;
+		[charset(UTF16),flag(STR_NOTERM)] uint16 FileName1[FileNameLength];
+	} FILE_NOTIFY_INFORMATION;
 }
diff --git a/source3/rpc_parse/parse_prs.c b/source3/rpc_parse/parse_prs.c
index af1cc3d..c460f1f 100644
--- a/source3/rpc_parse/parse_prs.c
+++ b/source3/rpc_parse/parse_prs.c
@@ -112,7 +112,7 @@ bool prs_init(prs_struct *ps, uint32 size, TALLOC_CTX *ctx, bool io)
 
 	if (size != 0) {
 		ps->buffer_size = size;
-		ps->data_p = talloc_zero_size(ps->mem_ctx, size);
+		ps->data_p = (char *)talloc_zero_size(ps->mem_ctx, size);
 		if(ps->data_p == NULL) {
 			DEBUG(0,("prs_init: talloc fail for %u bytes.\n", (unsigned int)size));
 			return False;
diff --git a/source3/smbd/notify.c b/source3/smbd/notify.c
index e473d99..011f38f 100644
--- a/source3/smbd/notify.c
+++ b/source3/smbd/notify.c
@@ -21,7 +21,7 @@
 
 #include "includes.h"
 #include "smbd/globals.h"
-#include "../librpc/gen_ndr/notify.h"
+#include "../librpc/gen_ndr/ndr_notify.h"
 
 struct notify_change_request {
 	struct notify_change_request *prev, *next;
@@ -63,23 +63,19 @@ static bool notify_change_record_identical(struct notify_change *c1,
 static bool notify_marshall_changes(int num_changes,
 				uint32 max_offset,
 				struct notify_change *changes,
-				prs_struct *ps)
+				DATA_BLOB *final_blob)
 {
 	int i;
-	UNISTR uni_name;
 
 	if (num_changes == -1) {
 		return false;
 	}
 
-	uni_name.buffer = NULL;
-
 	for (i=0; i<num_changes; i++) {
+		enum ndr_err_code ndr_err;
 		struct notify_change *c;
-		size_t namelen;
-		int    rem = 0;
-		uint32 u32_tmp;	/* Temp arg to prs_uint32 to avoid
-				 * signed/unsigned issues */
+		struct FILE_NOTIFY_INFORMATION m;
+		DATA_BLOB blob;
 
 		/* Coalesce any identical records. */
 		while (i+1 < num_changes &&
@@ -90,59 +86,43 @@ static bool notify_marshall_changes(int num_changes,
 
 		c = &changes[i];
 
-		if (!convert_string_talloc(talloc_tos(), CH_UNIX, CH_UTF16LE,
-			c->name, strlen(c->name)+1, &uni_name.buffer,
-			&namelen, True) || (uni_name.buffer == NULL)) {
-			goto fail;
-		}
-
-		namelen -= 2;	/* Dump NULL termination */
+		m.FileName1 = c->name;
+		m.FileNameLength = strlen_m(c->name)*2;
+		m.Action = c->action;
+		m.NextEntryOffset = (i == num_changes-1) ? 0 : ndr_size_FILE_NOTIFY_INFORMATION(&m, 0);
 
 		/*
 		 * Offset to next entry, only if there is one
 		 */
 
-		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;
-		if (!prs_uint32("action", ps, 1, &u32_tmp)) goto fail;
-
-		u32_tmp = namelen;
-		if (!prs_uint32("namelen", ps, 1, &u32_tmp)) goto fail;
-
-		if (!prs_unistr("name", ps, 1, &uni_name)) goto fail;
+		ndr_err = ndr_push_struct_blob(&blob, talloc_tos(), &m,
+			(ndr_push_flags_fn_t)ndr_push_FILE_NOTIFY_INFORMATION);
+		if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+			return false;
+		}
 
-		/*
-		 * Not NULL terminated, decrease by the 2 UCS2 \0 chars
-		 */
-		prs_set_offset(ps, prs_offset(ps)-2);
+		if (DEBUGLEVEL >= 10) {
+			NDR_PRINT_DEBUG(FILE_NOTIFY_INFORMATION, &m);
+		}
 
-		if (rem != 0) {
-			if (!prs_align_custom(ps, 4)) goto fail;
+		if (!data_blob_append(talloc_tos(), final_blob,
+				      blob.data, blob.length)) {
+			data_blob_free(&blob);
+			return false;
 		}
 
-		TALLOC_FREE(uni_name.buffer);
+		data_blob_free(&blob);
 
-		if (prs_offset(ps) > max_offset) {
+		if (final_blob->length > max_offset) {
 			/* Too much data for client. */
 			DEBUG(10, ("Client only wanted %d bytes, trying to "
 				   "marshall %d bytes\n", (int)max_offset,
-				   (int)prs_offset(ps)));
+				   (int)final_blob->length));
 			return False;
 		}
 	}
 
 	return True;
-
- fail:
-	TALLOC_FREE(uni_name.buffer);
-	return False;
 }
 
 /****************************************************************************
@@ -157,7 +137,7 @@ void change_notify_reply(struct smb_request *req,
 					  NTSTATUS error_code,
 					  uint8_t *buf, size_t len))
 {
-	prs_struct ps;
+	DATA_BLOB blob = data_blob_null;
 
 	if (!NT_STATUS_IS_OK(error_code)) {
 		reply_fn(req, error_code, NULL, 0);
@@ -169,21 +149,18 @@ void change_notify_reply(struct smb_request *req,
 		return;
 	}
 
-	prs_init_empty(&ps, NULL, MARSHALL);
-
 	if (!notify_marshall_changes(notify_buf->num_changes, max_param,
-					notify_buf->changes, &ps)) {
+					notify_buf->changes, &blob)) {
 		/*
 		 * We exceed what the client is willing to accept. Send
 		 * nothing.
 		 */
-		prs_mem_free(&ps);
-		prs_init_empty(&ps, NULL, MARSHALL);
+		data_blob_free(&blob);
 	}
 
-	reply_fn(req, NT_STATUS_OK, (uint8_t *)prs_data_p(&ps), prs_offset(&ps));
+	reply_fn(req, NT_STATUS_OK, blob.data, blob.length);
 
-	prs_mem_free(&ps);
+	data_blob_free(&blob);
 
 	TALLOC_FREE(notify_buf->changes);
 	notify_buf->num_changes = 0;


-- 
Samba Shared Repository


More information about the samba-cvs mailing list