From 346311370361ec56af79a2f7756c9a8db4f55a68 Mon Sep 17 00:00:00 2001 From: Adam Dickmeiss Date: Thu, 24 Aug 2006 13:10:03 +0000 Subject: [PATCH] completeBER, completeBER_n no longer checks for a maximum size of 5 MB. Too large packages to be rejected are dealt with in comstack instead. --- src/ber_any.c | 60 ++++++++++++++++----------------------------------------- 1 file changed, 17 insertions(+), 43 deletions(-) diff --git a/src/ber_any.c b/src/ber_any.c index 8899dde..0c73bd7 100644 --- a/src/ber_any.c +++ b/src/ber_any.c @@ -1,8 +1,8 @@ /* - * Copyright (C) 1995-2005, Index Data ApS + * Copyright (C) 1995-2006, Index Data ApS * See the file LICENSE for details. * - * $Id: ber_any.c,v 1.4 2005-06-25 15:46:03 adam Exp $ + * $Id: ber_any.c,v 1.5 2006-08-24 13:10:03 adam Exp $ */ /** @@ -47,23 +47,17 @@ int ber_any(ODR o, Odr_any **p) #define BER_ANY_DEBUG 0 -/* - * Return length of BER-package or 0. - */ int completeBER_n(const unsigned char *buf, int len, int level) { int res, ll, zclass, tag, cons; const unsigned char *b = buf; - int bad = 0; - if (len > 5000000 || level > 1000) + if (level > 1000) { - bad = 1; #if BER_ANY_DEBUG - yaz_log(LOG_LOG, "completeBER lev=%d len=%d", level, len); + yaz_log(YLOG_LOG, "completeBER lev=%d len=%d", level, len); #endif - if (level > 1000) - return -2; + return -2; } if (len < 2) return 0; @@ -71,11 +65,6 @@ int completeBER_n(const unsigned char *buf, int len, int level) return -2; if ((res = ber_dectag(b, &zclass, &tag, &cons, len)) <= 0) return 0; -#if 0 -/* removed, since ber_dectag never reads that far .. */ - if (res > len) - return 0; -#endif b += res; len -= res; assert (len >= 0); @@ -83,54 +72,36 @@ int completeBER_n(const unsigned char *buf, int len, int level) if (res == -2) { #if BER_ANY_DEBUG - if (bad) - yaz_log(LOG_LOG, "<<<<<<<<< return1 lev=%d res=%d", level, res); + yaz_log(YLOG_LOG, "<<<<<<<<< return1 lev=%d res=%d", level, res); #endif return -1; /* error */ } if (res == -1) { #if BER_ANY_DEBUG - if (bad) - yaz_log(LOG_LOG, "<<<<<<<<< return3 lev=%d res=-1", level); + yaz_log(YLOG_LOG, "<<<<<<<<< return2 lev=%d res=%d", level, res); #endif return 0; /* incomplete length */ } - if (ll > 5000000) - { -#if BER_ANY_DEBUG - if (bad) - yaz_log(LOG_LOG, "<<<<<<<<< return2 lev=%d len=%d res=%d ll=%d", - level, len, res, ll); -#endif - return -1; /* error */ - } -#if 0 -/* no longer necessary, since ber_declen never reads that far (returns -1) */ - if (res > len) - { - if (bad) - yaz_log(LOG_LOG, "<<<<<<<<< return4 lev=%d res=%d len=%d", - level, res, len); - return 0; - } -#endif b += res; len -= res; if (ll >= 0) { /* definite length */ + if (len < ll) + { #if BER_ANY_DEBUG - if (bad && len < ll) - yaz_log(LOG_LOG, "<<<<<<<<< return5 lev=%d len=%d ll=%d", + yaz_log(YLOG_LOG, "<<<<<<<<< return5 lev=%d len=%d ll=%d", level, len, ll); #endif - return (len >= ll ? ll + (b-buf) : 0); + return 0; + } + return ll + (b-buf); } /* indefinite length */ if (!cons) { /* if primitive, it's an error */ #if BER_ANY_DEBUG - yaz_log(LOG_LOG, "<<<<<<<<< return6 lev=%d ll=%d len=%d res=%d", + yaz_log(YLOG_LOG, "<<<<<<<<< return6 lev=%d ll=%d len=%d res=%d", level, ll, len, res); #endif return -1; /* error */ @@ -155,6 +126,9 @@ int completeBER_n(const unsigned char *buf, int len, int level) int completeBER(const unsigned char *buf, int len) { int res = completeBER_n(buf, len, 0); +#if BER_ANY_DEBUG + yaz_log(YLOG_LOG, "completeBER len=%d res=%d", len, res); +#endif if (res < 0) return len; return res; -- 1.7.10.4