X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=odr%2Fber_tag.c;h=98b8a95c13d03127e887041e7b5a87520c0b9ddd;hb=29a22396d7d7b1219f5b83c35983c8fb1cd79e8f;hp=61a68723848430bc6f2905b60a548bf074f51d57;hpb=569f86b4615c2731727be2a0ff898d36f9725819;p=yaz-moved-to-github.git diff --git a/odr/ber_tag.c b/odr/ber_tag.c index 61a6872..98b8a95 100644 --- a/odr/ber_tag.c +++ b/odr/ber_tag.c @@ -1,9 +1,9 @@ /* - * Copyright (c) 1995-2002, Index Data + * Copyright (c) 1995-2003, Index Data * See the file LICENSE for details. * Sebastian Hammer, Adam Dickmeiss * - * $Id: ber_tag.c,v 1.23 2002-07-25 12:51:08 adam Exp $ + * $Id: ber_tag.c,v 1.27 2003-05-24 19:20:14 adam Exp $ */ #if HAVE_CONFIG_H #include @@ -22,7 +22,8 @@ * * Should perhaps be odr_tag? */ -int ber_tag(ODR o, void *p, int zclass, int tag, int *constructed, int opt) +int ber_tag(ODR o, void *p, int zclass, int tag, int *constructed, int opt, + const char *name) { struct Odr_ber_tag *odr_ber_tag = &o->op->odr_ber_tag; int rd; @@ -44,7 +45,10 @@ int ber_tag(ODR o, void *p, int zclass, int tag, int *constructed, int opt) if (!*pp) { if (!opt) - o->error = OREQUIRED; + { + odr_seterror(o, OREQUIRED, 24); + odr_setelement (o, name); + } return 0; } if ((rd = ber_enctag(o, zclass, tag, *constructed)) < 0) @@ -59,15 +63,21 @@ int ber_tag(ODR o, void *p, int zclass, int tag, int *constructed, int opt) if (o->op->stackp > -1 && !odr_constructed_more(o)) { if (!opt) - o->error = OREQUIRED; + { + odr_seterror(o, OREQUIRED, 25); + odr_setelement(o, name); + } return 0; } if (odr_ber_tag->lclass < 0) { - if ((odr_ber_tag->br = ber_dectag(o->bp, &odr_ber_tag->lclass, - &odr_ber_tag->ltag, &odr_ber_tag->lcons)) <= 0) + if ((odr_ber_tag->br = + ber_dectag(o->bp, &odr_ber_tag->lclass, + &odr_ber_tag->ltag, &odr_ber_tag->lcons, + odr_max(o))) <= 0) { - o->error = OPROTO; + odr_seterror(o, OPROTO, 26); + odr_setelement(o, name); return 0; } #ifdef ODR_DEBUG @@ -87,15 +97,22 @@ int ber_tag(ODR o, void *p, int zclass, int tag, int *constructed, int opt) else { if (!opt) - o->error = OREQUIRED; + { + odr_seterror(o, OREQUIRED, 27); + odr_setelement(o, name); + } return 0; } case ODR_PRINT: if (!*pp && !opt) - o->error = OREQUIRED; + { + odr_seterror(o,OREQUIRED, 28); + odr_setelement(o, name); + } return *pp != 0; default: - o->error = OOTHER; + odr_seterror(o, OOTHER, 29); + odr_setelement(o, name); return 0; } } @@ -144,23 +161,26 @@ int ber_enctag(ODR o, int zclass, int tag, int constructed) /* ber_dectag * Decode BER identifier octets. Return number of bytes read or -1 for error. */ -int ber_dectag(const unsigned char *buf, int *zclass, int *tag, int *constructed) +int ber_dectag(const unsigned char *b, int *zclass, int *tag, + int *constructed, int max) { - const unsigned char *b = buf; + int l = 1; + + if (l > max) + return -1; *zclass = *b >> 6; *constructed = (*b >> 5) & 0X01; if ((*tag = *b & 0x1F) <= 30) return 1; - b++; *tag = 0; do { + if (l >= max) + return -1; *tag <<= 7; - *tag |= *b & 0X7F; - if (b - buf >= 5) /* Precaution */ - return -1; + *tag |= b[l] & 0X7F; } - while (*(b++) & 0X80); - return b - buf; + while (b[l++] & 0X80); + return l; }