X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=src%2Fber_oid.c;h=fef26ea542f101daf80d8fd638771e541f373c1e;hp=276b49b5083389d446c67001700eee71857dfc23;hb=68bbd857190c6e29727ca1f5070fe6d8e5102bbb;hpb=c6e47cbbff56f39f6d81b079ebaeac41d793d4d9 diff --git a/src/ber_oid.c b/src/ber_oid.c index 276b49b..fef26ea 100644 --- a/src/ber_oid.c +++ b/src/ber_oid.c @@ -1,9 +1,14 @@ -/* - * Copyright (c) 1995-2003, Index Data +/* This file is part of the YAZ toolkit. + * Copyright (C) Index Data * See the file LICENSE for details. - * Sebastian Hammer, Adam Dickmeiss + */ + +/** + * \file ber_oid.c + * \brief Implements BER OID encoding and decoding * - * $Id: ber_oid.c,v 1.1 2003-10-27 12:21:30 adam Exp $ + * This source file implements BER encoding and decoding of + * the OID type. */ #if HAVE_CONFIG_H #include @@ -11,7 +16,7 @@ #include "odr-priv.h" -int ber_oidc(ODR o, Odr_oid *p) +int ber_oidc(ODR o, Odr_oid *p, int max_oid_size) { int len, lenp, end; int pos, n, res, id; @@ -20,7 +25,7 @@ int ber_oidc(ODR o, Odr_oid *p) switch (o->direction) { case ODR_DECODE: - if ((res = ber_declen(o->bp, &len, odr_max(o))) < 1) + if ((res = ber_declen(o->op->bp, &len, odr_max(o))) < 1) { odr_seterror(o, OPROTO, 18); return 0; @@ -30,27 +35,16 @@ int ber_oidc(ODR o, Odr_oid *p) odr_seterror(o, OPROTO, 19); return 0; } - o->bp += res; - if (len == 0) - { - *p = -1; - return 1; - } + o->op->bp += res; if (len > odr_max(o)) { odr_seterror(o, OPROTO, 20); return 0; } - p[0] = *o->bp / 40; - if (p[0] > 2) - p[0] = 2; - p[1] = *o->bp - p[0] * 40; - o->bp++; - pos = 2; - len--; + pos = 0; while (len) { - p[pos] = 0; + int id = 0; do { if (!len) @@ -58,12 +52,37 @@ int ber_oidc(ODR o, Odr_oid *p) odr_seterror(o, OPROTO, 21); return 0; } - p[pos] <<= 7; - p[pos] |= *o->bp & 0X7F; + id <<= 7; + id |= *o->op->bp & 0X7F; len--; } - while (*(o->bp++) & 0X80); - pos++; + while (*(o->op->bp++) & 0X80); + + if (id < 0) + { + odr_seterror(o, ODATA, 23); + return 0; + } + if (pos > 0) + p[pos++] = id; + else + { + p[0] = id / 40; + if (p[0] > 2) + p[0] = 2; + p[1] = id - p[0] * 40; + pos = 2; + } + 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; @@ -73,15 +92,18 @@ int ber_oidc(ODR o, Odr_oid *p) lenp = odr_tell(o); if (odr_putc(o, 0) < 0) /* dummy */ return 0; - if (p[0] < 0 && p[1] <= 0) + if (p[0] < 0 || p[1] < 0) { odr_seterror(o, ODATA, 23); return 0; } - for (pos = 1; p[pos] >= 0; pos++) + for (pos = 1; p[pos] != -1; pos++) { - id = pos > 1 ? p[pos] : p[0] * 40 + p[1]; n = 0; + if (pos == 1) + id = p[0]*40 + p[1]; + else + id = p[pos]; do { octs[n++] = id & 0X7F; @@ -106,8 +128,17 @@ int ber_oidc(ODR o, Odr_oid *p) } odr_seek(o, ODR_S_END, 0); return 1; - default: + default: odr_seterror(o, OOTHER, 22); return 0; } } +/* + * Local variables: + * c-basic-offset: 4 + * c-file-style: "Stroustrup" + * indent-tabs-mode: nil + * End: + * vim: shiftwidth=4 tabstop=8 expandtab + */ +