diff --git a/source/lib/registry/ldb.c b/source/lib/registry/ldb.c index 0c8a553..57c597d 100644 --- a/source/lib/registry/ldb.c +++ b/source/lib/registry/ldb.c @@ -62,6 +62,11 @@ static void reg_ldb_unpack_value(TALLOC_CTX *mem_ctx, struct ldb_message *msg, (void **)&data->data); break; + case REG_BINARY: + *data = strhex_to_data_blob(val->data); + talloc_steal(mem_ctx,data->data); + break; + case REG_DWORD: { uint32_t tmp = strtoul((char *)val->data, NULL, 0); *data = data_blob_talloc(mem_ctx, &tmp, 4); @@ -88,18 +93,30 @@ static struct ldb_message *reg_ldb_pack_value(struct ldb_context *ctx, switch (type) { case REG_SZ: case REG_EXPAND_SZ: - val.length = convert_string_talloc(mem_ctx, lp_iconv_convenience(global_loadparm), CH_UTF16, CH_UNIX, + if (*(data.data)) { + val.length = convert_string_talloc(mem_ctx, lp_iconv_convenience(global_loadparm), CH_UTF16, CH_UNIX, (void *)data.data, data.length, (void **)&val.data); + } else { + /* workaround for empty REG_SZ values */ + val.data = (uint8_t *) talloc_asprintf(mem_ctx," "); + val.length = strlen(val.data); + } ldb_msg_add_value(msg, "data", &val, NULL); break; + case REG_BINARY: + ldb_msg_add_string(msg, "data", + data_blob_hex_string(mem_ctx,&data)); + break; + case REG_DWORD: ldb_msg_add_string(msg, "data", talloc_asprintf(mem_ctx, "0x%x", IVAL(data.data, 0))); break; + default: ldb_msg_add_value(msg, "data", &data, NULL); }