Fixes for broken DCE and MIT code.

git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@1106 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
Johan Danielsson
1996-12-15 17:21:24 +00:00
parent 8931a0559c
commit dfdad286ad

View File

@@ -2,6 +2,7 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h>
#include "der.h" #include "der.h"
#include "gen.h" #include "gen.h"
@@ -14,7 +15,7 @@ init_generate (char *filename)
{ {
headerfile = fopen (STEM ".h", "w"); headerfile = fopen (STEM ".h", "w");
fprintf (headerfile, fprintf (headerfile,
"/* Genereated from %s */\n" "/* Generated from %s */\n"
"/* Do not edit */\n\n", "/* Do not edit */\n\n",
filename); filename);
codefile = fopen (STEM ".c", "w"); codefile = fopen (STEM ".c", "w");
@@ -179,7 +180,18 @@ encode_type (char *name, Type *t)
fprintf (codefile, "{\n" fprintf (codefile, "{\n"
"unsigned char c = 0;\n"); "unsigned char c = 0;\n");
pos = t->members->prev->val; pos = t->members->prev->val;
rest = 7 - (t->members->prev->val % 8); /* fix for buggy MIT (and OSF?) code */
if (pos > 31)
abort ();
/*
* It seems that if we do not always set pos to 31 here, the MIT
* code will do the wrong thing.
*
* I hate ASN.1 (and DER), but I hate it even more when everybody
* has to screw it up differently.
*/
pos = 31;
rest = 7 - (pos % 8);
for (m = t->members->prev; m && tag != m->val; m = m->prev) { for (m = t->members->prev; m && tag != m->val; m = m->prev) {
while (m->val / 8 < pos / 8) { while (m->val / 8 < pos / 8) {
@@ -426,8 +438,13 @@ decode_type (char *name, Type *t)
"p += l;\n" "p += l;\n"
"len -= l;\n" "len -= l;\n"
"ret += l;\n" "ret += l;\n"
"if(len < reallen)\n" "{\n"
"int dce_fix = 0;\n"
"if(reallen == 0)\n"
"dce_fix = 1;\n"
"if(!dce_fix && len < reallen)\n"
"return -1;\n" "return -1;\n"
"if(!dce_fix)\n"
"len = reallen;\n"); "len = reallen;\n");
for (m = t->members; m && tag != m->val; m = m->next) { for (m = t->members; m && tag != m->val; m = m->next) {
@@ -449,18 +466,37 @@ decode_type (char *name, Type *t)
"p += l;\n" "p += l;\n"
"len -= l;\n" "len -= l;\n"
"ret += l;\n" "ret += l;\n"
"if(len < newlen)\n" "{\n"
"return -1;\n" "int dce_fix = 0;\n"
"if(newlen == 0)\n"
"dce_fix = 1;\n"
"if(!dce_fix && len < newlen)\n"
"return -1;\n"
"oldlen = len;\n" "oldlen = len;\n"
"len = newlen;\n"); "if(!dce_fix)\n"
"len = newlen;\n");
if (m->optional) if (m->optional)
fprintf (codefile, fprintf (codefile,
"%s = malloc(sizeof(*%s));\n", "%s = malloc(sizeof(*%s));\n",
s, s); s, s);
decode_type (s, m->type); decode_type (s, m->type);
fprintf (codefile, fprintf (codefile,
"if(dce_fix){\n"
"l = der_match_tag (p, len, 0, 0, 0);\n"
"if(l < 0) return l;\n"
"p += l;\n"
"len -= l;\n"
"ret += l;\n"
"l = der_get_length(p, len, &reallen);\n"
"if(l < 0)\n"
"return l;\n"
"p += l;\n"
"len -= l;\n"
"ret += l;\n"
"}else \n"
"len = oldlen - newlen;\n" "len = oldlen - newlen;\n"
"}\n" "}\n"
"}\n"
"else {\n"); "else {\n");
if(m->optional) if(m->optional)
fprintf (codefile, fprintf (codefile,
@@ -476,6 +512,21 @@ decode_type (char *name, Type *t)
tag = m->val; tag = m->val;
free (s); free (s);
} }
fprintf(codefile,
"if(dce_fix){\n"
"l = der_match_tag (p, len, 0, 0, 0);\n"
"if(l < 0) return l;\n"
"p += l;\n"
"len -= l;\n"
"ret += l;\n"
"l = der_get_length(p, len, &reallen);\n"
"if(l < 0)\n"
"return l;\n"
"p += l;\n"
"len -= l;\n"
"ret += l;\n"
"}\n"
"}\n");
break; break;
} }
@@ -533,11 +584,32 @@ decode_type (char *name, Type *t)
"p += l;\n" "p += l;\n"
"len -= l;\n" "len -= l;\n"
"ret += l;\n" "ret += l;\n"
"if(len < reallen)\n" "{\n"
"int dce_fix = 0;\n"
"if(reallen == 0)\n"
"dce_fix = 1;\n"
"if(!dce_fix && len < reallen)\n"
"return -1;\n" "return -1;\n"
"if(!dce_fix)\n"
"len = reallen;\n", "len = reallen;\n",
t->application); t->application);
decode_type (name, t->subtype); decode_type (name, t->subtype);
fprintf(codefile,
"if(dce_fix){\n"
"l = der_match_tag (p, len, 0, 0, 0);\n"
"if(l < 0) return l;\n"
"p += l;\n"
"len -= l;\n"
"ret += l;\n"
"l = der_get_length(p, len, &reallen);\n"
"if(l < 0)\n"
"return l;\n"
"p += l;\n"
"len -= l;\n"
"ret += l;\n"
"}\n"
"}\n");
break; break;
default : default :
abort (); abort ();