[ Web Proxy ]
URL:
Viewing: https://raw.githubusercontent.com/lcatro/vuln_javascript/master/javascript_variant.cpp [Back]  [Original]

#include "disable_warning.h"

#include 
#include 
#include 
#include 

#include 

#include 
#include 

#include "baselib_string.h"
#include "global_setting.h"
#include "javascript_array.h"
#include "javascript_base.h"
#include "javascript_variant.h"

using std::map;

typedef map global_javascript_variant_table_;

global_javascript_variant_table_ global_javascript_variant_table;

unsigned long get_variant_index(string& variant_name) {
    unsigned long index=0;
    try {
        for (global_javascript_variant_table_::iterator variant_table_iterator=global_javascript_variant_table.begin();
                                                        variant_table_iterator!=global_javascript_variant_table.end();
                                                        ++variant_table_iterator,++index)
            if (variant_name==variant_table_iterator->first)
                return index;
    } catch (...) {
        //  i dont know why iterate global_javascript_variant_table will make error of access exception ..
    }
    return INVALID_VALUE;
}

bool is_exist_variant(string& variant_name) {
    if (INVALID_VALUE!=get_variant_index(variant_name))
        return true;
    return false;
}

support_javascript_variant_type get_variant_type(string& variant_name) {
    if (!is_exist_variant(variant_name))
        return NONE;
    return (support_javascript_variant_type)global_javascript_variant_table[variant_name].vt;
}

void set_variant(string variant_name,void* variant_data,support_javascript_variant_type variant_type) {
    if (is_exist_variant(variant_name))
        if (STRING==global_javascript_variant_table[variant_name].vt)
            if (NULL!=global_javascript_variant_table[variant_name].ulVal)
                free_memory((void*)global_javascript_variant_table[variant_name].ulVal);
    if (NONE==variant_type) {
        global_javascript_variant_table[variant_name].vt=NONE;
        global_javascript_variant_table[variant_name].wReserved3=0;
        global_javascript_variant_table[variant_name].ulVal=0;
    } else if (NUMBER==variant_type) {
        global_javascript_variant_table[variant_name].vt=NUMBER;
        global_javascript_variant_table[variant_name].wReserved3=sizeof(int);
        global_javascript_variant_table[variant_name].ulVal=(int)variant_data;
    } else if (STRING==variant_type) {
        global_javascript_variant_table[variant_name].vt=STRING;
        unsigned long conver_new_length=conver_coding((char*)variant_data);
        global_javascript_variant_table[variant_name].wReserved3=sizeof(int);

        unsigned long alloc_length=sizeof(javascript_variant_string)+conver_new_length+1;
        void* alloc_address=alloc_memory(alloc_length);
        ((javascript_variant_string*)alloc_address)->string_length=conver_new_length;
        ((javascript_variant_string*)alloc_address)->string_data=(char*)((unsigned long)alloc_address+sizeof(javascript_variant_string));
        memcpy((void*)((unsigned long)alloc_address+sizeof(javascript_variant_string)),variant_data,alloc_length-sizeof(javascript_variant_string));

        global_javascript_variant_table[variant_name].ulVal=(unsigned long)alloc_address;
    } else if (INT_ARRAY==variant_type) {
        global_javascript_variant_table[variant_name].vt=INT_ARRAY;
        global_javascript_variant_table[variant_name].wReserved3=sizeof(int);
        global_javascript_variant_table[variant_name].ulVal=(unsigned long)variant_data;
    } else if (OBJECT_ARRAY==variant_type) {
        global_javascript_variant_table[variant_name].vt=OBJECT_ARRAY;
        global_javascript_variant_table[variant_name].wReserved3=sizeof(int);
        global_javascript_variant_table[variant_name].ulVal=(unsigned long)variant_data;
    } else if (OBJECT==variant_type) {
        global_javascript_variant_table[variant_name].vt=OBJECT;
        global_javascript_variant_table[variant_name].wReserved3=sizeof(int);
        global_javascript_variant_table[variant_name].ulVal=(unsigned long)variant_data;
    }
}

bool get_variant(string variant_name,void* output_variant_data,support_javascript_variant_type* output_variant_type) {
    if (is_exist_variant(variant_name)) {
        if (NONE!=global_javascript_variant_table[variant_name].vt) {
            *(unsigned long*)output_variant_data=global_javascript_variant_table[variant_name].ulVal;
            *output_variant_type=(support_javascript_variant_type)global_javascript_variant_table[variant_name].vt;
            if (STRING==*output_variant_type)
                *(unsigned long*)output_variant_data=(unsigned long)((javascript_variant_string*)global_javascript_variant_table[variant_name].ulVal)->string_data;
            else
                *(unsigned long*)output_variant_data=global_javascript_variant_table[variant_name].ulVal;
            return true;
        }
    }
    *(unsigned long*)output_variant_data=NULL;
    *output_variant_type=NONE;
    return false;
}

void copy_variant(string destination_variant_name,string source_variant_name) {
    unsigned long variant_data=0;
    support_javascript_variant_type variant_type=NONE;
    get_variant(source_variant_name,(void*)&variant_data,&variant_type);
    set_variant(destination_variant_name,(void*)variant_data,variant_type);
}

bool set_variant_array(string variant_name,unsigned long array_index,void* input_variant_data,support_javascript_variant_type input_variant_type) {
    if (is_exist_variant(variant_name)) {
        if (INT_ARRAY==get_variant_type(variant_name)) {
            if (NUMBER==input_variant_type) {
                int_array* array_class=NULL;
                support_javascript_variant_type variant_type=NONE;
                get_variant(variant_name,&array_class,&variant_type);
                array_class->set_index(array_index,input_variant_data);
                return true;
            }
        } else {
            object_array* array_class=NULL;
            support_javascript_variant_type variant_type=NONE;
            get_variant(variant_name,&array_class,&variant_type);
            javascript_variant_struct object_index_variant={0};
            object_index_variant.vt=input_variant_type;
            if (STRING==input_variant_type)
                object_index_variant.wReserved3=strlen((const char*)input_variant_data);
            else
                object_index_variant.wReserved3=sizeof(int);
            object_index_variant.ulVal=(unsigned long)input_variant_data;
            array_class->set_index(array_index,&object_index_variant);
            return true;
        }
    }
    return false;
}

bool get_variant_array(string variant_name,unsigned long array_index,void* output_variant_data,support_javascript_variant_type* output_variant_type) {
    if (is_exist_variant(variant_name)) {
        base_array* array_class=NULL;
        support_javascript_variant_type array_type=NONE;
        get_variant(variant_name,&array_class,&array_type);
        if (INT_ARRAY==array_type) {
            *(unsigned long*)output_variant_data=(unsigned long)((int_array*)array_class)->get_index(array_index);
            *output_variant_type=NUMBER;
        } else {
            javascript_variant_struct* array_index_object=(javascript_variant_struct*)((object_array*)array_class)->get_index(array_index);
            *(unsigned long*)output_variant_data=array_index_object->ulVal;
            *output_variant_type=(support_javascript_variant_type)array_index_object->vt;
        }
        return true;
    }
    return false;
}

Web Proxy Viewer  |  New URL  |  Original Page