X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=odr%2Fber_tag.c;h=8c3e18626994a00c54ab4751d78cd3c438be11c7;hb=ec1f815d5348cd21e393f76bc212c910c34bbc45;hp=9172075877daa9ad2fa117ea5e33f13419cc8a3a;hpb=4d531a1a9131d69c3b6c27fbac42837e22cff61c;p=yaz-moved-to-github.git diff --git a/odr/ber_tag.c b/odr/ber_tag.c index 9172075..8c3e186 100644 --- a/odr/ber_tag.c +++ b/odr/ber_tag.c @@ -3,7 +3,7 @@ * See the file LICENSE for details. * Sebastian Hammer, Adam Dickmeiss * - * $Id: ber_tag.c,v 1.24 2003-01-06 08:20:27 adam Exp $ + * $Id: ber_tag.c,v 1.26 2003-05-20 19:55:29 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_setaddinfo (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_setaddinfo(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_setaddinfo(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_setaddinfo(o, name); + } return 0; } case ODR_PRINT: if (!*pp && !opt) - o->error = OREQUIRED; + { + odr_seterror(o,OREQUIRED, 28); + odr_setaddinfo(o, name); + } return *pp != 0; default: - o->error = OOTHER; + odr_seterror(o, OOTHER, 29); + odr_setaddinfo(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; }