X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fber_oid.c;h=6a0541e9a2b102cba8d922291f71a2dfc6280ce3;hb=cf3ff0df41755297543b14f007842e1dc216ec25;hp=11da7c308993130f978a167b0ea31c128a1467f4;hpb=4c176312acdc3444c9afc820f76a393e64668e52;p=yaz-moved-to-github.git diff --git a/src/ber_oid.c b/src/ber_oid.c index 11da7c3..6a0541e 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.5 2005-01-15 19:47:11 adam Exp $ + * $Id: ber_oid.c,v 1.7 2005-06-25 15:46:03 adam Exp $ */ /** @@ -18,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; @@ -32,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; @@ -44,8 +44,8 @@ int ber_oidc(ODR o, Odr_oid *p) return 0; } pos = 0; - while (len) - { + while (len) + { int id = 0; do { @@ -61,15 +61,20 @@ int ber_oidc(ODR o, Odr_oid *p) while (*(o->bp++) & 0X80); 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; } - } + } p[pos] = -1; return 1; case ODR_ENCODE: @@ -88,7 +93,7 @@ int ber_oidc(ODR o, Odr_oid *p) n = 0; if (pos == 1) id = p[0]*40 + p[1]; - else + else id = p[pos]; do { @@ -119,3 +124,11 @@ int ber_oidc(ODR o, Odr_oid *p) return 0; } } +/* + * Local variables: + * c-basic-offset: 4 + * indent-tabs-mode: nil + * End: + * vim: shiftwidth=4 tabstop=8 expandtab + */ +