Add a new function to parse a DATA_BLOB into a GUID
authorAndrew Bartlett <abartlet@samba.org>
Mon, 10 Nov 2008 00:40:31 +0000 (11:40 +1100)
committerStefan Metzmacher <metze@samba.org>
Sun, 16 Nov 2008 15:24:33 +0000 (16:24 +0100)
The reason for this new function is to ensure the length is not
discarded when the input is a ldb_val (aka DATA_BLOB) in ldb.

Andrew Bartlett

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

index 127f6734e3707f56c5affa795feeb9ce997c7be9..ad94c59e90b357b74561dd10f7bdfc138300b3b5 100644 (file)
@@ -511,6 +511,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_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);
 struct GUID GUID_zero(void);
index 1e6ee0a3db7b31087b12ca1d94dbc20ef9ced833..308b5c0688c17a7348a4c6f2af68182d117d3c0a 100644 (file)
@@ -27,7 +27,7 @@
 /**
   build a GUID from a string
 */
-_PUBLIC_ NTSTATUS GUID_from_string(const char *s, struct GUID *guid)
+_PUBLIC_ NTSTATUS GUID_from_data_blob(const DATA_BLOB *s, struct GUID *guid)
 {
        NTSTATUS status = NT_STATUS_INVALID_PARAMETER;
        uint32_t time_low;
@@ -36,19 +36,23 @@ _PUBLIC_ NTSTATUS GUID_from_string(const char *s, struct GUID *guid)
        uint32_t node[6];
        int i;
 
-       if (s == NULL) {
+       if (s->data == NULL) {
                return NT_STATUS_INVALID_PARAMETER;
        }
 
-       if (11 == sscanf(s, "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
+       if (s->length == 36 && 
+           11 == sscanf((const char *)s->data, 
+                        "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
                         &time_low, &time_mid, &time_hi_and_version, 
                         &clock_seq[0], &clock_seq[1],
                         &node[0], &node[1], &node[2], &node[3], &node[4], &node[5])) {
                status = NT_STATUS_OK;
-       } else if (11 == sscanf(s, "{%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}",
-                               &time_low, &time_mid, &time_hi_and_version, 
-                               &clock_seq[0], &clock_seq[1],
-                               &node[0], &node[1], &node[2], &node[3], &node[4], &node[5])) {
+       } else if (s->length == 38
+                  && 11 == sscanf((const char *)s->data, 
+                                  "{%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}",
+                                  &time_low, &time_mid, &time_hi_and_version, 
+                                  &clock_seq[0], &clock_seq[1],
+                                  &node[0], &node[1], &node[2], &node[3], &node[4], &node[5])) {
                status = NT_STATUS_OK;
        }
 
@@ -68,6 +72,16 @@ _PUBLIC_ NTSTATUS GUID_from_string(const char *s, struct GUID *guid)
        return NT_STATUS_OK;
 }
 
+/**
+  build a GUID from a string
+*/
+_PUBLIC_ NTSTATUS GUID_from_string(const char *s, struct GUID *guid)
+{
+       DATA_BLOB blob = data_blob_string_const(s);
+       return GUID_from_data_blob(&blob, guid);
+       return NT_STATUS_OK;
+}
+
 /**
   build a GUID from a string
 */