X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmini%2Fgenmdesc.c;h=21f87eb5819d7a47a4e0ca63cf739666226b79bb;hb=bde98eb9fef5269d0add1128a84d4ffc9e9f3e05;hp=04f08d64ccc10eba0ed0655978948c875874aefe;hpb=1bc9a1048c27252174aadf0e1d184e5fe9f12498;p=mono.git diff --git a/mono/mini/genmdesc.c b/mono/mini/genmdesc.c index 04f08d64ccc..21f87eb5819 100644 --- a/mono/mini/genmdesc.c +++ b/mono/mini/genmdesc.c @@ -54,6 +54,14 @@ static GHashTable *template_table; #define eat_whitespace(s) while (*(s) && isspace (*(s))) s++; +// Per spec isalnum() expects input in the range 0-255 +// and can misbehave if you pass in a signed char. +static int +isalnum_char(char c) +{ + return isalnum ((unsigned char)c); +} + static int load_file (const char *name) { FILE *f; @@ -99,7 +107,7 @@ load_file (const char *name) { is_template = TRUE; desc = g_new0 (OpDesc, 1); } else { - desc = g_hash_table_lookup (table, str); + desc = (OpDesc *)g_hash_table_lookup (table, str); if (!desc) g_error ("Invalid opcode '%s' at line %d in %s\n", str, line, name); if (desc->desc) @@ -140,8 +148,12 @@ load_file (const char *name) { */ } else if (strncmp (p, "len:", 4) == 0) { unsigned long size; + char* endptr; p += 4; - size = strtoul (p, &p, 10); + size = strtoul (p, &endptr, 10); + if (size == 0 && p == endptr) + g_error ("Invalid length '%s' at line %d in %s\n", p, line, name); + p = endptr; if (!nacl_length_set) { desc->spec [MONO_INST_LEN] = size; } @@ -159,9 +171,9 @@ load_file (const char *name) { OpDesc *tdesc; p += 9; tname = p; - while (*p && isalnum (*p)) ++p; + while (*p && isalnum_char (*p)) ++p; *p++ = 0; - tdesc = g_hash_table_lookup (template_table, tname); + tdesc = (OpDesc *)g_hash_table_lookup (template_table, tname); if (!tdesc) g_error ("Invalid template name %s at '%s' at line %d in %s\n", tname, p, line, name); for (i = 0; i < MONO_INST_MAX; ++i) { @@ -177,7 +189,7 @@ load_file (const char *name) { g_error ("Duplicated name tag in template %s at '%s' at line %d in %s\n", desc->name, p, line, name); p += 5; tname = p; - while (*p && isalnum (*p)) ++p; + while (*p && isalnum_char (*p)) ++p; *p++ = 0; if (g_hash_table_lookup (template_table, tname)) g_error ("Duplicated template %s at line %d in %s\n", tname, line, name); @@ -191,6 +203,7 @@ load_file (const char *name) { if (is_template && !desc->name) g_error ("Template without name at line %d in %s\n", line, name); } + g_string_free (comment,TRUE); fclose (f); return 0; } @@ -216,7 +229,7 @@ init_table (void) { static void output_char (FILE *f, char c) { - if (isalnum (c)) + if (isalnum_char (c)) fprintf (f, "%c", c); else fprintf (f, "\\x%x\" \"", (guint8)c);