summaryrefslogtreecommitdiff
path: root/source3
diff options
context:
space:
mode:
authorMichael Adam <obnox@samba.org>2007-06-30 23:52:23 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 12:23:44 -0500
commit7a3f98e5080ee2fadfe236e2ab6d34ddb05981fa (patch)
treea613077c1d696eaa40b7d96bbf617cacbc3cb6dd /source3
parentba2dc0530fa6fc7353655812be24444478e12ba1 (diff)
downloadsamba-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')
-rw-r--r--source3/lib/util_reg_api.c30
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);