X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=odr%2Fber_oid.c;h=576edfd2091804f9321b6043d56f38df8790ea60;hb=7d093cf64e6045cf14dbf199f8cdf6b808dd3b65;hp=20bff00b8fe46799478c54c92915cbea4713f62c;hpb=04cde6d037338d3128c77698d4c8a7f03010db1e;p=yaz-moved-to-github.git diff --git a/odr/ber_oid.c b/odr/ber_oid.c index 20bff00..576edfd 100644 --- a/odr/ber_oid.c +++ b/odr/ber_oid.c @@ -4,7 +4,13 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: ber_oid.c,v $ - * Revision 1.3 1995-03-01 08:40:56 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 @@ -28,9 +34,15 @@ int ber_oidc(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) @@ -52,7 +64,10 @@ int ber_oidc(ODR o, Odr_oid *p) do { if (!len) + { + o->error = OPROTO; return 0; + } p[pos] <<= 7; p[pos] |= *o->bp & 0X7F; len--; @@ -70,11 +85,13 @@ int ber_oidc(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 { @@ -83,14 +100,20 @@ int ber_oidc(ODR o, Odr_oid *p) } 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; } }