diff options
Diffstat (limited to 'source3/lib')
-rw-r--r-- | source3/lib/util_reg_api.c | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/source3/lib/util_reg_api.c b/source3/lib/util_reg_api.c index fccc38ebc0..60031d97d3 100644 --- a/source3/lib/util_reg_api.c +++ b/source3/lib/util_reg_api.c @@ -152,6 +152,62 @@ WERROR registry_push_value(TALLOC_CTX *mem_ctx, } break; } + case REG_MULTI_SZ: { + uint32_t count; + size_t len = 0; + char **strings; + size_t *string_lengths; + uint32_t ofs; + TALLOC_CTX *tmp_ctx = talloc_stackframe(); + + strings = TALLOC_ARRAY(tmp_ctx, char *, + value->v.multi_sz.num_strings); + if (strings == NULL) { + return WERR_NOMEM; + } + + string_lengths = TALLOC_ARRAY(tmp_ctx, size_t, + value->v.multi_sz.num_strings); + if (string_lengths == NULL) { + TALLOC_FREE(tmp_ctx); + return WERR_NOMEM; + } + + /* convert the single strings */ + for (count = 0; count < value->v.multi_sz.num_strings; count++) + { + string_lengths[count] = convert_string_talloc( + strings, CH_UNIX, CH_UTF16LE, + value->v.multi_sz.strings[count], + strlen(value->v.multi_sz.strings[count])+1, + (void *)&strings[count], false); + if (string_lengths[count] == (size_t)-1) { + TALLOC_FREE(tmp_ctx); + return WERR_NOMEM; + } + len += string_lengths[count]; + } + + /* now concatenate all into the data blob */ + presult->data = TALLOC_ARRAY(mem_ctx, uint8_t, len); + if (presult->data == NULL) { + TALLOC_FREE(tmp_ctx); + return WERR_NOMEM; + } + for (count = 0, ofs = 0; + count < value->v.multi_sz.num_strings; + count++) + { + memcpy(presult->data + ofs, strings[count], + string_lengths[count]); + ofs += string_lengths[count]; + } + presult->length = len; + + TALLOC_FREE(tmp_ctx); + + break; + } case REG_BINARY: *presult = data_blob_talloc(mem_ctx, value->v.binary.data, |