* sexp.c (gcry_sexp_canon_len): Describe the error codes and
authorWerner Koch <wk@gnupg.org>
Thu, 20 Dec 2001 10:03:34 +0000 (10:03 +0000)
committerWerner Koch <wk@gnupg.org>
Thu, 20 Dec 2001 10:03:34 +0000 (10:03 +0000)
return an error if this is not a S-Exp; i.e. it does not start
with an open parenthesis.

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

index f3bc105..547ac5f 100644 (file)
@@ -1,3 +1,9 @@
+2001-12-20  Werner Koch  <wk@gnupg.org>
+
+       * sexp.c (gcry_sexp_canon_len): Describe the error codes and
+       return an error if this is not a S-Exp; i.e. it does not start
+       with an open parenthesis.
+
 2001-12-18  Werner Koch  <wk@gnupg.org>
 
        * sexp.c (gcry_sexp_canon_len): Fixed the test on NULL buffer.
index c6978e0..5c8a867 100644 (file)
@@ -35,7 +35,7 @@ extern "C" {
  * header matches the installed library.
  * Note: Do not edit the next line as configure may fix the string here.
  */
-#define GCRYPT_VERSION "1.1.5"
+#define GCRYPT_VERSION "1.1.5a-cvs"
 
 
 #ifndef HAVE_BYTE_TYPEDEF
index 4b3cb4c..23129c1 100644 (file)
@@ -1104,7 +1104,20 @@ gcry_sexp_sprint( const GCRY_SEXP list, int mode,
    it should never return 0.  If LENGTH is not zero, the maximum
    length to scan is given - this can be used for syntax checks of
    data passed from outside. erroce and erroff may both be passed as
-   NULL */
+   NULL
+
+   Errorcodes (for historic reasons they are all negative):
+    -1 := invalid length specification
+    -2 := string too long 
+    -3 := unmatched parenthesis
+    -4 := not a (canonical) S-expression
+    -5 := bad character 
+    -6 := invalid hex octal value or bad quotation
+    -7 := a length may not begin with zero 
+    -8 := nested display hints 
+    -9 := unmatched display hint close
+   -10 := unexpected reserved punctuation 
+ */
 size_t
 gcry_sexp_canon_len (const unsigned char *buffer, size_t length, 
                      size_t *erroff, int *errcode)
@@ -1126,6 +1139,8 @@ gcry_sexp_canon_len (const unsigned char *buffer, size_t length,
   *erroff = 0;
   if (!buffer)
     return 0;
+  if (*buffer != '(')
+    return -4; /* not a canonical S-expression */
 
   for (p=buffer; ; p++, count++ )
     {
@@ -1149,8 +1164,6 @@ gcry_sexp_canon_len (const unsigned char *buffer, size_t length,
               count += datalen;
               p += datalen;
               datalen = 0;
-              if (!level)
-                return count+1; /* expression is not a list - return now */
            }
           else if (digitp(p))
             datalen = datalen*10 + atoi_1(p);
@@ -1233,3 +1246,4 @@ gcry_sexp_canon_len (const unsigned char *buffer, size_t length,
     }
 }
 
+