X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=odr%2Fber_len.c;h=2c7676533f8fef6e6e18a3c2bc4b5b3231fb8e67;hp=c770780a01b201dd7c81c13d7151d4424b0f5e83;hb=c71d717ada2a9ef730d527f161eb5ba9aa641a9f;hpb=657fb99115b87a5244e9a33bbe4ca3d9d18849c4 diff --git a/odr/ber_len.c b/odr/ber_len.c index c770780..2c76765 100644 --- a/odr/ber_len.c +++ b/odr/ber_len.c @@ -1,20 +1,16 @@ /* - * 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.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 +#endif #include -#include +#include "odr-priv.h" /* * Encode BER length octets. If exact, lenlen is the exact desired @@ -24,7 +20,7 @@ * Returns: =0 success, indefinite start-marker set. 1 byte encoded. * Returns: -1 failure, out of bounds. */ -int MDF ber_enclen(ODR o, int len, int lenlen, int exact) +int ber_enclen(ODR o, int len, int lenlen, int exact) { unsigned char octs[sizeof(int)]; int n = 0; @@ -83,16 +79,22 @@ int MDF 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 MDF 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; @@ -110,16 +112,20 @@ int MDF ber_declen(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