X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=src%2Fber_oid.c;h=d076eaad367eb2f2fa68dd3c7db92d883c6bcb69;hp=fa983bd7a5aa4fe99d4c9eb63b9134109db40117;hb=7d7e192def2fef342d235ea894eddb1e89edd714;hpb=78723254cce0fc4e86db7e8d2bc503527d7c08f9 diff --git a/src/ber_oid.c b/src/ber_oid.c index fa983bd..d076eaa 100644 --- a/src/ber_oid.c +++ b/src/ber_oid.c @@ -1,8 +1,14 @@ -/* - * Copyright (c) 1995-2004, Index Data +/* This file is part of the YAZ toolkit. + * Copyright (C) 1995-2011 Index Data * See the file LICENSE for details. + */ + +/** + * \file ber_oid.c + * \brief Implements BER OID encoding and decoding * - * $Id: ber_oid.c,v 1.3 2004-02-16 17:57:05 adam Exp $ + * This source file implements BER encoding and decoding of + * the OID type. */ #if HAVE_CONFIG_H #include @@ -10,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; @@ -24,7 +30,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; @@ -36,8 +42,8 @@ int ber_oidc(ODR o, Odr_oid *p) return 0; } pos = 0; - while (len) - { + while (len) + { int id = 0; do { @@ -51,17 +57,33 @@ int ber_oidc(ODR o, Odr_oid *p) 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 < 2 || p[0] < 0 || p[1] < 0) + { + odr_seterror(o, ODATA, 23); + return 0; + } p[pos] = -1; return 1; case ODR_ENCODE: @@ -75,12 +97,12 @@ int ber_oidc(ODR o, Odr_oid *p) 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 { @@ -111,3 +133,12 @@ int ber_oidc(ODR o, Odr_oid *p) return 0; } } +/* + * Local variables: + * c-basic-offset: 4 + * c-file-style: "Stroustrup" + * indent-tabs-mode: nil + * End: + * vim: shiftwidth=4 tabstop=8 expandtab + */ +