* sexp.c (sexp_sscan): Check that parenthesis are matching.
authorWerner Koch <wk@gnupg.org>
Wed, 8 Oct 2003 08:36:06 +0000 (08:36 +0000)
committerWerner Koch <wk@gnupg.org>
Wed, 8 Oct 2003 08:36:06 +0000 (08:36 +0000)
* tsexp.c (check_sscan): New.

src/ChangeLog
src/gcrypt.h
src/sexp.c
tests/ChangeLog
tests/tsexp.c

index 1960c96..b032512 100644 (file)
@@ -1,3 +1,7 @@
+2003-10-07  Werner Koch  <wk@gnupg.org>
+
+       * sexp.c (sexp_sscan): Check that parenthesis are matching.
+
 2003-09-28  Moritz Schulte  <mo@g10code.com>
 
        * ath.c: Change License to LGPL.
index cc42dd6..de3c6f2 100644 (file)
@@ -42,7 +42,7 @@ extern "C" {
    autoconf (using the AM_PATH_GCRYPT macro) check that this header
    matches the installed library.  Note: Do not edit the next line as
    configure may fix the string here.  */
-#define GCRYPT_VERSION "1.1.43-cvs"
+#define GCRYPT_VERSION "1.1.44-cvs"
 
 /* Internal: We can't use the convenience macros for the multi
    precision integer functions when building this library. */
index 5de4c8c..f4a7e0b 100644 (file)
@@ -857,6 +857,7 @@ ABCDEFGHIJKLMNOPQRSTUVWXYZ\
   size_t dummy_erroff;
   struct make_space_ctx c;
   int arg_counter = 0;
+  int level = 0;
 
   if (! erroff)
     erroff = &dummy_erroff;
@@ -874,8 +875,9 @@ ABCDEFGHIJKLMNOPQRSTUVWXYZ\
     }                                                    \
   while (0)
 
-  /* FIXME: replace all the returns by a jump to the leave label
-   * and invent better error codes. Make sure that everything is cleaned up*/
+  /* FIXME: replace all the returns by a jump to the leave label and
+   * invent better error codes. FIXME: Make sure that everything is
+   * cleaned up. */
 #define MAKE_SPACE(n)  do { make_space ( &c, (n) ); } while (0)
 #define STORE_LEN(p,n) do {                                               \
                            DATALEN ashort = (n);                          \
@@ -1109,6 +1111,7 @@ ABCDEFGHIJKLMNOPQRSTUVWXYZ\
       }
       MAKE_SPACE (0);
       *c.pos++ = ST_OPEN;
+      level++;
     }
     else if( *p == ')' ) { /* walk up */
       if( disphint ) {
@@ -1118,6 +1121,7 @@ ABCDEFGHIJKLMNOPQRSTUVWXYZ\
       }
       MAKE_SPACE (0);
       *c.pos++ = ST_CLOSE;
+      level--;
     }
     else if( *p == '\"' ) {
       quoted = p;
@@ -1182,6 +1186,9 @@ ABCDEFGHIJKLMNOPQRSTUVWXYZ\
   MAKE_SPACE (0);
   *c.pos++ = ST_STOP;
 
+  if (level)
+    return gcry_error (GPG_ERR_SEXP_UNMATCHED_PAREN);
+
   *retsexp = normalize ( c.sexp );
   return gcry_error (GPG_ERR_NO_ERROR);
 #undef MAKE_SPACE
index 3eb947a..77660ff 100644 (file)
@@ -1,3 +1,7 @@
+2003-10-07  Werner Koch  <wk@gnupg.org>
+
+       * tsexp.c (check_sscan): New.
+
 2003-09-04  Werner Koch  <wk@gnupg.org>
 
        * pubkey.c (check_keys_crypt): Fix for compatibility mode.
index d725f74..1e73c0e 100644 (file)
@@ -271,6 +271,53 @@ back_and_forth (void)
 }
 
 
+static void
+check_sscan (void)
+{
+  static struct {
+    const char *text;
+    gcry_error_t expected_err;  
+  } values[] = {
+    /* Bug reported by Olivier L'Heureux 2003-10-07 */
+    { "(7:sig-val(3:dsa"
+      "(1:r20:\x7e\xff\xd5\xba\xc9\xc9\xa4\x9b\xd4\x26\x8b\x64"
+      "\x06\x7a\xcf\x42\x7b\x6c\x51\xfb)"
+      "(1:s21:\x01\x8c\x6c\x6f\x37\x1a\x8d\xfd\x5a\xb3\x2a\x3d"
+      "\xc5\xae\x23\xed\x32\x62\x30\x62\x3e)))",
+      GPG_ERR_NO_ERROR },
+    { "(7:sig-val(3:dsa"
+      "(1:r20:\x7e\xff\xd5\xba\xc9\xc9\xa4\x9b\xd4\x26\x8b\x64"
+      "\x06\x7a\xcf\x42\x7b\x6c\x51\xfb)"
+      "(1:s21:\x01\x8c\x6c\x6f\x37\x1a\x8d\xfd\x5a\xb3\x2a\x3d"
+      "\xc5\xae\x23\xed\x32\x62\x30\x62\x3e))",
+      GPG_ERR_SEXP_UNMATCHED_PAREN },
+    { "(7:sig-val(3:dsa"
+      "(1:r20:\x7e\xff\xd5\xba\xc9\xc9\xa4\x9b\xd4\x26\x8b\x64"
+      "\x06\x7a\xcf\x42\x7b\x6c\x51\xfb)"
+      "(1:s21:\x01\x8c\x6c\x6f\x37\x1a\x8d\xfd\x5a\xb3\x2a\x3d"
+      "\xc5\xae\x23\xed\x32\x62\x30\x62\x3e))))",
+      GPG_ERR_SEXP_UNMATCHED_PAREN },
+    { NULL, 0 }
+  };
+  int idx;
+  gcry_error_t err;
+  gcry_sexp_t s;
+
+  info ("checking gcry_sexp_sscan\n");
+  for (idx=0; values[idx].text; idx++)
+    {
+      err = gcry_sexp_sscan (&s, NULL,
+                             values[idx].text,
+                             strlen (values[idx].text));
+      if (gpg_err_code (err) != values[idx].expected_err)
+        fail ("gcry_sexp_sscan test %d failed: %s\n", idx, gpg_strerror (err));
+      gcry_sexp_release (s);
+    }
+}
+
+
+
+
 int
 main (int argc, char **argv)
 {
@@ -280,6 +327,7 @@ main (int argc, char **argv)
   basic ();
   canon_len ();
   back_and_forth ();
+  check_sscan ();
   
   return error_count? 1:0;
 }