X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=odr%2Fber_oid.c;h=576edfd2091804f9321b6043d56f38df8790ea60;hb=441b13f600a164f373f19bba4b574527d13689a1;hp=07f2ae33a95a8eba62c2a32220c1946a40898fa9;hpb=82c1521f196b83c0ede4200b21eb25ed86bbf48e;p=yaz-moved-to-github.git diff --git a/odr/ber_oid.c b/odr/ber_oid.c index 07f2ae3..576edfd 100644 --- a/odr/ber_oid.c +++ b/odr/ber_oid.c @@ -4,14 +4,26 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: ber_oid.c,v $ - * Revision 1.1 1995-02-03 17:04:36 quinn + * Revision 1.5 1995-03-20 12:18:22 quinn + * Fixed bug in ber_oid + * + * Revision 1.4 1995/03/08 12:12:11 quinn + * Added better error checking. + * + * Revision 1.3 1995/03/01 08:40:56 quinn + * Smallish changes. + * + * Revision 1.2 1995/02/14 20:39:55 quinn + * Fixed bugs in completeBER and (serious one in) ber_oid. + * + * Revision 1.1 1995/02/03 17:04:36 quinn * Initial revision * */ #include -int ber_oid(ODR o, Odr_oid *p) +int ber_oidc(ODR o, Odr_oid *p) { int len; unsigned char *lenp; @@ -22,9 +34,15 @@ int ber_oid(ODR o, Odr_oid *p) { case ODR_DECODE: if ((res = ber_declen(o->bp, &len)) < 1) + { + o->error = OPROTO; return 0; + } if (len < 0) + { + o->error = OPROTO; return 0; + } o->bp += res; o->left -= res; if (len == 0) @@ -46,7 +64,10 @@ int ber_oid(ODR o, Odr_oid *p) do { if (!len) + { + o->error = OPROTO; return 0; + } p[pos] <<= 7; p[pos] |= *o->bp & 0X7F; len--; @@ -64,27 +85,35 @@ int ber_oid(ODR o, Odr_oid *p) o->bp++; o->left--; if (p[0] < 0 && p[1] <= 0) + { + o->error = ODATA; return 0; - p[1] = p[0] * 40 + p[1]; + } for (pos = 1; p[pos] >= 0; pos++) { - id = p[pos]; + id = pos > 1 ? p[pos] : p[0] * 40 + p[1]; n = 0; do { - octs[n++] = id &= 0X7F; + octs[n++] = id & 0X7F; id >>= 7; } while (id); if (n > o->left) + { + o->error = OSPACE; return 0; + } o->left -= n; while (n--) *(o->bp++) = octs[n] | ((n > 0) << 7); } if (ber_enclen(lenp, (o->bp - lenp) - 1, 1, 1) != 1) + { + o->error = OOTHER; return 0; + } return 1; - default: return 0; + default: o->error = OOTHER; return 0; } }