diff options
-rw-r--r-- | librpc/ndr/libndr.h | 1 | ||||
-rw-r--r-- | librpc/ndr/uuid.c | 35 |
2 files changed, 21 insertions, 15 deletions
diff --git a/librpc/ndr/libndr.h b/librpc/ndr/libndr.h index e881a5c691..d26adb8bbe 100644 --- a/librpc/ndr/libndr.h +++ b/librpc/ndr/libndr.h @@ -536,6 +536,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); diff --git a/librpc/ndr/uuid.c b/librpc/ndr/uuid.c index df17d7824e..c3f6a05453 100644 --- a/librpc/ndr/uuid.c +++ b/librpc/ndr/uuid.c @@ -25,6 +25,25 @@ #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 */ @@ -89,21 +108,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)) { |