r23668: When creating a new string value, win2k regedit delivers
authorMichael Adam <obnox@samba.org>
Sat, 30 Jun 2007 23:52:23 +0000 (23:52 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 17:23:44 +0000 (12:23 -0500)
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

index aad53e8e7c4b96cac7652675966740bf6c2ac284..423fdfd3be53dc89fbc8d8770ea26beefc73c786 100644 (file)
@@ -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);