Merge lorikeet-heimdal -r 787 into Samba4 tree.
[kai/samba.git] / source4 / heimdal / lib / asn1 / gen_encode.c
index bc2aff86e5dd085c4ce9da8aa43b1cdb05645d77..08f1a9449f8baf91dda4105df2bdcccdc9d77bb1 100644 (file)
@@ -33,7 +33,7 @@
 
 #include "gen_locl.h"
 
-RCSID("$Id: gen_encode.c,v 1.22 2006/12/29 17:30:03 lha Exp $");
+RCSID("$Id: gen_encode.c 22429 2008-01-13 10:25:50Z lha $");
 
 static void
 encode_primitive (const char *typename, const char *name)
@@ -121,12 +121,12 @@ encode_type (const char *name, const Type *t, const char *tmpstr)
        break;
     case TInteger:
        if(t->members) {
-           char *s;
-           asprintf(&s, "(const int*)%s", name);
-           if(s == NULL)
-               errx(1, "out of memory");
-           encode_primitive ("integer", s);
-           free(s);
+           fprintf(codefile,
+                   "{\n"
+                   "int enumint = (int)*%s;\n",
+                   name);
+           encode_primitive ("integer", "&enumint");
+           fprintf(codefile, "}\n;");
        } else if (t->range == NULL) {
            encode_primitive ("heim_integer", name);
        } else if (t->range->min == INT_MIN && t->range->max == INT_MAX) {
@@ -292,6 +292,11 @@ encode_type (const char *name, const Type *t, const char *tmpstr)
                "size_t elen, totallen = 0;\n"
                "int eret;\n");
 
+       fprintf(codefile,
+               "if ((%s)->len > UINT_MAX/sizeof(val[0]))\n"
+               "return ERANGE;\n",
+               name);
+
        fprintf(codefile,
                "val = malloc(sizeof(val[0]) * (%s)->len);\n"
                "if (val == NULL && (%s)->len != 0) return ENOMEM;\n",