X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fber_oid.c;h=ed05298ca4d1c4d859086d0570a44e9c4d6a8528;hb=a1f888c8d35ebce2c0b3a6be4e7dc4f7d9dfcf63;hp=e1947d69dc67fe1408c2ab1a1ea2b20256b3efc1;hpb=e497fb7edee04454e0f08fd1ed975fa6966341ac;p=yaz-moved-to-github.git diff --git a/src/ber_oid.c b/src/ber_oid.c index e1947d6..ed05298 100644 --- a/src/ber_oid.c +++ b/src/ber_oid.c @@ -2,7 +2,7 @@ * Copyright (C) 1995-2005, Index Data ApS * See the file LICENSE for details. * - * $Id: ber_oid.c,v 1.6 2005-05-26 21:46:40 adam Exp $ + * $Id: ber_oid.c,v 1.8 2006-04-17 07:40:15 adam Exp $ */ /** @@ -44,8 +44,8 @@ int ber_oidc(ODR o, Odr_oid *p, int max_oid_size) return 0; } pos = 0; - while (len) - { + while (len) + { int id = 0; do { @@ -59,22 +59,33 @@ int ber_oidc(ODR o, Odr_oid *p, int max_oid_size) len--; } while (*(o->bp++) & 0X80); + + if (id < 0) + { + odr_seterror(o, ODATA, 23); + return 0; + } if (pos > 0) p[pos++] = id; - else + else { p[0] = id / 40; - if (p[0] > 2) + if (p[0] > 2) p[0] = 2; - p[1] = id - p[0] * 40; - pos = 2; + p[1] = id - p[0] * 40; + pos = 2; } - if (pos >= max_oid_size) - { - odr_seterror(o, OPROTO, 55); - return 0; - } - } + if (pos >= max_oid_size) + { + odr_seterror(o, OPROTO, 55); + return 0; + } + } + if (pos < 2 || p[0] < 0 || p[1] < 0) + { + odr_seterror(o, ODATA, 23); + return 0; + } p[pos] = -1; return 1; case ODR_ENCODE: @@ -88,12 +99,12 @@ int ber_oidc(ODR o, Odr_oid *p, int max_oid_size) odr_seterror(o, ODATA, 23); return 0; } - for (pos = 1; p[pos] >= 0; pos++) + for (pos = 1; p[pos] != -1; pos++) { n = 0; if (pos == 1) id = p[0]*40 + p[1]; - else + else id = p[pos]; do { @@ -124,3 +135,11 @@ int ber_oidc(ODR o, Odr_oid *p, int max_oid_size) return 0; } } +/* + * Local variables: + * c-basic-offset: 4 + * indent-tabs-mode: nil + * End: + * vim: shiftwidth=4 tabstop=8 expandtab + */ +