summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/include/reg_objects.h8
-rw-r--r--source3/lib/util_reg.c2
-rw-r--r--source3/rpcclient/cmd_spoolss.c2
-rw-r--r--source3/utils/net_rpc_printer.c2
-rw-r--r--source3/utils/net_rpc_registry.c26
5 files changed, 32 insertions, 8 deletions
diff --git a/source3/include/reg_objects.h b/source3/include/reg_objects.h
index 6ddbb89cc7..99da22f8cd 100644
--- a/source3/include/reg_objects.h
+++ b/source3/include/reg_objects.h
@@ -33,9 +33,9 @@ typedef struct {
} REGISTRY_VALUE;
/*
- * A registry string is not necessarily NULL terminated. When retrieving it
- * from the net, we guarantee this however. A server might want to push it
- * without the terminator though.
+ * A REG_SZ string is not necessarily NULL terminated. When retrieving it from
+ * the net, we guarantee this however. A server might want to push it without
+ * the terminator though.
*/
struct registry_string {
@@ -51,7 +51,7 @@ struct registry_value {
struct registry_string sz;
struct {
uint32 num_strings;
- struct registry_string *strings;
+ char **strings;
} multi_sz;
DATA_BLOB binary;
} v;
diff --git a/source3/lib/util_reg.c b/source3/lib/util_reg.c
index 80b52924b6..c74a573149 100644
--- a/source3/lib/util_reg.c
+++ b/source3/lib/util_reg.c
@@ -69,7 +69,7 @@ const char *reg_type_lookup(uint32 type)
}
NTSTATUS reg_pull_multi_sz(TALLOC_CTX *mem_ctx, const void *buf, size_t len,
- int *num_values, char ***values)
+ uint32 *num_values, char ***values)
{
const smb_ucs2_t *p = (const smb_ucs2_t *)buf;
*num_values = 0;
diff --git a/source3/rpcclient/cmd_spoolss.c b/source3/rpcclient/cmd_spoolss.c
index b5672cb2a1..3257ec9215 100644
--- a/source3/rpcclient/cmd_spoolss.c
+++ b/source3/rpcclient/cmd_spoolss.c
@@ -709,7 +709,7 @@ static void display_reg_value(REGISTRY_VALUE value)
break;
}
case REG_MULTI_SZ: {
- int i, num_values;
+ uint32 i, num_values;
char **values;
if (!NT_STATUS_IS_OK(reg_pull_multi_sz(NULL, value.data_p,
diff --git a/source3/utils/net_rpc_printer.c b/source3/utils/net_rpc_printer.c
index dc3cb42dbe..5a18253aaf 100644
--- a/source3/utils/net_rpc_printer.c
+++ b/source3/utils/net_rpc_printer.c
@@ -129,7 +129,7 @@ static void display_reg_value(const char *subkey, REGISTRY_VALUE value)
break;
case REG_MULTI_SZ: {
- int i, num_values;
+ uint32 i, num_values;
char **values;
if (!NT_STATUS_IS_OK(reg_pull_multi_sz(NULL, value.data_p,
diff --git a/source3/utils/net_rpc_registry.c b/source3/utils/net_rpc_registry.c
index a04c527502..45598c49f5 100644
--- a/source3/utils/net_rpc_registry.c
+++ b/source3/utils/net_rpc_registry.c
@@ -197,7 +197,7 @@ static NTSTATUS registry_pull_value(TALLOC_CTX *mem_ctx,
struct registry_value *value;
NTSTATUS status;
- if (!(value = TALLOC_P(mem_ctx, struct registry_value))) {
+ if (!(value = TALLOC_ZERO_P(mem_ctx, struct registry_value))) {
return NT_STATUS_NO_MEMORY;
}
@@ -247,6 +247,18 @@ static NTSTATUS registry_pull_value(TALLOC_CTX *mem_ctx,
}
break;
}
+ case REG_MULTI_SZ:
+ status = reg_pull_multi_sz(value, (void *)data, length,
+ &value->v.multi_sz.num_strings,
+ &value->v.multi_sz.strings);
+ if (!(NT_STATUS_IS_OK(status))) {
+ goto error;
+ }
+ break;
+ case REG_BINARY:
+ value->v.binary.data = talloc_move(value, &data);
+ value->v.binary.length = length;
+ break;
default:
status = NT_STATUS_INVALID_PARAMETER;
goto error;
@@ -466,6 +478,18 @@ static NTSTATUS rpc_registry_enumerate_internal(const DOM_SID *domain_sid,
case REG_EXPAND_SZ:
d_printf("Value = \"%s\"\n", v->v.sz.str);
break;
+ case REG_MULTI_SZ: {
+ uint32 j;
+ for (j = 0; j < v->v.multi_sz.num_strings; j++) {
+ d_printf("Value[%3.3d] = \"%s\"\n", j,
+ v->v.multi_sz.strings[j]);
+ }
+ break;
+ }
+ case REG_BINARY:
+ d_printf("Value = %d bytes\n",
+ v->v.binary.length);
+ break;
default:
d_printf("Value = <unprintable>\n");
break;