Author: obnox
Date: 2007-06-30 23:52:23 +0000 (Sat, 30 Jun 2007)
New Revision: 23668

WebSVN: 
http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=23668

Log:
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


Modified:
   branches/SAMBA_3_0/source/lib/util_reg_api.c
   branches/SAMBA_3_0_26/source/lib/util_reg_api.c


Changeset:
Modified: branches/SAMBA_3_0/source/lib/util_reg_api.c
===================================================================
--- branches/SAMBA_3_0/source/lib/util_reg_api.c        2007-06-30 22:31:13 UTC 
(rev 23667)
+++ branches/SAMBA_3_0/source/lib/util_reg_api.c        2007-06-30 23:52:23 UTC 
(rev 23668)
@@ -53,19 +53,33 @@
                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;
                }
+               else {
+                       if (!(tmp = SMB_MALLOC_ARRAY(smb_ucs2_t, num_ucs2+1))) {
+                               err = WERR_NOMEM;
+                               goto error;
+                       }
 
-               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);

Modified: branches/SAMBA_3_0_26/source/lib/util_reg_api.c
===================================================================
--- branches/SAMBA_3_0_26/source/lib/util_reg_api.c     2007-06-30 22:31:13 UTC 
(rev 23667)
+++ branches/SAMBA_3_0_26/source/lib/util_reg_api.c     2007-06-30 23:52:23 UTC 
(rev 23668)
@@ -53,19 +53,33 @@
                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;
                }
+               else {
+                       if (!(tmp = SMB_MALLOC_ARRAY(smb_ucs2_t, num_ucs2+1))) {
+                               err = WERR_NOMEM;
+                               goto error;
+                       }
 
-               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);

Reply via email to