summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source4/lib/registry/util.c44
1 files changed, 37 insertions, 7 deletions
diff --git a/source4/lib/registry/util.c b/source4/lib/registry/util.c
index 2d95559200..29417f86d3 100644
--- a/source4/lib/registry/util.c
+++ b/source4/lib/registry/util.c
@@ -21,6 +21,7 @@
#include "includes.h"
#include "lib/registry/registry.h"
#include "librpc/gen_ndr/winreg.h"
+#include "lib/util/data_blob.h"
_PUBLIC_ char *reg_val_data_string(TALLOC_CTX *mem_ctx, uint32_t type,
const DATA_BLOB data)
@@ -77,6 +78,38 @@ _PUBLIC_ char *reg_val_description(TALLOC_CTX *mem_ctx,
reg_val_data_string(mem_ctx, data_type, data));
}
+static DATA_BLOB reg_strhex_to_data_blob(TALLOC_CTX *mem_ctx, const char *str)
+{
+ DATA_BLOB ret;
+ const char *HEXCHARS = "0123456789ABCDEF";
+ size_t i, j;
+ char *hi, *lo;
+
+ ret = data_blob_talloc_zero(mem_ctx, (strlen(str)+(strlen(str) % 3))/3);
+ j = 0;
+ for (i = 0; i < strlen(str); i++) {
+ hi = strchr(HEXCHARS, toupper(str[i]));
+ if (hi == NULL)
+ continue;
+
+ i++;
+ lo = strchr(HEXCHARS, toupper(str[i]));
+ if (lo == NULL)
+ break;
+
+ ret.data[j] = PTR_DIFF(hi, HEXCHARS) << 4;
+ ret.data[j] += PTR_DIFF(lo, HEXCHARS);
+ j++;
+
+ if (j > ret.length) {
+ DEBUG(0, ("Trouble converting hex string to bin\n"));
+ break;
+ }
+ }
+ return ret;
+}
+
+
_PUBLIC_ bool reg_string_to_val(TALLOC_CTX *mem_ctx, const char *type_str,
const char *data_str, uint32_t *type, DATA_BLOB *data)
{
@@ -104,7 +137,6 @@ _PUBLIC_ bool reg_string_to_val(TALLOC_CTX *mem_ctx, const char *type_str,
DEBUG(0, ("Could not convert hex to int\n"));
return false;
}
- DEBUG(10, ("Found string type: %s: %d\n", p, *type));
talloc_free(tmp_type_str);
} else if (strcmp(type_str, "hex") == 0) {
*type = REG_BINARY;
@@ -120,19 +152,20 @@ _PUBLIC_ bool reg_string_to_val(TALLOC_CTX *mem_ctx, const char *type_str,
switch (*type) {
case REG_SZ:
- case REG_EXPAND_SZ:
return convert_string_talloc(mem_ctx,
CH_UNIX, CH_UTF16, data_str,
strlen(data_str)+1,
(void **)&data->data,
&data->length, false);
break;
+ case REG_MULTI_SZ:
+ case REG_EXPAND_SZ:
case REG_BINARY:
- *data = strhex_to_data_blob(mem_ctx, data_str);
+ *data = reg_strhex_to_data_blob(mem_ctx, data_str);
break;
case REG_DWORD:
case REG_DWORD_BIG_ENDIAN: {
- uint32_t tmp = strtol(data_str, NULL, 0);
+ uint32_t tmp = strtol(data_str, NULL, 16);
*data = data_blob_talloc(mem_ctx, NULL, sizeof(uint32_t));
if (data->data == NULL) return false;
SIVAL(data->data, 0, tmp);
@@ -148,9 +181,6 @@ _PUBLIC_ bool reg_string_to_val(TALLOC_CTX *mem_ctx, const char *type_str,
case REG_NONE:
ZERO_STRUCTP(data);
break;
- case REG_MULTI_SZ:
- /* FIXME: We don't support this yet */
- return false;
default:
/* FIXME */
/* Other datatypes aren't supported -> return no success */