X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=odr%2Fber_len.c;h=b4fdba606396671f18741df47bc4e6e456690b3a;hb=d3f87757eae53fd87d2e3e48a392a9e06872f71b;hp=e57997ab20f9da844f59175e45acb9f6b4c82e54;hpb=19af2bd8dfd21731cc978beccd1346133d614c67;p=yaz-moved-to-github.git diff --git a/odr/ber_len.c b/odr/ber_len.c index e57997a..b4fdba6 100644 --- a/odr/ber_len.c +++ b/odr/ber_len.c @@ -1,35 +1,16 @@ /* - * Copyright (C) 1995-2000, 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.9 2000-02-29 13:44:55 adam - * Check for config.h (currently not generated). - * - * Revision 1.8 1999/11/30 13:47:11 adam - * Improved installation. Moved header files to include/yaz. - * - * 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.12 2003-03-11 11:03:31 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 @@ -103,11 +84,13 @@ int ber_enclen(ODR o, int len, int lenlen, int exact) * len = -1 indefinite. * len >= 0 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; @@ -128,13 +111,17 @@ int ber_declen(const unsigned char *buf, int *len) return -1; /* 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 -1; #ifdef ODR_DEBUG fprintf(stderr, "[len=%d]", *len); #endif