librpc: split out a separate GUID_from_ndr_blob() function
authorAndrew Tridgell <tridge@samba.org>
Thu, 10 Dec 2009 00:22:20 +0000 (11:22 +1100)
committerKarolin Seeger <kseeger@samba.org>
Thu, 8 Jul 2010 09:00:34 +0000 (11:00 +0200)
This will simplify many of the places that deal with NDR formatted
GUIDs
(cherry picked from commit effff544265c63c95cf630d426b630bfe4d25aec)

This patch is part of a fix for bug #7538 (Backport fixes for
GUID_from_data_blob).

librpc/ndr/libndr.h
librpc/ndr/uuid.c

index ff7c9125d63094f471b21f185ce1d7494ee8461b..203f7bfe77423b81145cf6c580fb374e83d574e2 100644 (file)
@@ -543,6 +543,7 @@ enum ndr_err_code ndr_push_charset(struct ndr_push *ndr, int ndr_flags, const ch
 
 /* GUIDs */
 bool GUID_equal(const struct GUID *u1, const struct GUID *u2);
+NTSTATUS GUID_from_ndr_blob(const DATA_BLOB *b, struct GUID *guid);
 NTSTATUS GUID_from_data_blob(const DATA_BLOB *s, struct GUID *guid);
 NTSTATUS GUID_from_string(const char *s, struct GUID *guid);
 NTSTATUS NS_GUID_from_string(const char *s, struct GUID *guid);
index 80c35cde861306180a25a394c2a43542630e9236..928971298c34b320dd56b295acd420e22afb0f0b 100644 (file)
 #include "librpc/ndr/libndr.h"
 #include "librpc/gen_ndr/ndr_misc.h"
 
+
+/**
+  build a GUID from a NDR data blob
+*/
+_PUBLIC_ NTSTATUS GUID_from_ndr_blob(const DATA_BLOB *b, struct GUID *guid)
+{
+       enum ndr_err_code ndr_err;
+       TALLOC_CTX *mem_ctx;
+
+       mem_ctx = talloc_new(NULL);
+       NT_STATUS_HAVE_NO_MEMORY(mem_ctx);
+
+       ndr_err = ndr_pull_struct_blob_all(b, mem_ctx, NULL, guid,
+                                          (ndr_pull_flags_fn_t)ndr_pull_GUID);
+       talloc_free(mem_ctx);
+       return ndr_map_error2ntstatus(ndr_err);
+}
+
+
 /**
   build a GUID from a string
 */
@@ -90,21 +109,7 @@ _PUBLIC_ NTSTATUS GUID_from_data_blob(const DATA_BLOB *s, struct GUID *guid)
        }
 
        if (s->length == 16) {
-               enum ndr_err_code ndr_err;
-               struct GUID guid2;
-               TALLOC_CTX *mem_ctx;
-
-               mem_ctx = talloc_new(NULL);
-               NT_STATUS_HAVE_NO_MEMORY(mem_ctx);
-
-               ndr_err = ndr_pull_struct_blob(s, mem_ctx, NULL, &guid2,
-                                              (ndr_pull_flags_fn_t)ndr_pull_GUID);
-               talloc_free(mem_ctx);
-               if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
-                       return ndr_map_error2ntstatus(ndr_err);
-               }
-               *guid = guid2;
-               return NT_STATUS_OK;
+               return GUID_from_ndr_blob(s, guid);
        }
 
        if (!NT_STATUS_IS_OK(status)) {