dbus/dbus dbus-auth-script.c, 1.12, 1.13 dbus-auth.c, 1.31, 1.32 dbus-errors.c, 1.23, 1.24 dbus-keyring.c, 1.21, 1.22 dbus-string.c, 1.46, 1.47 dbus-string.h, 1.23, 1.24

Kristian Hogsberg krh at pdx.freedesktop.org
Mon May 17 15:19:06 PDT 2004


Update of /cvs/dbus/dbus/dbus
In directory pdx:/tmp/cvs-serv12926/dbus

Modified Files:
	dbus-auth-script.c dbus-auth.c dbus-errors.c dbus-keyring.c 
	dbus-string.c dbus-string.h 
Log Message:
2004-05-17  Kristian Høgsberg  <krh at redhat.com>

	Remove base64 encoding, replace with hex encoding. Original patch
	from trow at ximian.com, added error handling.

	* dbus/dbus-string.c (_dbus_string_base64_encode)
	(_dbus_string_base64_decode): Remove.
	(_dbus_string_hex_decode): Add end_return argument so we can
	distinguish between OOM and invalid hex encoding.
	(_dbus_string_test): Remove base64 tests and add test case for
	invalid hex.

	* dbus/dbus-keyring.c, dbus/dbus-auth-script.c, dbus/dbus-auth.c:
	Replace base64 with hex.

	* test/data/auth/invalid-hex-encoding.auth-script: New test case
	for invalid hex encoded data in auth protocol.



Index: dbus-auth-script.c
===================================================================
RCS file: /cvs/dbus/dbus/dbus/dbus-auth-script.c,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -d -r1.12 -r1.13
--- a/dbus-auth-script.c	2 Dec 2003 10:44:21 -0000	1.12
+++ b/dbus-auth-script.c	17 May 2004 22:19:04 -0000	1.13
@@ -366,12 +366,12 @@
               goto out;
             }
 
-          /* Replace USERID_BASE64 with our username in base64 */
+          /* Replace USERID_HEX with our username in hex */
           {
             int where;
             
             if (_dbus_string_find (&to_send, 0,
-                                   "USERID_BASE64", &where))
+                                   "USERID_HEX", &where))
               {
                 DBusString username;
 
@@ -391,12 +391,12 @@
                     goto out;
                   }
 
-                _dbus_string_delete (&to_send, where, strlen ("USERID_BASE64"));
+                _dbus_string_delete (&to_send, where, strlen ("USERID_HEX"));
                 
-                if (!_dbus_string_base64_encode (&username, 0,
-                                                 &to_send, where))
+                if (!_dbus_string_hex_encode (&username, 0,
+					      &to_send, where))
                   {
-                    _dbus_warn ("no memory to subst USERID_BASE64\n");
+                    _dbus_warn ("no memory to subst USERID_HEX\n");
                     _dbus_string_free (&username);
                     _dbus_string_free (&to_send);
                     goto out;
@@ -405,7 +405,7 @@
                 _dbus_string_free (&username);
               }
             else if (_dbus_string_find (&to_send, 0,
-                                        "USERNAME_BASE64", &where))
+                                        "USERNAME_HEX", &where))
               {
                 DBusString username;
                 const DBusString *u;
@@ -427,12 +427,12 @@
                     goto out;
                   }
 
-                _dbus_string_delete (&to_send, where, strlen ("USERNAME_BASE64"));
+                _dbus_string_delete (&to_send, where, strlen ("USERNAME_HEX"));
                 
-                if (!_dbus_string_base64_encode (&username, 0,
-                                                 &to_send, where))
+                if (!_dbus_string_hex_encode (&username, 0,
+					      &to_send, where))
                   {
-                    _dbus_warn ("no memory to subst USERNAME_BASE64\n");
+                    _dbus_warn ("no memory to subst USERNAME_HEX\n");
                     _dbus_string_free (&username);
                     _dbus_string_free (&to_send);
                     goto out;

Index: dbus-auth.c
===================================================================
RCS file: /cvs/dbus/dbus/dbus/dbus-auth.c,v
retrieving revision 1.31
retrieving revision 1.32
diff -u -d -r1.31 -r1.32
--- a/dbus-auth.c	2 Dec 2003 10:44:21 -0000	1.31
+++ b/dbus-auth.c	17 May 2004 22:19:04 -0000	1.32
@@ -586,8 +586,8 @@
                             "DATA "))
     goto out;
   
-  if (!_dbus_string_base64_encode (&tmp2, 0, &auth->outgoing,
-                                   _dbus_string_get_length (&auth->outgoing)))
+  if (!_dbus_string_hex_encode (&tmp2, 0, &auth->outgoing,
+				_dbus_string_get_length (&auth->outgoing)))
     goto out;
 
   if (!_dbus_string_append (&auth->outgoing,
@@ -734,9 +734,9 @@
   if (!_dbus_username_from_current_process (&username))
     goto out_0;
 
-  if (!_dbus_string_base64_encode (username, 0,
-                                   response,
-                                   _dbus_string_get_length (response)))
+  if (!_dbus_string_hex_encode (username, 0,
+				response,
+				_dbus_string_get_length (response)))
     goto out_0;
 
   retval = TRUE;
@@ -919,9 +919,9 @@
   if (!_dbus_string_append (&auth->outgoing, "DATA "))
     goto out_6;
 
-  if (!_dbus_string_base64_encode (&tmp, 0,
-                                   &auth->outgoing,
-                                   _dbus_string_get_length (&auth->outgoing)))
+  if (!_dbus_string_hex_encode (&tmp, 0,
+				&auth->outgoing,
+				_dbus_string_get_length (&auth->outgoing)))
     {
       _dbus_string_set_length (&auth->outgoing, old_len);
       goto out_6;
@@ -1091,9 +1091,9 @@
                                  _dbus_getuid ()))
     goto failed;
 
-  if (!_dbus_string_base64_encode (&plaintext, 0,
-                                   response,
-                                   _dbus_string_get_length (response)))
+  if (!_dbus_string_hex_encode (&plaintext, 0,
+				response,
+				_dbus_string_get_length (response)))
     goto failed;
 
   _dbus_string_free (&plaintext);
@@ -1248,9 +1248,9 @@
     }
   else
     {
-      int i;
+      int i, end;
       DBusString mech;
-      DBusString base64_response;
+      DBusString hex_response;
       DBusString decoded_response;
       
       _dbus_string_find_blank (args, 0, &i);
@@ -1258,7 +1258,7 @@
       if (!_dbus_string_init (&mech))
         return FALSE;
 
-      if (!_dbus_string_init (&base64_response))
+      if (!_dbus_string_init (&hex_response))
         {
           _dbus_string_free (&mech);
           return FALSE;
@@ -1267,20 +1267,30 @@
       if (!_dbus_string_init (&decoded_response))
         {
           _dbus_string_free (&mech);
-          _dbus_string_free (&base64_response);
+          _dbus_string_free (&hex_response);
           return FALSE;
         }
 
       if (!_dbus_string_copy_len (args, 0, i, &mech, 0))
         goto failed;
 
-      if (!_dbus_string_copy (args, i, &base64_response, 0))
+      _dbus_string_skip_blank (args, i, &i);
+      if (!_dbus_string_copy (args, i, &hex_response, 0))
         goto failed;
 
-      if (!_dbus_string_base64_decode (&base64_response, 0,
-                                       &decoded_response, 0))
-        goto failed;
-      
+      if (!_dbus_string_hex_decode (&hex_response, 0, &end,
+				    &decoded_response, 0))
+	goto failed;
+
+      if (_dbus_string_get_length (&hex_response) != end)
+	{
+	  if (!_dbus_string_append (&auth->outgoing,
+				    "ERROR \"Invalid hex encoding\"\r\n"))
+	    goto failed;
+
+	  goto out;
+        }
+     
       auth->mech = find_mech (&mech, auth->allowed_mechs);
       if (auth->mech != NULL)
         {
@@ -1300,8 +1310,9 @@
             goto failed;
         }
 
+    out:
       _dbus_string_free (&mech);      
-      _dbus_string_free (&base64_response);
+      _dbus_string_free (&hex_response);
       _dbus_string_free (&decoded_response);
 
       return TRUE;
@@ -1309,7 +1320,7 @@
     failed:
       auth->mech = NULL;
       _dbus_string_free (&mech);
-      _dbus_string_free (&base64_response);
+      _dbus_string_free (&hex_response);
       _dbus_string_free (&decoded_response);
       return FALSE;
     }
@@ -1349,6 +1360,8 @@
                      const DBusString *command,
                      const DBusString *args)
 {
+  int end;
+
   if (auth->mech != NULL)
     {
       DBusString decoded;
@@ -1356,10 +1369,20 @@
       if (!_dbus_string_init (&decoded))
         return FALSE;
 
-      if (!_dbus_string_base64_decode (args, 0, &decoded, 0))
-        {
+      if (!_dbus_string_hex_decode (args, 0, &end, &decoded, 0))
+	{
           _dbus_string_free (&decoded);
-          return FALSE;
+	  return FALSE;
+	}
+
+      if (_dbus_string_get_length (args) != end)
+	{
+          _dbus_string_free (&decoded);
+	  if (!_dbus_string_append (&auth->outgoing,
+				    "ERROR \"Invalid hex encoding\"\r\n"))
+	    return FALSE;
+
+	  return TRUE;
         }
 
 #ifdef DBUS_ENABLE_VERBOSE_MODE
@@ -1632,6 +1655,8 @@
                      const DBusString *command,
                      const DBusString *args)
 {
+  int end;
+
   if (auth->mech != NULL)
     {
       DBusString decoded;
@@ -1639,10 +1664,20 @@
       if (!_dbus_string_init (&decoded))
         return FALSE;
 
-      if (!_dbus_string_base64_decode (args, 0, &decoded, 0))
+      if (!_dbus_string_hex_decode (args, 0, &end, &decoded, 0))
         {
           _dbus_string_free (&decoded);
-          return FALSE;
+	  return FALSE;
+	}
+
+      if (_dbus_string_get_length (args) != end)
+	{
+          _dbus_string_free (&decoded);
+	  if (!_dbus_string_append (&auth->outgoing,
+				    "ERROR \"Invalid hex encoding\"\r\n"))
+	    return FALSE;
+	  
+	  return TRUE;
         }
 
 #ifdef DBUS_ENABLE_VERBOSE_MODE

Index: dbus-errors.c
===================================================================
RCS file: /cvs/dbus/dbus/dbus/dbus-errors.c,v
retrieving revision 1.23
retrieving revision 1.24
diff -u -d -r1.23 -r1.24
--- a/dbus-errors.c	2 Dec 2003 10:44:21 -0000	1.23
+++ b/dbus-errors.c	17 May 2004 22:19:04 -0000	1.24
@@ -91,7 +91,7 @@
   else if (strcmp (error, DBUS_ERROR_DISCONNECTED) == 0)
     return "Disconnected.";
   else if (strcmp (error, DBUS_ERROR_INVALID_ARGS) == 0)
-    return "Invalid argumemts.";
+    return "Invalid arguments.";
   else if (strcmp (error, DBUS_ERROR_NO_REPLY) == 0)
     return "Did not get a reply message.";
   else if (strcmp (error, DBUS_ERROR_FILE_NOT_FOUND) == 0)

Index: dbus-keyring.c
===================================================================
RCS file: /cvs/dbus/dbus/dbus/dbus-keyring.c,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -d -r1.21 -r1.22
--- a/dbus-keyring.c	2 Dec 2003 10:44:21 -0000	1.21
+++ b/dbus-keyring.c	17 May 2004 22:19:04 -0000	1.22
@@ -474,6 +474,7 @@
       int id;
       long timestamp;
       int len;
+      int end;
       DBusKey *new;
 
       /* Don't load more than the max. */
@@ -542,13 +543,20 @@
       
       keys[n_keys-1].id = id;
       keys[n_keys-1].creation_time = timestamp;
-      if (!_dbus_string_hex_decode (&line, next,
-                                    &keys[n_keys-1].secret,
-                                    0))
-        {
-          dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);
-          goto out;
-        }
+      if (!_dbus_string_hex_decode (&line, next, &end,
+                                    &keys[n_keys-1].secret, 0))
+	{
+	  dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);
+	  goto out;
+	}
+
+      if (_dbus_string_get_length (&line) != end)
+	{
+	  _dbus_verbose ("invalid hex encoding in keyring file\n");
+	  _dbus_string_free (&keys[n_keys - 1].secret);
+	  n_keys -= 1;
+	  continue;
+	}
     }
 
   _dbus_verbose ("Successfully loaded %d existing keys\n",

Index: dbus-string.c
===================================================================
RCS file: /cvs/dbus/dbus/dbus/dbus-string.c,v
retrieving revision 1.46
retrieving revision 1.47
diff -u -d -r1.46 -r1.47
--- a/dbus-string.c	5 Mar 2004 14:05:33 -0000	1.46
+++ b/dbus-string.c	17 May 2004 22:19:04 -0000	1.47
@@ -2125,400 +2125,6 @@
   return TRUE;
 }
 
-static const signed char base64_table[] = {
-  /* 0 */ 'A',
-  /* 1 */ 'B',
-  /* 2 */ 'C',
-  /* 3 */ 'D',
-  /* 4 */ 'E',
-  /* 5 */ 'F',
-  /* 6 */ 'G',
-  /* 7 */ 'H',
-  /* 8 */ 'I',
-  /* 9 */ 'J',
-  /* 10 */ 'K',
-  /* 11 */ 'L',
-  /* 12 */ 'M',
-  /* 13 */ 'N',
-  /* 14 */ 'O',
-  /* 15 */ 'P',
-  /* 16 */ 'Q',
-  /* 17 */ 'R',
-  /* 18 */ 'S',
-  /* 19 */ 'T',
-  /* 20 */ 'U',
-  /* 21 */ 'V',
-  /* 22 */ 'W',
-  /* 23 */ 'X',
-  /* 24 */ 'Y',
-  /* 25 */ 'Z',
-  /* 26 */ 'a',
-  /* 27 */ 'b',
-  /* 28 */ 'c',
-  /* 29 */ 'd',
-  /* 30 */ 'e',
-  /* 31 */ 'f',
-  /* 32 */ 'g',
-  /* 33 */ 'h',
-  /* 34 */ 'i',
-  /* 35 */ 'j',
-  /* 36 */ 'k',
-  /* 37 */ 'l',
-  /* 38 */ 'm',
-  /* 39 */ 'n',
-  /* 40 */ 'o',
-  /* 41 */ 'p',
-  /* 42 */ 'q',
-  /* 43 */ 'r',
-  /* 44 */ 's',
-  /* 45 */ 't',
-  /* 46 */ 'u',
-  /* 47 */ 'v',
-  /* 48 */ 'w',
-  /* 49 */ 'x',
-  /* 50 */ 'y',
-  /* 51 */ 'z',
-  /* 52 */ '0',
-  /* 53 */ '1',
-  /* 54 */ '2',
-  /* 55 */ '3',
-  /* 56 */ '4',
-  /* 57 */ '5',
-  /* 58 */ '6',
-  /* 59 */ '7',
-  /* 60 */ '8',
-  /* 61 */ '9',
-  /* 62 */ '+',
-  /* 63 */ '/'
-};
-
-/** The minimum char that's a valid char in Base64-encoded text */
-#define UNBASE64_MIN_CHAR (43)
-/** The maximum char that's a valid char in Base64-encoded text */
-#define UNBASE64_MAX_CHAR (122)
-/** Must subtract this from a char's integer value before offsetting
- * into unbase64_table
- */
-#define UNBASE64_TABLE_OFFSET UNBASE64_MIN_CHAR
-static const signed char unbase64_table[] = {
-  /* 43 + */ 62,
-  /* 44 , */ -1,
-  /* 45 - */ -1,
-  /* 46 . */ -1,
-  /* 47 / */ 63,
-  /* 48 0 */ 52,
-  /* 49 1 */ 53,
-  /* 50 2 */ 54,
-  /* 51 3 */ 55,
-  /* 52 4 */ 56,
-  /* 53 5 */ 57,
-  /* 54 6 */ 58,
-  /* 55 7 */ 59,
-  /* 56 8 */ 60,
-  /* 57 9 */ 61,
-  /* 58 : */ -1,
-  /* 59 ; */ -1,
-  /* 60 < */ -1,
-  /* 61 = */ -1,
-  /* 62 > */ -1,
-  /* 63 ? */ -1,
-  /* 64 @ */ -1,
-  /* 65 A */ 0,
-  /* 66 B */ 1,
-  /* 67 C */ 2,
-  /* 68 D */ 3,
-  /* 69 E */ 4,
-  /* 70 F */ 5,
-  /* 71 G */ 6,
-  /* 72 H */ 7,
-  /* 73 I */ 8,
-  /* 74 J */ 9,
-  /* 75 K */ 10,
-  /* 76 L */ 11,
-  /* 77 M */ 12,
-  /* 78 N */ 13,
-  /* 79 O */ 14,
-  /* 80 P */ 15,
-  /* 81 Q */ 16,
-  /* 82 R */ 17,
-  /* 83 S */ 18,
-  /* 84 T */ 19,
-  /* 85 U */ 20,
-  /* 86 V */ 21,
-  /* 87 W */ 22,
-  /* 88 X */ 23,
-  /* 89 Y */ 24,
-  /* 90 Z */ 25,
-  /* 91 [ */ -1,
-  /* 92 \ */ -1,
-  /* 93 ] */ -1,
-  /* 94 ^ */ -1,
-  /* 95 _ */ -1,
-  /* 96 ` */ -1,
-  /* 97 a */ 26,
-  /* 98 b */ 27,
-  /* 99 c */ 28,
-  /* 100 d */ 29,
-  /* 101 e */ 30,
-  /* 102 f */ 31,
-  /* 103 g */ 32,
-  /* 104 h */ 33,
-  /* 105 i */ 34,
-  /* 106 j */ 35,
-  /* 107 k */ 36,
-  /* 108 l */ 37,
-  /* 109 m */ 38,
-  /* 110 n */ 39,
-  /* 111 o */ 40,
-  /* 112 p */ 41,
-  /* 113 q */ 42,
-  /* 114 r */ 43,
-  /* 115 s */ 44,
-  /* 116 t */ 45,
-  /* 117 u */ 46,
-  /* 118 v */ 47,
-  /* 119 w */ 48,
-  /* 120 x */ 49,
-  /* 121 y */ 50,
-  /* 122 z */ 51
-};
-
-/**
- * Encodes a string using Base64, as documented in RFC 2045.
- *
- * @param source the string to encode
- * @param start byte index to start encoding
- * @param dest string where encoded data should be placed
- * @param insert_at where to place encoded data
- * @returns #TRUE if encoding was successful, #FALSE if no memory etc.
- */
-dbus_bool_t
-_dbus_string_base64_encode (const DBusString *source,
-                            int               start,
-                            DBusString       *dest,
-                            int               insert_at)
-{
-  int source_len;
-  unsigned int dest_len; /* unsigned for overflow checks below */
-  const unsigned char *s;
-  unsigned char *d;
-  const unsigned char *triplet_end;
-  const unsigned char *final_end;
-  DBUS_STRING_COPY_PREAMBLE (source, start, dest, insert_at);  
-  _dbus_assert (source != dest);
-  
-  /* For each 24 bits (3 bytes) of input, we have 4 bytes of
-   * output.
-   */
-  source_len = real_source->len - start;
-  dest_len = (source_len / 3) * 4;
-  if (source_len % 3 != 0)
-    dest_len += 4;
-
-  if (dest_len > (unsigned int) real_dest->max_length)
-    return FALSE;
-  
-  if (source_len == 0)
-    return TRUE;
-  
-  if (!open_gap (dest_len, real_dest, insert_at))
-    return FALSE;
-
-  d = real_dest->str + insert_at;
-  s = real_source->str + start;
-  final_end = real_source->str + (start + source_len);
-  triplet_end = final_end - (source_len % 3);
-  _dbus_assert (triplet_end <= final_end);
-  _dbus_assert ((final_end - triplet_end) < 3);
-
-#define ENCODE_64(v) (base64_table[ (unsigned char) (v) ])
-#define SIX_BITS_MASK (0x3f)
-  _dbus_assert (SIX_BITS_MASK < _DBUS_N_ELEMENTS (base64_table));
-  
-  while (s != triplet_end)
-    {
-      unsigned int triplet;
-
-      triplet = s[2] | (s[1] << 8) | (s[0] << 16);
-
-      /* Encode each 6 bits. */
-
-      *d++ = ENCODE_64 (triplet >> 18);
-      *d++ = ENCODE_64 ((triplet >> 12) & SIX_BITS_MASK);
-      *d++ = ENCODE_64 ((triplet >> 6) & SIX_BITS_MASK);
-      *d++ = ENCODE_64 (triplet & SIX_BITS_MASK);
-      
-      s += 3;
-    }
-
-  switch (final_end - triplet_end)
-    {
-    case 2:
-      {
-        unsigned int doublet;
-        
-        doublet = s[1] | (s[0] << 8);        
-
-        *d++ = ENCODE_64 (doublet >> 12);
-        *d++ = ENCODE_64 ((doublet >> 6) & SIX_BITS_MASK);
-        *d++ = ENCODE_64 (doublet & SIX_BITS_MASK);
-        *d++ = '=';
-      }
-      break;
-    case 1:
-      {
-        unsigned int singlet;
-        
-        singlet = s[0];
-
-        *d++ = ENCODE_64 ((singlet >> 6) & SIX_BITS_MASK);
-        *d++ = ENCODE_64 (singlet & SIX_BITS_MASK);
-        *d++ = '=';
-        *d++ = '=';
-      }
-      break;
-    case 0:
-      break;
-    }
-
-  _dbus_assert (d == (real_dest->str + (insert_at + dest_len)));
-
-  return TRUE;
-}
-
-/**
- * Decodes a string from Base64, as documented in RFC 2045.
- *
- * @todo sort out the AUDIT comment in here. The case it mentions
- * ("====" or "x===") is not allowed in correct base64, so need to
- * decide what to do with that kind of input. Probably ignore it
- * since we ignore any other junk seen.
- *
- * @param source the string to decode
- * @param start byte index to start decode
- * @param dest string where decoded data should be placed
- * @param insert_at where to place decoded data
- * @returns #TRUE if decoding was successful, #FALSE if no memory etc.
- */
-dbus_bool_t
-_dbus_string_base64_decode (const DBusString *source,
-                            int               start,
-                            DBusString       *dest,
-                            int               insert_at)
-{
-  int source_len;
-  const char *s;
-  const char *end;
-  DBusString result;
-  unsigned int triplet = 0;
-  int sextet_count;
-  int pad_count;
-  DBUS_STRING_COPY_PREAMBLE (source, start, dest, insert_at);
-  _dbus_assert (source != dest);
-  
-  source_len = real_source->len - start;
-  s = real_source->str + start;
-  end = real_source->str + source_len;
-
-  if (source_len == 0)
-    return TRUE;
-
-  if (!_dbus_string_init (&result))
-    return FALSE;
-
-  pad_count = 0;
-  sextet_count = 0;
-  while (s != end)
-    {
-      /* The idea is to just skip anything that isn't
-       * a base64 char - it's allowed to have whitespace,
-       * newlines, etc. in here. We also ignore trailing
-       * base64 chars, though that's suspicious.
-       */
-      
-      if (*s >= UNBASE64_MIN_CHAR &&
-          *s <= UNBASE64_MAX_CHAR)
-        {
-          if (*s == '=')
-            {
-              /* '=' is padding, doesn't represent additional data
-               * but does increment our count.
-               */
-              pad_count += 1;
-              sextet_count += 1;
-            }
-          else
-            {
-              int val;
-
-              val = unbase64_table[(*s) - UNBASE64_TABLE_OFFSET];
-
-              if (val >= 0)
-                {
-                  triplet <<= 6;
-                  triplet |= (unsigned int) val;
-                  sextet_count += 1;
-                }
-            }
-
-          if (sextet_count == 4)
-            {
-              /* no pad = 3 bytes, 1 pad = 2 bytes, 2 pad = 1 byte */
-
-
-	      /* AUDIT: Comment doesn't mention 4 pad => 0,
-	       *         3 pad => 1 byte, though the code should
-	       *        work fine if those are the required outputs.
-	       *
-	       *        I assume that the spec requires dropping
-	       *        the top two bits of, say, ///= which is > 2 
-	       *        bytes worth of bits. (Or otherwise, you couldn't
-	       *        actually represent 2 byte sequences.
-	       */
-              
-              if (pad_count < 1)
-                {
-                  if (!_dbus_string_append_byte (&result,
-                                                 triplet >> 16))
-                    goto failed;
-                }
-              
-              if (pad_count < 2)
-                {
-                  if (!_dbus_string_append_byte (&result,
-                                                 (triplet >> 8) & 0xff))
-                    goto failed;
-                }
-              
-              if (!_dbus_string_append_byte (&result,
-                                             triplet & 0xff))
-                goto failed;
-              
-              sextet_count = 0;
-              pad_count = 0;
-              triplet = 0;
-            }
-        }
-      
-      ++s;
-    }
-
-  if (!_dbus_string_move (&result, 0, dest, insert_at))
-    {
-      _dbus_string_free (&result);
-      return FALSE;
-    }
-
-  _dbus_string_free (&result);
-
-  return TRUE;
-
- failed:
-  _dbus_string_free (&result);
-
-  return FALSE;
-}
-
 /**
  * Encodes a string in hex, the way MD5 and SHA-1 are usually
  * encoded. (Each byte is two hex digits.)
@@ -2583,13 +2189,15 @@
  *
  * @param source the string to decode
  * @param start byte index to start decode
+ * @param end_return return location of the end of the hex data, or #NULL
  * @param dest string where decoded data should be placed
  * @param insert_at where to place decoded data
- * @returns #TRUE if decoding was successful, #FALSE if no memory etc.
+ * @returns #TRUE if decoding was successful, #FALSE if no memory.
  */
 dbus_bool_t
 _dbus_string_hex_decode (const DBusString *source,
                          int               start,
+			 int              *end_return,
                          DBusString       *dest,
                          int               insert_at)
 {
@@ -2672,17 +2280,14 @@
           val = 15;
           break;
         default:
-          val = 0;
-          _dbus_verbose ("invalid character '%c' in hex encoded text\n",
-                         *p);
-          goto out;
+          goto done;
         }
 
       if (high_bits)
         {
           if (!_dbus_string_append_byte (&result,
                                          val << 4))
-            goto out;
+	    goto out;
         }
       else
         {
@@ -2703,9 +2308,13 @@
       ++p;
     }
 
+ done:
   if (!_dbus_string_move (&result, 0, dest, insert_at))
     goto out;
 
+  if (end_return)
+    *end_return = p - (const unsigned char*) _dbus_string_get_const_data (source);
+
   retval = TRUE;
   
  out:
@@ -3228,60 +2837,13 @@
 }
 
 static void
-test_base64_roundtrip (const unsigned char *data,
-                       int                  len)
-{
-  DBusString orig;
-  DBusString encoded;
-  DBusString decoded;
-
-  if (len < 0)
-    len = strlen (data);
-  
-  if (!_dbus_string_init (&orig))
-    _dbus_assert_not_reached ("could not init string");
-
-  if (!_dbus_string_init (&encoded))
-    _dbus_assert_not_reached ("could not init string");
-  
-  if (!_dbus_string_init (&decoded))
-    _dbus_assert_not_reached ("could not init string");
-
-  if (!_dbus_string_append_len (&orig, data, len))
-    _dbus_assert_not_reached ("couldn't append orig data");
-
-  if (!_dbus_string_base64_encode (&orig, 0, &encoded, 0))
-    _dbus_assert_not_reached ("could not encode");
-
-  if (!_dbus_string_base64_decode (&encoded, 0, &decoded, 0))
-    _dbus_assert_not_reached ("could not decode");
-
-  if (!_dbus_string_equal (&orig, &decoded))
-    {
-      const char *s;
-      
-      printf ("Original string %d bytes encoded %d bytes decoded %d bytes\n",
-              _dbus_string_get_length (&orig),
-              _dbus_string_get_length (&encoded),
-              _dbus_string_get_length (&decoded));
-      printf ("Original: %s\n", data);
-      s = _dbus_string_get_const_data (&decoded);
-      printf ("Decoded: %s\n", s);
-      _dbus_assert_not_reached ("original string not the same as string decoded from base64");
-    }
-  
-  _dbus_string_free (&orig);
-  _dbus_string_free (&encoded);
-  _dbus_string_free (&decoded);  
-}
-
-static void
 test_hex_roundtrip (const unsigned char *data,
                     int                  len)
 {
   DBusString orig;
   DBusString encoded;
   DBusString decoded;
+  int end;
 
   if (len < 0)
     len = strlen (data);
@@ -3301,9 +2863,11 @@
   if (!_dbus_string_hex_encode (&orig, 0, &encoded, 0))
     _dbus_assert_not_reached ("could not encode");
 
-  if (!_dbus_string_hex_decode (&encoded, 0, &decoded, 0))
+  if (!_dbus_string_hex_decode (&encoded, 0, &end, &decoded, 0))
     _dbus_assert_not_reached ("could not decode");
     
+  _dbus_assert (_dbus_string_get_length (&encoded) == end);
+
   if (!_dbus_string_equal (&orig, &decoded))
     {
       const char *s;
@@ -3315,7 +2879,7 @@
       printf ("Original: %s\n", data);
       s = _dbus_string_get_const_data (&decoded);
       printf ("Decoded: %s\n", s);
-      _dbus_assert_not_reached ("original string not the same as string decoded from base64");
+      _dbus_assert_not_reached ("original string not the same as string decoded from hex");
     }
   
   _dbus_string_free (&orig);
@@ -3867,8 +3431,18 @@
   
   _dbus_string_free (&str);
 
-  /* Base 64 and Hex encoding */
-  test_roundtrips (test_base64_roundtrip);
+  /* Hex encoding */
+  _dbus_string_init_const (&str, "cafebabe, this is a bogus hex string");
+  if (!_dbus_string_init (&other))
+    _dbus_assert_not_reached ("could not init string");
+
+  if (!_dbus_string_hex_decode (&str, 0, &end, &other, 0))
+    _dbus_assert_not_reached ("deccoded bogus hex string with no error");
+
+  _dbus_assert (end == 8);
+
+  _dbus_string_free (&other);
+
   test_roundtrips (test_hex_roundtrip);
 
   /* Path validation */

Index: dbus-string.h
===================================================================
RCS file: /cvs/dbus/dbus/dbus/dbus-string.h,v
retrieving revision 1.23
retrieving revision 1.24
diff -u -d -r1.23 -r1.24
--- a/dbus-string.h	2 Dec 2003 10:44:21 -0000	1.23
+++ b/dbus-string.h	17 May 2004 22:19:04 -0000	1.24
@@ -202,20 +202,13 @@
                                                   DBusString        *dest);
 void          _dbus_string_delete_first_word     (DBusString        *str);
 void          _dbus_string_delete_leading_blanks (DBusString        *str);
-dbus_bool_t   _dbus_string_base64_encode         (const DBusString  *source,
-                                                  int                start,
-                                                  DBusString        *dest,
-                                                  int                insert_at);
-dbus_bool_t   _dbus_string_base64_decode         (const DBusString  *source,
-                                                  int                start,
-                                                  DBusString        *dest,
-                                                  int                insert_at);
 dbus_bool_t   _dbus_string_hex_encode            (const DBusString  *source,
                                                   int                start,
                                                   DBusString        *dest,
                                                   int                insert_at);
 dbus_bool_t   _dbus_string_hex_decode            (const DBusString  *source,
                                                   int                start,
+						  int               *end_return,
                                                   DBusString        *dest,
                                                   int                insert_at);
 dbus_bool_t   _dbus_string_validate_ascii        (const DBusString  *str,




More information about the dbus-commit mailing list