Exemple #1
0
void free_export_file(export_file* ef) {

    freeConstantPool(ef->constant_pool, ef->constant_pool_count);
    free(ef->constant_pool);
    freeClasses(ef->classes, ef->export_class_count);
    free(ef->classes);

}
Exemple #2
0
JNIEXPORT void JNICALL NAME(nativeRelease)(JNIEnv *env, jobject thiz)
{
    vlc_mutex_t *parse_lock = (vlc_mutex_t *) getIntValue(env, thiz, "mNativeMediaParseLock");
    vlc_cond_t *parse_cond = (vlc_cond_t *) getIntValue(env, thiz, "mNativeMediaParseCond");
    /* wake up threads that waiting on prepare */
    vlc_mutex_lock(parse_lock);
    setIntValue(env, thiz, "mNativeMediaParsed", 4);
    vlc_cond_broadcast(parse_cond);
    vlc_mutex_unlock(parse_lock);
    jint mLibVlcMediaPlayer = getIntValue(env, thiz, "mLibVlcMediaPlayer");
    if (mLibVlcMediaPlayer != 0)
    {
        libvlc_event_manager_t *em;
        libvlc_media_player_t *mp = (libvlc_media_player_t*) mLibVlcMediaPlayer;
        libvlc_media_t *md = libvlc_media_player_get_media(mp);
        if (md) {
            em = libvlc_media_event_manager(md);
            for (int i = 0; i < sizeof(md_listening) / sizeof(*md_listening); i++)
            {
                libvlc_event_detach(em, md_listening[i], vlc_event_callback, thiz);
            }
        }
        em = libvlc_media_player_event_manager(mp);
        for (int i = 0; i < sizeof(mp_listening) / sizeof(*mp_listening); i++)
        {
            libvlc_event_detach(em, mp_listening[i], vlc_event_callback, thiz);
        }
        libvlc_media_player_stop(mp);
        libvlc_media_player_release(mp);
        setIntValue(env, thiz, "mLibVlcMediaPlayer", 0);
    }
    jint mLibVlcInstance = getIntValue(env, thiz, "mLibVlcInstance");
    if (mLibVlcInstance != 0)
    {
        libvlc_instance_t *instance = (libvlc_instance_t*) mLibVlcInstance;
        libvlc_release(instance);
        setIntValue(env, thiz, "mLibVlcInstance", 0);
    }
    setIntValue(env, thiz, "mNativeMediaBufferingCount", 0);
    vlc_mutex_destroy(parse_lock);
    free(parse_lock);
    setIntValue(env, thiz, "mNativeMediaParseLock", 0);
    vlc_cond_destroy(parse_cond);
    free(parse_cond);
    setIntValue(env, thiz, "mNativeMediaParseCond", 0);
    freeClasses(env, thiz);
}
calorimeterLSF::~calorimeterLSF ()
{
  freeClasses ();
  return;
}
Exemple #4
0
export_file* read_export_file(const char* filename) {

    char* data = NULL;
    export_file* ef = NULL;
    unsigned int length = 0;
    unsigned int position = 0;
    u2 indexCP = 0;
    u1 indexClass = 0;

    printf("Starting to read the export file: %s\n", filename);

    data = readFile(filename, &length);
    if(data == NULL)
        return NULL;

    if(length == 0) {
        fprintf(stderr, "No data to parse\n");
        free(data);
        return NULL;
    }

    ef = (export_file*)malloc(sizeof(export_file));
    if(ef == NULL)
        return NULL;

    if((position + 8) > length) {
        fprintf(stderr, "Not enough data to parse - %d\n", __LINE__);
        free(ef);
        free(data);
        return NULL;
    }

    ef->magic = bigEndianToLittleEndianU32(data);
    position += 4;

    ef->minor_version = data[position++];
    ef->major_version = data[position++];

    ef->constant_pool_count = bigEndianToLittleEndianU16(data + position);
    position += 2;

    if(ef->constant_pool_count < 1) {
        fprintf(stderr, "The constant pool is empty. There should be at least one element.\n");
        free(ef);
        free(data);
        return NULL;
    }

    /*printf("Constant pool count: %u\n", ef->constant_pool_count);*/

    ef->constant_pool = (ef_cp_info*)malloc(sizeof(ef_cp_info) * ef->constant_pool_count);
    if(ef->constant_pool == NULL) {
        perror("parseExportFile");
        free(ef);
        free(data);
        return NULL;
    }

    for(; indexCP < ef->constant_pool_count; ++indexCP) {
        if((position + 1) > length) {
            fprintf(stderr, "Not enough data to parse - %d\n", __LINE__);
            freeConstantPool(ef->constant_pool, indexCP);
            free(ef->constant_pool);
            free(ef);
            free(data);
            return NULL;
        }
        ef->constant_pool[indexCP].tag = data[position++];

        switch(ef->constant_pool[indexCP].tag) {
            case EF_CONSTANT_PACKAGE:
                if((position + 6) > length) {
                    fprintf(stderr, "Not enough data to parse - %d\n", __LINE__);
                    freeConstantPool(ef->constant_pool, indexCP);
                    free(ef->constant_pool);
                    free(ef);
                    free(data);
                 return NULL;
                }
                ef->constant_pool[indexCP].CONSTANT_Package.flags = data[position++];

                ef->constant_pool[indexCP].CONSTANT_Package.name_index = bigEndianToLittleEndianU16(data + position);
                position += 2;

                ef->constant_pool[indexCP].CONSTANT_Package.minor_version = data[position++];
                ef->constant_pool[indexCP].CONSTANT_Package.major_version = data[position++];

                ef->constant_pool[indexCP].CONSTANT_Package.aid_length = data[position++];

                if((position + ef->constant_pool[indexCP].CONSTANT_Package.aid_length) > length) {
                    fprintf(stderr, "Not enough data to parse - %d\n", __LINE__);
                    freeConstantPool(ef->constant_pool, indexCP);
                    free(ef->constant_pool);
                    free(ef);
                    free(data);
                 return NULL;
                }
                ef->constant_pool[indexCP].CONSTANT_Package.aid = (u1*)malloc(sizeof(u1) * ef->constant_pool[indexCP].CONSTANT_Package.aid_length);
                if(ef->constant_pool[indexCP].CONSTANT_Package.aid == NULL) {
                    perror("parseExportFile");
                    freeConstantPool(ef->constant_pool, indexCP);
                    free(ef->constant_pool);
                    free(ef);
                    free(data);
                 return NULL;
                }

                memcpy(ef->constant_pool[indexCP].CONSTANT_Package.aid, data + position, sizeof(u1) * ef->constant_pool[indexCP].CONSTANT_Package.aid_length);
                position += ef->constant_pool[indexCP].CONSTANT_Package.aid_length;

                break;

            case EF_CONSTANT_CLASSREF:
                if((position + 2) > length) {
                    fprintf(stderr, "Not enough data to parse - %d\n", __LINE__);
                    freeConstantPool(ef->constant_pool, indexCP);
                    free(ef->constant_pool);
                    free(ef);
                    free(data);
                 return NULL;
                }
                ef->constant_pool[indexCP].CONSTANT_Classref.name_index = bigEndianToLittleEndianU16(data + position);
                position += 2;

                break;

            case EF_CONSTANT_INTEGER:
                if((position + 4) > length) {
                    fprintf(stderr, "Not enough data to parse - %d\n", __LINE__);
                    freeConstantPool(ef->constant_pool, indexCP);
                    free(ef->constant_pool);
                    free(ef);
                    free(data);
                 return NULL;
                }
                ef->constant_pool[indexCP].CONSTANT_Integer.bytes = bigEndianToLittleEndianU32(data + position);
                position += 4;

                break;

            case EF_CONSTANT_UTF8:
                if((position + 2) > length) {
                    fprintf(stderr, "Not enough data to parse - %d\n", __LINE__);
                    freeConstantPool(ef->constant_pool, indexCP);
                    free(ef->constant_pool);
                    free(ef);
                    free(data);
                 return NULL;
                }
                ef->constant_pool[indexCP].CONSTANT_Utf8.length = bigEndianToLittleEndianU16(data + position);
                position += 2;

                if((position + ef->constant_pool[indexCP].CONSTANT_Utf8.length) > length) {
                    fprintf(stderr, "Not enough data to parse - %d\n", __LINE__);
                    freeConstantPool(ef->constant_pool, indexCP);
                    free(ef->constant_pool);
                    free(ef);
                    free(data);
                 return NULL;
                }
                ef->constant_pool[indexCP].CONSTANT_Utf8.bytes = (u1*)malloc(sizeof(u1) * ef->constant_pool[indexCP].CONSTANT_Utf8.length);
                if(ef->constant_pool[indexCP].CONSTANT_Utf8.bytes == NULL) {
                    perror("parseExportFile");
                    freeConstantPool(ef->constant_pool, indexCP);
                    free(ef->constant_pool);
                    free(ef);
                    free(data);
                    return NULL;
                }

                memcpy(ef->constant_pool[indexCP].CONSTANT_Utf8.bytes, data + position, sizeof(u1) * ef->constant_pool[indexCP].CONSTANT_Utf8.length);
                position += ef->constant_pool[indexCP].CONSTANT_Utf8.length;

                /*printf("\tIndex %u: %.*s\n", indexCP, ef->constant_pool[indexCP].CONSTANT_Utf8.length, ef->constant_pool[indexCP].CONSTANT_Utf8.bytes);*/

                break;

                default:
                    fprintf(stderr, "The tag %u is not supported.\n", ef->constant_pool[indexCP].tag);
                    freeConstantPool(ef->constant_pool, indexCP);
                    free(ef->constant_pool);
                    free(ef);
                    free(data);
                    return NULL;
        }
    }

    if((position + 3) > length) {
        fprintf(stderr, "Not enough data to parse - %d\n", __LINE__);
        freeConstantPool(ef->constant_pool, ef->constant_pool_count);
        free(ef->constant_pool);
        free(ef);
        free(data);
        return NULL;
    }
    ef->this_package = bigEndianToLittleEndianU16(data + position);
    position += 2;

    ef->export_class_count = data[position++];

    /*printf("class count: %u\n", ef->export_class_count);*/

    if(ef->export_class_count == 0) {
        ef->classes = NULL;
        return ef;
    }

    ef->classes = (ef_class_info*)malloc(sizeof(ef_class_info) * ef->export_class_count);
    if(ef->classes == NULL) {
        perror("parseExportFile");
        freeConstantPool(ef->constant_pool, ef->constant_pool_count);
        free(ef->constant_pool);
        free(ef);
        free(data);
        return NULL;
    }

    for(; indexClass < ef->export_class_count; ++indexClass) {
        u2 index = 0;

        if((position + 7) > length) {
            fprintf(stderr, "Not enough data to parse - %d\n", __LINE__);
            freeConstantPool(ef->constant_pool, ef->constant_pool_count);
            free(ef->constant_pool);
            freeClasses(ef->classes, indexClass);
            free(ef->classes);
            free(ef);
            free(data);
            return NULL;
        }
        ef->classes[indexClass].token = data[position++];

        ef->classes[indexClass].access_flags = bigEndianToLittleEndianU16(data + position);
        position += 2;

        ef->classes[indexClass].name_index = bigEndianToLittleEndianU16(data + position);
        position += 2;

        ef->classes[indexClass].export_supers_count = bigEndianToLittleEndianU16(data + position);
        position += 2;

        /*printf("Class %u\n\tSupers count:%u\n", indexClass, ef->classes[indexClass].export_supers_count);*/

        if(ef->classes[indexClass].export_supers_count > 0) {

            if((position + (2 * ef->classes[indexClass].export_supers_count) + 1) > length) {
                fprintf(stderr, "Not enough data to parse - %d\n", __LINE__);
                freeConstantPool(ef->constant_pool, ef->constant_pool_count);
                free(ef->constant_pool);
                freeClasses(ef->classes, indexClass);
                free(ef->classes);
                free(ef);
                free(data);
                return NULL;
            }
            ef->classes[indexClass].supers = (u2*)malloc(sizeof(u2) * ef->classes[indexClass].export_supers_count);
            if(ef->classes[indexClass].supers == NULL) {
                perror("parseExportFile");
                freeConstantPool(ef->constant_pool, ef->constant_pool_count);
                free(ef->constant_pool);
                freeClasses(ef->classes, indexClass);
                free(ef->classes);
                free(ef);
                free(data);
                return NULL;
            }

            for(; index < ef->classes[indexClass].export_supers_count; ++index) {
                ef->classes[indexClass].supers[index] = bigEndianToLittleEndianU16(data + position);
                position += 2;
            }

        } else {
            if((position + 1) > length) {
                fprintf(stderr, "Not enough data to parse - %d\n", __LINE__);
                freeConstantPool(ef->constant_pool, ef->constant_pool_count);
                free(ef->constant_pool);
                freeClasses(ef->classes, indexClass);
                free(ef->classes);
                free(ef);
                free(data);
                return NULL;
            }
            ef->classes[indexClass].supers = NULL;
        }

        ef->classes[indexClass].export_interfaces_count = data[position++];

       /*printf("\tInterfaces count: %u\n", ef->classes[indexClass].export_interfaces_count);*/

        if(ef->classes[indexClass].export_interfaces_count > 0) {

            if((position + (2 * ef->classes[indexClass].export_interfaces_count) + 2) > length) {
                fprintf(stderr, "Not enough data to parse - %d\n", __LINE__);
                freeConstantPool(ef->constant_pool, ef->constant_pool_count);
                free(ef->constant_pool);
                free(ef->classes[indexClass].supers);
                freeClasses(ef->classes, indexClass);
                free(ef->classes);
                free(ef);
                free(data);
                return NULL;
            }
            ef->classes[indexClass].interfaces = (u2*)malloc(sizeof(u2) * ef->classes[indexClass].export_interfaces_count);
            if(ef->classes[indexClass].interfaces == NULL) {
                perror("parseExportFile");
                freeConstantPool(ef->constant_pool, ef->constant_pool_count);
                free(ef->constant_pool);
                free(ef->classes[indexClass].supers);
                freeClasses(ef->classes, indexClass);
                free(ef->classes);
                free(ef);
                free(data);
                return NULL;
            }

            for(index = 0; index < ef->classes[indexClass].export_interfaces_count; ++index) {
                ef->classes[indexClass].interfaces[index] = bigEndianToLittleEndianU16(data + position);
                position += 2;
            }

        } else {
            ef->classes[indexClass].interfaces = NULL;
        }

        ef->classes[indexClass].export_fields_count = bigEndianToLittleEndianU16(data + position);
        position += 2;

        /*printf("\tFields count: %u\n", ef->classes[indexClass].export_fields_count);*/

        if(ef->classes[indexClass].export_fields_count > 0) {

            ef->classes[indexClass].fields = (ef_field_info*)malloc(sizeof(ef_field_info) * ef->classes[indexClass].export_fields_count);
            if(ef->classes[indexClass].fields == NULL) {
                perror("parseExportFile");
                freeConstantPool(ef->constant_pool, ef->constant_pool_count);
                free(ef->constant_pool);
                free(ef->classes[indexClass].supers);
                free(ef->classes[indexClass].interfaces);
                freeClasses(ef->classes, indexClass);
                free(ef->classes);
                free(ef);
                free(data);
                return NULL;
            }

            for(index = 0; index < ef->classes[indexClass].export_fields_count; ++index) {
                u2 indexAttribute = 0;
                if((position + 9) > length) {
                    fprintf(stderr, "Not enough data to parse - %d\n", __LINE__);
                    freeConstantPool(ef->constant_pool, ef->constant_pool_count);
                    free(ef->constant_pool);
                    free(ef->classes[indexClass].supers);
                    free(ef->classes[indexClass].interfaces);
                    freeFields(ef->classes[indexClass].fields, index);
                    free(ef->classes[indexClass].fields);
                    freeClasses(ef->classes, indexClass);
                    free(ef->classes);
                    free(ef);
                    free(data);
                    return NULL;
                }
                ef->classes[indexClass].fields[index].token = data[position++];

                ef->classes[indexClass].fields[index].access_flags = bigEndianToLittleEndianU16(data + position);
                position += 2;

                ef->classes[indexClass].fields[index].name_index = bigEndianToLittleEndianU16(data + position);
                position += 2;

                ef->classes[indexClass].fields[index].descriptor_index = bigEndianToLittleEndianU16(data + position);
                position += 2;

                ef->classes[indexClass].fields[index].attributes_count = bigEndianToLittleEndianU16(data + position);
                position += 2;

                /*printf("\tField %u\n\t\tAttributes count: %u\n", index, ef->classes[indexClass].fields[index].attributes_count);*/

                if(ef->classes[indexClass].fields[index].attributes_count > 0) {

                    if((position + (8 * ef->classes[indexClass].fields[index].attributes_count) + 2) > length) {
                        fprintf(stderr, "Not enough data to parse - %d\n", __LINE__);
                        freeConstantPool(ef->constant_pool, ef->constant_pool_count);
                        free(ef->constant_pool);
                        free(ef->classes[indexClass].supers);
                        free(ef->classes[indexClass].interfaces);
                        freeFields(ef->classes[indexClass].fields, index);
                        free(ef->classes[indexClass].fields);
                        freeClasses(ef->classes, indexClass);
                        free(ef->classes);
                        free(ef);
                        free(data);
                        return NULL;
                    }
                    ef->classes[indexClass].fields[index].attributes = (ef_attribute_info*)malloc(sizeof(ef_attribute_info) * ef->classes[indexClass].fields[index].attributes_count);
                    if(ef->classes[indexClass].fields[index].attributes == NULL) {
                        perror("parseExportFile");
                        freeConstantPool(ef->constant_pool, ef->constant_pool_count);
                        free(ef->constant_pool);
                        free(ef->classes[indexClass].supers);
                        free(ef->classes[indexClass].interfaces);
                        freeFields(ef->classes[indexClass].fields, index);
                        free(ef->classes[indexClass].fields);
                        freeClasses(ef->classes, indexClass);
                        free(ef->classes);
                        free(ef);
                        free(data);
                        return NULL;
                    }

                    for(; indexAttribute < ef->classes[indexClass].fields[index].attributes_count; ++indexAttribute) {
                        ef->classes[indexClass].fields[index].attributes[indexAttribute].attribute_name_index = bigEndianToLittleEndianU16(data + position);
                        position += 2;

                        ef->classes[indexClass].fields[index].attributes[indexAttribute].attribute_length = bigEndianToLittleEndianU32(data + position);
                        position += 4;

                        ef->classes[indexClass].fields[index].attributes[indexAttribute].constantvalue_index = bigEndianToLittleEndianU16(data + position);
                        position += 2;
                    }

                } else {
                    ef->classes[indexClass].fields[index].attributes = NULL;
                }
            }

        } else {
            ef->classes[indexClass].fields = NULL;
        }

        ef->classes[indexClass].export_methods_count = bigEndianToLittleEndianU16(data + position);
        position += 2;

        /*printf("\tMethods count: %u\n",ef->classes[indexClass].export_methods_count);*/

        if(ef->classes[indexClass].export_methods_count > 0) {

            if((position + (7 * ef->classes[indexClass].export_methods_count)) > length) {
                fprintf(stderr, "Not enough data to parse - %d\n", __LINE__);
                freeConstantPool(ef->constant_pool, ef->constant_pool_count);
                free(ef->constant_pool);
                free(ef->classes[indexClass].supers);
                free(ef->classes[indexClass].interfaces);
                freeFields(ef->classes[indexClass].fields, ef->classes[indexClass].export_fields_count);
                free(ef->classes[indexClass].fields);
                freeClasses(ef->classes, indexClass);
                free(ef->classes);
                free(ef);
                free(data);
                return NULL;
            }
            ef->classes[indexClass].methods = (ef_method_info*)malloc(sizeof(ef_method_info) * ef->classes[indexClass].export_methods_count);
            if(ef->classes[indexClass].methods == NULL) {
                perror("parseExportFile");
                freeConstantPool(ef->constant_pool, ef->constant_pool_count);
                free(ef->constant_pool);
                free(ef->classes[indexClass].supers);
                free(ef->classes[indexClass].interfaces);
                freeFields(ef->classes[indexClass].fields, ef->classes[indexClass].export_fields_count);
                free(ef->classes[indexClass].fields);
                freeClasses(ef->classes, indexClass);
                free(ef->classes);
                free(ef);
                free(data);
                return NULL;
            }

            for(index = 0; index < ef->classes[indexClass].export_methods_count; ++index) {
                ef->classes[indexClass].methods[index].token = data[position++];

                ef->classes[indexClass].methods[index].access_flags = bigEndianToLittleEndianU16(data + position);
                position += 2;

                ef->classes[indexClass].methods[index].name_index = bigEndianToLittleEndianU16(data + position);
                position += 2;

                ef->classes[indexClass].methods[index].descriptor_index = bigEndianToLittleEndianU16(data + position);
                position += 2;
            }

        } else {
            ef->classes[indexClass].methods = NULL;
        }

    }

    return ef;

}