new file
[yaz-moved-to-github.git] / odr / ber_any.c
index 5328dee..00388cd 100644 (file)
@@ -2,24 +2,24 @@
  * Copyright (c) 1995-2003, Index Data
  * See the file LICENSE for details.
  *
- * $Id: ber_any.c,v 1.21 2003-02-12 15:06:43 adam Exp $
+ * $Id: ber_any.c,v 1.24 2003-03-11 11:03:31 adam Exp $
  */
 #if HAVE_CONFIG_H
 #include <config.h>
 #endif
+
 #include "odr-priv.h"
 
 int ber_any(ODR o, Odr_any **p)
 {
     int res;
-    int left = o->size - (o->bp - o->buf);
 
     switch (o->direction)
     {
        case ODR_DECODE:
-           if ((res = completeBER(o->bp, left)) <= 0)        /* FIX THIS */
+           if ((res = completeBER(o->bp, odr_max(o))) <= 0)        /* FIX THIS */
            {
-               o->error = OPROTO;
+                odr_seterror(o, OPROTO, 2);
                return 0;
            }
            (*p)->buf = (unsigned char *)odr_malloc(o, res);
@@ -31,7 +31,7 @@ int ber_any(ODR o, Odr_any **p)
            if (odr_write(o, (*p)->buf, (*p)->len) < 0)
                return 0;
            return 1;
-       default: o->error = OOTHER; return 0;
+       default: odr_seterror(o, OOTHER, 3); return 0;
     }
 }
 
@@ -47,54 +47,13 @@ int completeBER(const unsigned char *buf, int len)
        return 0;
     if (!buf[0] && !buf[1])
        return 0;
-    if (len > 5 && buf[0] >= 0x20 && buf[0] < 0x7f
-               && buf[1] >= 0x20 && buf[1] < 0x7f
-               && buf[2] >= 0x20 && buf[2] < 0x7f)
-    {
-        /* deal with HTTP request/response */
-       int i = 2, content_len = 0;
-
-        while (i <= len-4)
-        {
-            if (buf[i] == '\r' && buf[i+1] == '\n')
-            {
-                i += 2;
-                if (buf[i] == '\r' && buf[i+1] == '\n')
-                {
-                    /* i += 2 seems not to work with GCC -O2 .. 
-                       so i+2 is used instead .. */
-                    if (len >= (i+2)+ content_len)
-                        return (i+2)+ content_len;
-                    break;
-                }
-                if (i < len-18)
-                {
-                    if (!memcmp(buf+i, "Content-Length:", 15))
-                    {
-                        i+= 15;
-                        if (buf[i] == ' ')
-                            i++;
-                        content_len = 0;
-                        while (i <= len-4 && isdigit(buf[i]))
-                            content_len = content_len*10 + (buf[i++] - '0');
-                        if (content_len < 0) /* prevent negative offsets */
-                            content_len = 0;
-                    }
-                }
-            }
-            else
-                i++;
-        }
-        return 0;
-    }
-    /* BER from now on .. */
-    if ((res = ber_dectag(b, &zclass, &tag, &cons)) <= 0)
+    if ((res = ber_dectag(b, &zclass, &tag, &cons, len)) <= 0)
        return 0;
     if (res > len)
        return 0;
     b += res;
     len -= res;
-    if ((res = ber_declen(b, &ll)) <= 0)
+    if ((res = ber_declen(b, &ll, len)) <= 0)
        return 0;
     if (res > len)
        return 0;