From 7a3f98e5080ee2fadfe236e2ab6d34ddb05981fa Mon Sep 17 00:00:00 2001 From: Michael Adam Date: Sat, 30 Jun 2007 23:52:23 +0000 Subject: r23668: When creating a new string value, win2k regedit delivers one byte of data despite characters being two-byte. This modifies registry_pull_value, to change the data to the correct two-byte version of the empty string, (as delivered by winxp), when only one byte of data is received. Michael (This used to be commit a4c2b20296d6853cd1578601f17330cde75c4038) --- source3/lib/util_reg_api.c | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/source3/lib/util_reg_api.c b/source3/lib/util_reg_api.c index aad53e8e7c..423fdfd3be 100644 --- a/source3/lib/util_reg_api.c +++ b/source3/lib/util_reg_api.c @@ -53,19 +53,33 @@ WERROR registry_pull_value(TALLOC_CTX *mem_ctx, smb_ucs2_t *tmp; uint32 num_ucs2 = length / 2; - if ((length % 2) != 0) { + if (length == 1) { + /* win2k regedit gives us a string of 1 byte when + * creating a new value of type REG_SZ. this workaround + * replaces the input by using the same string as + * winxp delivers. */ + length = 2; + if (!(tmp = SMB_MALLOC_ARRAY(smb_ucs2_t, 2))) { + err = WERR_NOMEM; + goto error; + } + tmp[0] = 2; + tmp[1] = 0; + } + else if ((length % 2) != 0) { err = WERR_INVALID_PARAM; goto error; } - - if (!(tmp = SMB_MALLOC_ARRAY(smb_ucs2_t, num_ucs2+1))) { - err = WERR_NOMEM; - goto error; + else { + if (!(tmp = SMB_MALLOC_ARRAY(smb_ucs2_t, num_ucs2+1))) { + err = WERR_NOMEM; + goto error; + } + + memcpy((void *)tmp, (const void *)data, length); + tmp[num_ucs2] = 0; } - memcpy((void *)tmp, (const void *)data, length); - tmp[num_ucs2] = 0; - value->v.sz.len = convert_string_talloc( value, CH_UTF16LE, CH_UNIX, tmp, length+2, &value->v.sz.str, False); -- cgit