When creating a new string value, win2k regedit delivers
authorobnox <obnox@0c0555d6-39d7-0310-84fc-f1cc0bd64818>
Sat, 30 Jun 2007 23:52:23 +0000 (23:52 +0000)
committerobnox <obnox@0c0555d6-39d7-0310-84fc-f1cc0bd64818>
Sat, 30 Jun 2007 23:52:23 +0000 (23:52 +0000)
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

git-svn-id: svn+ssh://svn.samba.org/data/svn/samba/branches/SAMBA_3_0@23668 0c0555d6-39d7-0310-84fc-f1cc0bd64818

source/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);