[SCM] Samba Shared Repository - branch master updated - release-4-0-0alpha6-1123-g89c682c

Günther Deschner gd at samba.org
Tue Feb 24 11:41:35 GMT 2009


The branch, master has been updated
       via  89c682c4185acbf5de16cb4132e33ea825527f41 (commit)
       via  5c5ce2bee68c4f90a0de3f1833d37cf6f71aa867 (commit)
       via  e1749a1f7815dae4f0721a62a0ea5d3a88aaf320 (commit)
       via  f21ae452a008370a4846c8955ac1a8fe1a0acb3c (commit)
      from  31f2cddcf5886b0a78290fdfa609a2ee63bda5ad (commit)

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


- Log -----------------------------------------------------------------
commit 89c682c4185acbf5de16cb4132e33ea825527f41
Author: Günther Deschner <gd at samba.org>
Date:   Tue Feb 24 12:38:53 2009 +0100

    s3: re-run make samba3-idl.
    
    Guenther

commit 5c5ce2bee68c4f90a0de3f1833d37cf6f71aa867
Author: Günther Deschner <gd at samba.org>
Date:   Tue Feb 24 12:37:04 2009 +0100

    spoolss: fix _spoolss_SetPrinter level 3.
    
    Guenther

commit e1749a1f7815dae4f0721a62a0ea5d3a88aaf320
Author: Günther Deschner <gd at samba.org>
Date:   Tue Feb 24 12:19:01 2009 +0100

    s3-spoolss: use marshall/unmarshall_sec_desc_buf in nt_printing_setsec/getsec.
    
    Guenther

commit f21ae452a008370a4846c8955ac1a8fe1a0acb3c
Author: Günther Deschner <gd at samba.org>
Date:   Tue Feb 24 11:34:57 2009 +0100

    s3-lib: add marshall_sec_desc_buf and unmarshall_sec_desc_buf helpers.
    
    Guenther

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

Summary of changes:
 librpc/gen_ndr/ndr_spoolss.c   |   31 ++-------------
 librpc/gen_ndr/spoolss.h       |    2 +-
 librpc/idl/spoolss.idl         |    2 +-
 source3/include/proto.h        |    5 ++
 source3/lib/secdesc.c          |   63 +++++++++++++++++++++++++++++++
 source3/printing/nt_printing.c |   80 +++++++++++++++++----------------------
 6 files changed, 110 insertions(+), 73 deletions(-)


Changeset truncated at 500 lines:

diff --git a/librpc/gen_ndr/ndr_spoolss.c b/librpc/gen_ndr/ndr_spoolss.c
index 642ac0b..fdafa25 100644
--- a/librpc/gen_ndr/ndr_spoolss.c
+++ b/librpc/gen_ndr/ndr_spoolss.c
@@ -3867,36 +3867,20 @@ static enum ndr_err_code ndr_push_spoolss_SetPrinterInfo3(struct ndr_push *ndr,
 {
 	if (ndr_flags & NDR_SCALARS) {
 		NDR_CHECK(ndr_push_align(ndr, 4));
-		NDR_CHECK(ndr_push_unique_ptr(ndr, r->secdesc));
+		NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->sec_desc_ptr));
 	}
 	if (ndr_flags & NDR_BUFFERS) {
-		if (r->secdesc) {
-			NDR_CHECK(ndr_push_security_descriptor(ndr, NDR_SCALARS|NDR_BUFFERS, r->secdesc));
-		}
 	}
 	return NDR_ERR_SUCCESS;
 }
 
 static enum ndr_err_code ndr_pull_spoolss_SetPrinterInfo3(struct ndr_pull *ndr, int ndr_flags, struct spoolss_SetPrinterInfo3 *r)
 {
-	uint32_t _ptr_secdesc;
-	TALLOC_CTX *_mem_save_secdesc_0;
 	if (ndr_flags & NDR_SCALARS) {
 		NDR_CHECK(ndr_pull_align(ndr, 4));
-		NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_secdesc));
-		if (_ptr_secdesc) {
-			NDR_PULL_ALLOC(ndr, r->secdesc);
-		} else {
-			r->secdesc = NULL;
-		}
+		NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->sec_desc_ptr));
 	}
 	if (ndr_flags & NDR_BUFFERS) {
-		if (r->secdesc) {
-			_mem_save_secdesc_0 = NDR_PULL_GET_MEM_CTX(ndr);
-			NDR_PULL_SET_MEM_CTX(ndr, r->secdesc, 0);
-			NDR_CHECK(ndr_pull_security_descriptor(ndr, NDR_SCALARS|NDR_BUFFERS, r->secdesc));
-			NDR_PULL_SET_MEM_CTX(ndr, _mem_save_secdesc_0, 0);
-		}
 	}
 	return NDR_ERR_SUCCESS;
 }
@@ -3905,12 +3889,7 @@ _PUBLIC_ void ndr_print_spoolss_SetPrinterInfo3(struct ndr_print *ndr, const cha
 {
 	ndr_print_struct(ndr, name, "spoolss_SetPrinterInfo3");
 	ndr->depth++;
-	ndr_print_ptr(ndr, "secdesc", r->secdesc);
-	ndr->depth++;
-	if (r->secdesc) {
-		ndr_print_security_descriptor(ndr, "secdesc", r->secdesc);
-	}
-	ndr->depth--;
+	ndr_print_uint32(ndr, "sec_desc_ptr", r->sec_desc_ptr);
 	ndr->depth--;
 }
 
@@ -4279,7 +4258,7 @@ static enum ndr_err_code ndr_push_spoolss_SetPrinterInfo(struct ndr_push *ndr, i
 
 			case 3:
 				if (r->info3) {
-					NDR_CHECK(ndr_push_spoolss_SetPrinterInfo3(ndr, NDR_SCALARS|NDR_BUFFERS, r->info3));
+					NDR_CHECK(ndr_push_spoolss_SetPrinterInfo3(ndr, NDR_SCALARS, r->info3));
 				}
 			break;
 
@@ -4486,7 +4465,7 @@ static enum ndr_err_code ndr_pull_spoolss_SetPrinterInfo(struct ndr_pull *ndr, i
 				if (r->info3) {
 					_mem_save_info3_0 = NDR_PULL_GET_MEM_CTX(ndr);
 					NDR_PULL_SET_MEM_CTX(ndr, r->info3, 0);
-					NDR_CHECK(ndr_pull_spoolss_SetPrinterInfo3(ndr, NDR_SCALARS|NDR_BUFFERS, r->info3));
+					NDR_CHECK(ndr_pull_spoolss_SetPrinterInfo3(ndr, NDR_SCALARS, r->info3));
 					NDR_PULL_SET_MEM_CTX(ndr, _mem_save_info3_0, 0);
 				}
 			break;
diff --git a/librpc/gen_ndr/spoolss.h b/librpc/gen_ndr/spoolss.h
index 0b77997..ad4554d 100644
--- a/librpc/gen_ndr/spoolss.h
+++ b/librpc/gen_ndr/spoolss.h
@@ -501,7 +501,7 @@ struct spoolss_SetPrinterInfo2 {
 };
 
 struct spoolss_SetPrinterInfo3 {
-	struct security_descriptor *secdesc;/* [unique] */
+	uint32_t sec_desc_ptr;
 };
 
 struct spoolss_SetPrinterInfo4 {
diff --git a/librpc/idl/spoolss.idl b/librpc/idl/spoolss.idl
index 510ad3e..3e35399 100644
--- a/librpc/idl/spoolss.idl
+++ b/librpc/idl/spoolss.idl
@@ -552,7 +552,7 @@ import "misc.idl", "security.idl", "winreg.idl";
 	} spoolss_SetPrinterInfo2;
 
 	typedef struct {
-		security_descriptor *secdesc;
+		uint32 sec_desc_ptr;
 	} spoolss_SetPrinterInfo3;
 
 	typedef struct {
diff --git a/source3/include/proto.h b/source3/include/proto.h
index 14241d5..3ca94b9 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -695,8 +695,13 @@ SEC_DESC *dup_sec_desc(TALLOC_CTX *ctx, const SEC_DESC *src);
 NTSTATUS marshall_sec_desc(TALLOC_CTX *mem_ctx,
 			   struct security_descriptor *secdesc,
 			   uint8 **data, size_t *len);
+NTSTATUS marshall_sec_desc_buf(TALLOC_CTX *mem_ctx,
+			       struct sec_desc_buf *secdesc_buf,
+			       uint8_t **data, size_t *len);
 NTSTATUS unmarshall_sec_desc(TALLOC_CTX *mem_ctx, uint8 *data, size_t len,
 			     struct security_descriptor **psecdesc);
+NTSTATUS unmarshall_sec_desc_buf(TALLOC_CTX *mem_ctx, uint8_t *data, size_t len,
+				 struct sec_desc_buf **psecdesc_buf);
 SEC_DESC *make_standard_sec_desc(TALLOC_CTX *ctx, const DOM_SID *owner_sid, const DOM_SID *grp_sid,
 				 SEC_ACL *dacl, size_t *sd_size);
 SEC_DESC_BUF *make_sec_desc_buf(TALLOC_CTX *ctx, size_t len, SEC_DESC *sec_desc);
diff --git a/source3/lib/secdesc.c b/source3/lib/secdesc.c
index 232bbca..a81c4ae 100644
--- a/source3/lib/secdesc.c
+++ b/source3/lib/secdesc.c
@@ -291,6 +291,32 @@ NTSTATUS marshall_sec_desc(TALLOC_CTX *mem_ctx,
 }
 
 /*******************************************************************
+ Convert a secdesc_buf into a byte stream
+********************************************************************/
+
+NTSTATUS marshall_sec_desc_buf(TALLOC_CTX *mem_ctx,
+			       struct sec_desc_buf *secdesc_buf,
+			       uint8_t **data, size_t *len)
+{
+	DATA_BLOB blob;
+	enum ndr_err_code ndr_err;
+
+	ndr_err = ndr_push_struct_blob(
+		&blob, mem_ctx, NULL, secdesc_buf,
+		(ndr_push_flags_fn_t)ndr_push_sec_desc_buf);
+
+	if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+		DEBUG(0, ("ndr_push_sec_desc_buf failed: %s\n",
+			  ndr_errstr(ndr_err)));
+		return ndr_map_error2ntstatus(ndr_err);;
+	}
+
+	*data = blob.data;
+	*len = blob.length;
+	return NT_STATUS_OK;
+}
+
+/*******************************************************************
  Parse a byte stream into a secdesc
 ********************************************************************/
 NTSTATUS unmarshall_sec_desc(TALLOC_CTX *mem_ctx, uint8 *data, size_t len,
@@ -327,6 +353,43 @@ NTSTATUS unmarshall_sec_desc(TALLOC_CTX *mem_ctx, uint8 *data, size_t len,
 }
 
 /*******************************************************************
+ Parse a byte stream into a sec_desc_buf
+********************************************************************/
+
+NTSTATUS unmarshall_sec_desc_buf(TALLOC_CTX *mem_ctx, uint8_t *data, size_t len,
+				 struct sec_desc_buf **psecdesc_buf)
+{
+	DATA_BLOB blob;
+	enum ndr_err_code ndr_err;
+	struct sec_desc_buf *result;
+
+	if ((data == NULL) || (len == 0)) {
+		return NT_STATUS_INVALID_PARAMETER;
+	}
+
+	result = TALLOC_ZERO_P(mem_ctx, struct sec_desc_buf);
+	if (result == NULL) {
+		return NT_STATUS_NO_MEMORY;
+	}
+
+	blob = data_blob_const(data, len);
+
+	ndr_err = ndr_pull_struct_blob(
+		&blob, result, NULL, result,
+		(ndr_pull_flags_fn_t)ndr_pull_sec_desc_buf);
+
+	if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+		DEBUG(0, ("ndr_pull_sec_desc_buf failed: %s\n",
+			  ndr_errstr(ndr_err)));
+		TALLOC_FREE(result);
+		return ndr_map_error2ntstatus(ndr_err);;
+	}
+
+	*psecdesc_buf = result;
+	return NT_STATUS_OK;
+}
+
+/*******************************************************************
  Creates a SEC_DESC structure with typical defaults.
 ********************************************************************/
 
diff --git a/source3/printing/nt_printing.c b/source3/printing/nt_printing.c
index ad3a958..bbe8ebc 100644
--- a/source3/printing/nt_printing.c
+++ b/source3/printing/nt_printing.c
@@ -5408,11 +5408,12 @@ WERROR nt_printing_setsec(const char *sharename, SEC_DESC_BUF *secdesc_ctr)
 {
 	SEC_DESC_BUF *new_secdesc_ctr = NULL;
 	SEC_DESC_BUF *old_secdesc_ctr = NULL;
-	prs_struct ps;
-	bool prs_init_done = false;
 	TALLOC_CTX *mem_ctx = NULL;
 	TDB_DATA kbuf;
+	TDB_DATA dbuf;
+	DATA_BLOB blob;
 	WERROR status;
+	NTSTATUS nt_status;
 
 	mem_ctx = talloc_init("nt_printing_setsec");
 	if (mem_ctx == NULL)
@@ -5474,26 +5475,19 @@ WERROR nt_printing_setsec(const char *sharename, SEC_DESC_BUF *secdesc_ctr)
 
 	/* Store the security descriptor in a tdb */
 
-	if (!prs_init(&ps,
-		(uint32_t)ndr_size_security_descriptor(new_secdesc_ctr->sd,
-						     NULL, 0)
-		+ sizeof(SEC_DESC_BUF), mem_ctx, MARSHALL) ) {
-		status = WERR_NOMEM;
-		goto out;
-	}
-
-
-	prs_init_done = true;
-
-	if (!sec_io_desc_buf("nt_printing_setsec", &new_secdesc_ctr,
-			     &ps, 1)) {
-		status = WERR_BADFUNC;
+	nt_status = marshall_sec_desc_buf(mem_ctx, new_secdesc_ctr,
+					  &blob.data, &blob.length);
+	if (!NT_STATUS_IS_OK(nt_status)) {
+		status = ntstatus_to_werror(nt_status);
 		goto out;
 	}
 
 	kbuf = make_printers_secdesc_tdbkey(mem_ctx, sharename );
 
-	if (tdb_prs_store(tdb_printers, kbuf, &ps)==0) {
+	dbuf.dptr = (unsigned char *)blob.data;
+	dbuf.dsize = blob.length;
+
+	if (tdb_trans_store(tdb_printers, kbuf, dbuf, TDB_REPLACE)==0) {
 		status = WERR_OK;
 	} else {
 		DEBUG(1,("Failed to store secdesc for %s\n", sharename));
@@ -5501,12 +5495,10 @@ WERROR nt_printing_setsec(const char *sharename, SEC_DESC_BUF *secdesc_ctr)
 	}
 
 	/* Free malloc'ed memory */
+	talloc_free(blob.data);
 
  out:
 
-	if (prs_init_done) {
-		prs_mem_free(&ps);
-	}
 	if (mem_ctx)
 		talloc_destroy(mem_ctx);
 	return status;
@@ -5602,47 +5594,45 @@ static SEC_DESC_BUF *construct_default_printer_sdb(TALLOC_CTX *ctx)
 
 bool nt_printing_getsec(TALLOC_CTX *ctx, const char *sharename, SEC_DESC_BUF **secdesc_ctr)
 {
-	prs_struct ps;
 	TDB_DATA kbuf;
+	TDB_DATA dbuf;
+	DATA_BLOB blob;
 	char *temp;
+	NTSTATUS status;
 
 	if (strlen(sharename) > 2 && (temp = strchr(sharename + 2, '\\'))) {
 		sharename = temp + 1;
 	}
 
-	ZERO_STRUCT(ps);
-
 	/* Fetch security descriptor from tdb */
 
-	kbuf = make_printers_secdesc_tdbkey(ctx, sharename  );
-
-	if (tdb_prs_fetch(tdb_printers, kbuf, &ps, ctx)!=0 ||
-	    !sec_io_desc_buf("nt_printing_getsec", secdesc_ctr, &ps, 1)) {
-
-		prs_mem_free(&ps);
-
-		DEBUG(4,("using default secdesc for %s\n", sharename));
+	kbuf = make_printers_secdesc_tdbkey(ctx, sharename);
 
-		if (!(*secdesc_ctr = construct_default_printer_sdb(ctx))) {
-			return False;
-		}
-
-		/* Save default security descriptor for later */
+	dbuf = tdb_fetch(tdb_printers, kbuf);
+	if (dbuf.dptr) {
 
-		if (!prs_init(&ps, (uint32_t)ndr_size_security_descriptor((*secdesc_ctr)->sd, NULL, 0) +
-			sizeof(SEC_DESC_BUF), ctx, MARSHALL))
-			return False;
+		status = unmarshall_sec_desc_buf(ctx, dbuf.dptr, dbuf.dsize,
+						 secdesc_ctr);
+		SAFE_FREE(dbuf.dptr);
 
-		if (sec_io_desc_buf("nt_printing_getsec", secdesc_ctr, &ps, 1)) {
-			tdb_prs_store(tdb_printers, kbuf, &ps);
+		if (NT_STATUS_IS_OK(status)) {
+			return true;
 		}
+	}
 
-		prs_mem_free(&ps);
-
-		return True;
+	*secdesc_ctr = construct_default_printer_sdb(ctx);
+	if (!*secdesc_ctr) {
+		return false;
 	}
 
-	prs_mem_free(&ps);
+	status = marshall_sec_desc_buf(ctx, *secdesc_ctr,
+				       &blob.data, &blob.length);
+	if (NT_STATUS_IS_OK(status)) {
+		dbuf.dptr = (unsigned char *)blob.data;
+		dbuf.dsize = blob.length;
+		tdb_trans_store(tdb_printers, kbuf, dbuf, TDB_REPLACE);
+		talloc_free(blob.data);
+	}
 
 	/* If security descriptor is owned by S-1-1-0 and winbindd is up,
 	   this security descriptor has been created when winbindd was


-- 
Samba Shared Repository


More information about the samba-cvs mailing list