/*
- * Copyright (C) 1995, 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.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
}
/*
- * 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(unsigned char *buf, int *len)
+int ber_declen(const unsigned char *buf, int *len, int max)
{
- unsigned char *b = buf;
+ const unsigned char *b = buf;
int n;
+ if (max < 1)
+ return -1;
if (*b == 0X80) /* Indefinite */
{
*len = -1;
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