Fix sample PQF
[yaz-moved-to-github.git] / odr / ber_len.c
index e772e73..2c76765 100644 (file)
@@ -1,26 +1,16 @@
 /*
- * Copyright (C) 1995-1999, Index Data.
+ * Copyright (C) 1995-2003, Index Data.
  * See the file LICENSE for details.
  * Sebastian Hammer, Adam Dickmeiss
  *
- * $Log: ber_len.c,v $
- * Revision 1.7  1999-01-08 11:23:23  adam
- * Added const modifier to some of the BER/ODR encoding routines.
- *
- * Revision 1.6  1995/09/29 17:12:17  quinn
- * Smallish
- *
- * Revision 1.5  1995/09/27  15:02:55  quinn
- * Modified function heads & prototypes.
- *
- * Revision 1.4  1995/05/16  08:50:45  quinn
- * License, documentation, and memory fixes
- *
- *
+ * $Id: ber_len.c,v 1.13 2003-10-20 13:44:05 adam Exp $
  */
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
 
 #include <stdio.h>
-#include <odr.h>
+#include "odr-priv.h"
 
 /*
  * Encode BER length octets. If exact, lenlen is the exact desired
@@ -89,16 +79,22 @@ int ber_enclen(ODR o, int len, int lenlen, int exact)
 }
 
 /*
- * Decode BER length octets. Returns number of bytes read or -1 for error.
+ * Decode BER length octets. Returns 
+ *  > 0  : number of bytes read 
+ *   -1  : not enough room to read bytes within max bytes
+ *   -2  : other error
+ *
  * After return:
- * len = -1   indefinite.
- * len >= 0    Length.
+ * len = -1   indefinite length.
+ * len >= 0   definite length
  */
-int ber_declen(const unsigned char *buf, int *len)
+int ber_declen(const unsigned char *buf, int *len, int max)
 {
     const unsigned char *b = buf;
     int n;
 
+    if (max < 1)
+        return -1;
     if (*b == 0X80)     /* Indefinite */
     {
        *len = -1;
@@ -116,16 +112,20 @@ int ber_declen(const unsigned char *buf, int *len)
        return 1;
     }
     if (*b == 0XFF)     /* reserved value */
-       return -1;
+       return -2;
     /* indefinite long form */ 
     n = *b & 0X7F;
+    if (n >= max)
+        return -1;
     *len = 0;
     b++;
-    while (n--)
+    while (--n >= 0)
     {
        *len <<= 8;
        *len |= *(b++);
     }
+    if (*len < 0)
+        return -2;
 #ifdef ODR_DEBUG
     fprintf(stderr, "[len=%d]", *len);
 #endif