check against method descriptors used for fields and vice versa
authoredwin <none@none>
Fri, 7 Oct 2005 14:02:52 +0000 (14:02 +0000)
committeredwin <none@none>
Fri, 7 Oct 2005 14:02:52 +0000 (14:02 +0000)
src/vm/descriptor.c
src/vm/loader.c

index fa34c60aced72d5c4c4f8d6836cb72ac32f6f9d2..3aeec22ee43e3cb892ad9263041a9dc7351759f7 100644 (file)
@@ -29,7 +29,7 @@
    Changes: Christian Thalinger
             Christian Ullrich
 
-   $Id: descriptor.c 3380 2005-10-06 13:48:16Z edwin $
+   $Id: descriptor.c 3386 2005-10-07 14:02:52Z edwin $
 
 */
 
@@ -548,6 +548,7 @@ descriptor_pool_add(descriptor_pool *pool, utf *desc, int *paramslots)
 
        } else {
                /* a field descriptor */
+
                pool->fieldcount++;
                
            if (!name_from_descriptor(pool->referer, utf_ptr, end_pos, NULL,
@@ -810,6 +811,14 @@ descriptor_pool_parse_method_descriptor(descriptor_pool *pool, utf *desc,
        DESCRIPTOR_ASSERT(pool->descriptors);
        DESCRIPTOR_ASSERT(pool->descriptors_next);
 
+       /* check that it is a method descriptor */
+       
+       if (desc->text[0] != '(') {
+               *exceptionptr = new_classformaterror(pool->referer,
+                               "Field descriptor used in method reference");
+               return NULL;
+       }
+
        /* lookup the descriptor in the hashtable */
 
        key = utf_hashkey(desc->text, desc->blength);
@@ -830,15 +839,9 @@ descriptor_pool_parse_method_descriptor(descriptor_pool *pool, utf *desc,
        md = (methoddesc *) pool->descriptors_next;
        pool->descriptors_next += sizeof(methoddesc) - sizeof(typedesc);
 
-       utf_ptr = desc->text;
+       utf_ptr = desc->text + 1; /* skip '(' */
        end_pos = UTF_END(desc);
 
-       if (*utf_ptr++ != '(') {
-               *exceptionptr = new_classformaterror(pool->referer,
-                               "Field descriptor used in method reference");
-               return NULL;
-       }
-
        td = md->paramtypes;
 
        /* count the `this' pointer */
index d8c91fb75ce669af4538632947d050679169f111..501b3f6a43ea99aa20d1f8ca9eebd4944937c8b5 100644 (file)
@@ -32,7 +32,7 @@
             Edwin Steiner
             Christian Thalinger
 
-   $Id: loader.c 3372 2005-10-06 13:10:24Z twisti $
+   $Id: loader.c 3386 2005-10-07 14:02:52Z edwin $
 
 */
 
@@ -1311,6 +1311,13 @@ static bool load_field(classbuffer *cb, fieldinfo *f, descriptor_pool *descpool)
        if (!descriptor_pool_add(descpool, u, NULL))
                return false;
 
+       /* descriptor_pool_add accepts method descriptors, so we have to check */
+       /* against them here before the call of desc_to_type below.            */
+       if (u->text[0] == '(') {
+               *exceptionptr = new_classformaterror(c,"Method descriptor used for field");
+               return false;
+       }
+
        if (opt_verify) {
                /* check name */
                if (!is_valid_name_utf(f->name) || f->name->text[0] == '<') {