diff options
author | Michael Adam <obnox@samba.org> | 2007-06-30 23:52:23 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 12:23:44 -0500 |
commit | 7a3f98e5080ee2fadfe236e2ab6d34ddb05981fa (patch) | |
tree | a613077c1d696eaa40b7d96bbf617cacbc3cb6dd /source3/lib | |
parent | ba2dc0530fa6fc7353655812be24444478e12ba1 (diff) | |
download | samba-7a3f98e5080ee2fadfe236e2ab6d34ddb05981fa.tar.gz samba-7a3f98e5080ee2fadfe236e2ab6d34ddb05981fa.tar.bz2 samba-7a3f98e5080ee2fadfe236e2ab6d34ddb05981fa.zip |
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)
Diffstat (limited to 'source3/lib')
-rw-r--r-- | source3/lib/util_reg_api.c | 30 |
1 files 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); |