From 1b06a5c10770ef964044f824a33d4cc8652d8e7a Mon Sep 17 00:00:00 2001 From: Sebastian Hammer Date: Fri, 10 Feb 1995 15:55:28 +0000 Subject: [PATCH] Bug fixes, mostly. --- odr/ber_any.c | 9 ++++++--- odr/ber_oct.c | 12 +++++++----- odr/ber_tag.c | 7 ++++++- odr/odr_cons.c | 15 ++++++++++++++- odr/odr_oid.c | 14 +++++++++++--- odr/odr_seq.c | 12 +++++------- 6 files changed, 49 insertions(+), 20 deletions(-) diff --git a/odr/ber_any.c b/odr/ber_any.c index 8c661f0..6d69017 100644 --- a/odr/ber_any.c +++ b/odr/ber_any.c @@ -4,7 +4,10 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: ber_any.c,v $ - * Revision 1.1 1995-02-09 15:51:45 quinn + * Revision 1.2 1995-02-10 15:55:28 quinn + * Bug fixes, mostly. + * + * Revision 1.1 1995/02/09 15:51:45 quinn * Works better now. * */ @@ -18,7 +21,7 @@ int ber_any(ODR o, Odr_any **p) switch (o->direction) { case ODR_DECODE: - if ((res = completeBER(o->bp, o->left)) <= 0) + if ((res = completeBER(o->bp, 1000)) <= 0) /* FIX THIS */ return 0; (*p)->buf = nalloc(o, res); memcpy((*p)->buf, o->bp, res); @@ -60,7 +63,7 @@ int completeBER(unsigned char *buf, int len) b += res; len -= res; if (ll >= 0) - return (len >= ll ? len + (b-buf) : -1); + return (len >= ll ? ll + (b-buf) : -1); if (!cons) return -1; while (1) diff --git a/odr/ber_oct.c b/odr/ber_oct.c index 1114aa6..a8f6e07 100644 --- a/odr/ber_oct.c +++ b/odr/ber_oct.c @@ -4,7 +4,10 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: ber_oct.c,v $ - * Revision 1.3 1995-02-03 17:04:34 quinn + * Revision 1.4 1995-02-10 15:55:28 quinn + * Bug fixes, mostly. + * + * Revision 1.3 1995/02/03 17:04:34 quinn * *** empty log message *** * * Revision 1.2 1995/02/02 20:38:50 quinn @@ -40,16 +43,15 @@ int ber_octetstring(ODR o, Odr_oct *p, int cons) /* primitive octetstring */ if (len < 0) return 0; - if (len == 0) - return 1; - if (len > p->size - p->len) + if (len + 1 > p->size - p->len) { c = nalloc(o, p->size += len + 1); if (p->len) memcpy(c, p->buf, p->len); p->buf = c; } - memcpy(p->buf + p->len, o->bp, len); + if (len) + memcpy(p->buf + p->len, o->bp, len); p->len += len; o->bp += len; o->left -= len; diff --git a/odr/ber_tag.c b/odr/ber_tag.c index fd23a96..f6c3576 100644 --- a/odr/ber_tag.c +++ b/odr/ber_tag.c @@ -4,7 +4,10 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: ber_tag.c,v $ - * Revision 1.3 1995-02-09 15:51:46 quinn + * Revision 1.4 1995-02-10 15:55:28 quinn + * Bug fixes, mostly. + * + * Revision 1.3 1995/02/09 15:51:46 quinn * Works better now. * * Revision 1.2 1995/02/07 17:52:59 quinn @@ -51,6 +54,8 @@ int ber_tag(ODR o, const void *p, int class, int tag, int *constructed) #endif return 1; case ODR_DECODE: + if (o->stackp > -1 && !odr_constructed_more(o)) + return 0; if (lclass < 0) { if ((br = ber_dectag(o->bp, &lclass, <ag, &lcons)) <= 0) diff --git a/odr/odr_cons.c b/odr/odr_cons.c index 3fdae22..92ebf6a 100644 --- a/odr/odr_cons.c +++ b/odr/odr_cons.c @@ -4,7 +4,10 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: odr_cons.c,v $ - * Revision 1.3 1995-02-09 15:51:48 quinn + * Revision 1.4 1995-02-10 15:55:29 quinn + * Bug fixes, mostly. + * + * Revision 1.3 1995/02/09 15:51:48 quinn * Works better now. * * Revision 1.2 1995/02/07 17:52:59 quinn @@ -55,6 +58,16 @@ int odr_constructed_begin(ODR o, void *p, int class, int tag) return 1; } +int odr_constructed_more(ODR o) +{ + if (o->stackp < 0) + return 0; + if (o->stack[o->stackp].len >= 0) + return o->bp - o->stack[o->stackp].base < o->stack[o->stackp].len; + else + return (!(*o->bp == 0 && *(o->bp + 1) == 0)); +} + int odr_constructed_end(ODR o) { int res; diff --git a/odr/odr_oid.c b/odr/odr_oid.c index 44d88ca..9dce6b0 100644 --- a/odr/odr_oid.c +++ b/odr/odr_oid.c @@ -4,7 +4,10 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: odr_oid.c,v $ - * Revision 1.3 1995-02-09 15:51:49 quinn + * Revision 1.4 1995-02-10 15:55:29 quinn + * Bug fixes, mostly. + * + * Revision 1.3 1995/02/09 15:51:49 quinn * Works better now. * * Revision 1.2 1995/02/07 14:13:46 quinn @@ -45,10 +48,15 @@ int odr_oid(ODR o, Odr_oid **p, int opt) } if (o->direction == ODR_PRINT) { - fprintf(o->print, "%sOID\n", odr_indent(o)); + int i; + + fprintf(o->print, "%sOID:", odr_indent(o)); + for (i = 0; (*p)[i] > -1; i++) + fprintf(o->print, " %d", (*p)[i]); + fprintf(o->print, "\n"); return 1; } if (o->direction == ODR_DECODE) - *p = nalloc(o, ODR_OID_SIZE); + *p = nalloc(o, ODR_OID_SIZE * sizeof(**p)); return ber_oid(o, *p); } diff --git a/odr/odr_seq.c b/odr/odr_seq.c index f135d85..e08b958 100644 --- a/odr/odr_seq.c +++ b/odr/odr_seq.c @@ -4,7 +4,10 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: odr_seq.c,v $ - * Revision 1.5 1995-02-09 15:51:49 quinn + * Revision 1.6 1995-02-10 15:55:29 quinn + * Bug fixes, mostly. + * + * Revision 1.5 1995/02/09 15:51:49 quinn * Works better now. * * Revision 1.4 1995/02/07 17:53:00 quinn @@ -64,12 +67,7 @@ int odr_sequence_end(ODR o) int odr_sequence_more(ODR o) { - if (o->stackp < 0) - return 0; - if (o->stack[o->stackp].len >= 0) - return o->bp - o->stack[o->stackp].base < o->stack[o->stackp].len; - else - return (!(*o->bp == 0 && *(o->bp + 1) == 0)); + return odr_constructed_more(o); } int odr_sequence_of(ODR o, Odr_fun type, void *p, int *num) -- 1.7.10.4