X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fber_oid.c;h=e1947d69dc67fe1408c2ab1a1ea2b20256b3efc1;hb=58e7306c9f23189e136c52b21e39692392824ea7;hp=6a738e11901cfc1b58a47da45d9a50aa15fa7a2a;hpb=0a1e9944179033c72f1fa9f9c13fabddc1945aeb;p=yaz-moved-to-github.git diff --git a/src/ber_oid.c b/src/ber_oid.c index 6a738e1..e1947d6 100644 --- a/src/ber_oid.c +++ b/src/ber_oid.c @@ -1,8 +1,16 @@ /* - * Copyright (c) 1995-2004, Index Data + * Copyright (C) 1995-2005, Index Data ApS * See the file LICENSE for details. * - * $Id: ber_oid.c,v 1.2 2004-02-11 23:49:28 adam Exp $ + * $Id: ber_oid.c,v 1.6 2005-05-26 21:46:40 adam Exp $ + */ + +/** + * \file ber_oid.c + * \brief Implements BER OID encoding and decoding + * + * This source file implements BER encoding and decoding of + * the OID type. */ #if HAVE_CONFIG_H #include @@ -10,7 +18,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; @@ -24,7 +32,7 @@ int ber_oidc(ODR o, Odr_oid *p) odr_seterror(o, OPROTO, 18); return 0; } - if (len <= 0) + if (len < 0) { odr_seterror(o, OPROTO, 19); return 0; @@ -61,6 +69,11 @@ int ber_oidc(ODR o, Odr_oid *p) p[1] = id - p[0] * 40; pos = 2; } + if (pos >= max_oid_size) + { + odr_seterror(o, OPROTO, 55); + return 0; + } } p[pos] = -1; return 1; @@ -70,7 +83,7 @@ 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;