source: trunk/processor/hashtable.m4

Last change on this file was 1495, checked in by moo, 4 months ago

invalid read of 2 bytes in hashtable

  • Property svn:eol-style set to native
File size: 5.4 KB
RevLine 
[1440]1dnl DEF_HASH_TABLE_FUNC(1:name, 2:datatype [, 3:dataname])
[1459]2define(`DEF_HASH_TABLE_FUNC', `DEF_STRUCT_P_FUNC(`HashTable', `$1', `
3    pushdefFUNC_NAME(`$2', `$3')
4    dnl {{{ dasm
5    IFDASM(`
6        const Bucket *srcBucket;
7        zval *zv;
8        int bufsize = 2;
9        char *buf = emalloc(bufsize);
10        int keysize;
[1]11
[1459]12        define(`AUTOCHECK_SKIP')
13        IFAUTOCHECK(`xc_autocheck_skip = 1;')
[1]14
[1459]15        DISABLECHECK(`
16        for (srcBucket = SRC(`pListHead'); srcBucket != NULL; srcBucket = srcBucket->pListNext) {
17            ALLOC_INIT_ZVAL(zv);
18            array_init(zv);
19            FUNC_NAME (dasm, zv, (($2*)srcBucket->pData) TSRMLS_CC);
20            keysize = BUCKET_KEY_SIZE(srcBucket) + 2;
21            if (keysize > bufsize) {
22                do {
23                    bufsize *= 2;
24                } while (keysize > bufsize);
25                buf = erealloc(buf, bufsize);
26            }
[1495]27            memcpy(buf, BUCKET_KEY_S(srcBucket), keysize - 2);
[1459]28            buf[keysize - 2] = buf[keysize - 1] = ""[0];
29            keysize = srcBucket->nKeyLength;
30#ifdef IS_UNICODE
31            if (BUCKET_KEY_TYPE(srcBucket) == IS_UNICODE) {
32                if (buf[0] == ""[0] && buf[1] == ""[0]) {
33                    keysize ++;
[1]34                }
[1459]35            } else
[1]36#endif
[1459]37            {
38                if (buf[0] == ""[0]) {
39                    keysize ++;
[1]40                }
41            }
[1459]42            add_u_assoc_zval_ex(dst, BUCKET_KEY_TYPE(srcBucket), ZSTR(buf), keysize, zv);
43        }
44        ')
[1]45
[1459]46        efree(buf);
47    ', ` dnl IFDASM else
48    dnl }}}
49    Bucket *srcBucket;
[1474]50    IFCOPY(`Bucket *first = NULL, *last = NULL;')
[1460]51    IFRELOCATE(`Bucket *dstBucket = NULL;')
[1474]52    IFRESTORE(`Bucket *dstBucket = NULL;')
[1460]53    IFRELOCATE(`uint n;')
[1474]54    IFRESTORE(`uint n;')
[1460]55    IFCALCCOPY(`size_t bucketSize;')
[1]56
[50]57#if defined(HARDENING_PATCH_HASH_PROTECT) && HARDENING_PATCH_HASH_PROTECT
[1459]58    IFRESTORE(`
59        DST(`canary') = zend_hash_canary;
60        DONE(canary)
61    ', `
62        PROCESS(unsigned int, canary)
63    ')
[50]64#endif
[1459]65    PROCESS(uint, nTableSize)
66    PROCESS(uint, nTableMask)
67    PROCESS(uint, nNumOfElements)
68    PROCESS(ulong, nNextFreeElement)
69    IFCOPY(`DST(`pInternalPointer') = NULL; /* Used for element traversal */') DONE(pInternalPointer)
[824]70#ifdef ZEND_ENGINE_2_4
[1393]71    if (SRC(`nTableMask')) {
[824]72#endif
[1380]73        CALLOC(`DST(`arBuckets')', Bucket*, SRC(`nTableSize'))
[1]74        DONE(arBuckets)
75        DISABLECHECK(`
[1472]76        for (srcBucket = PTR_FROM_VIRTUAL_EX(`Bucket', SRC(`pListHead')); srcBucket != NULL; srcBucket = PTR_FROM_VIRTUAL_EX(`Bucket', `srcBucket->pListNext')) {
[1460]77            IFCALCCOPY(`bucketSize = BUCKET_SIZE(srcBucket);')
78            ALLOC(dstBucket, char, bucketSize, , Bucket)
[1]79            IFCOPY(`
[823]80#ifdef ZEND_ENGINE_2_4
[1440]81                memcpy(dstBucket, srcBucket, BUCKET_HEAD_SIZE(Bucket));
[1352]82                if (BUCKET_KEY_SIZE(srcBucket)) {
[1440]83                    memcpy((char *) (dstBucket + 1), srcBucket->arKey, BUCKET_KEY_SIZE(srcBucket));
84                    dstBucket->arKey = (const char *) (dstBucket + 1);
[1352]85                }
86                else {
[1440]87                    dstBucket->arKey = NULL;
[1352]88                }
[823]89#else
[1460]90                memcpy(dstBucket, srcBucket, bucketSize);
[932]91#endif
[1380]92                n = srcBucket->h & SRC(`nTableMask');
[1440]93                /* dstBucket into hash node chain */
94                dstBucket->pLast = NULL;
95                dstBucket->pNext = DST(`arBuckets[n]');
96                if (dstBucket->pNext) {
97                    dstBucket->pNext->pLast = dstBucket;
[1]98                }
99            ')
[1460]100
[230]101            IFDPRINT(`
102                INDENT()
103                fprintf(stderr, "$2:\"");
[932]104                xc_dprint_str_len(BUCKET_KEY_S(srcBucket), BUCKET_KEY_SIZE(srcBucket));
105                fprintf(stderr, "\" %d:h=%lu ", BUCKET_KEY_SIZE(srcBucket), srcBucket->h);
[230]106            ')
[1]107            if (sizeof(void *) == sizeof($2)) {
[1440]108                IFCOPY(`dstBucket->pData = &dstBucket->pDataPtr;')
[1446]109                IFRELOCATE(`srcBucket->pData = &srcBucket->pDataPtr;')
110                dnl $6 = ` ' to skip alloc, skip pointer fix
[1440]111                STRUCT_P_EX(`$2', dstBucket->pData, (($2*)srcBucket->pData), `', `$3', ` ')
[1471]112                RELOCATE_EX(`$2', dstBucket->pData)
[1]113            }
114            else {
[1440]115                STRUCT_P_EX(`$2', dstBucket->pData, (($2*)srcBucket->pData), `', `$3')
116                IFCOPY(`dstBucket->pDataPtr = NULL;')
[1]117            }
118
[1460]119            IFCOPY(`
120                if (!first) {
121                    first = dstBucket;
122                }
[1]123
124                /* flat link */
[1460]125                dstBucket->pListLast = last;
[1440]126                dstBucket->pListNext = NULL;
[1460]127                if (last) {
128                    last->pListNext = dstBucket;
[1]129                }
[1460]130                last = dstBucket;
131
132                n = srcBucket->h & SRC(`nTableMask');
133                /* dstBucket into hash node chain */
134                dstBucket->pLast = NULL;
135                dstBucket->pNext = DST(`arBuckets[n]');
136                if (dstBucket->pNext) {
137                    dstBucket->pNext->pLast = dstBucket;
138                }
[1440]139                DST(`arBuckets[n]') = dstBucket;
140            ')
[1]141        }
[1440]142        ') dnl DISABLECHECK
[1460]143        IFCOPY(`DST(`pListHead') = first;') DONE(pListHead)
144        IFCOPY(`DST(`pListTail') = dstBucket;') DONE(pListTail)
145
[1471]146        IFRELOCATE(`
[1460]147        for (n = 0; n < SRC(`nTableSize'); ++n) {
148            if (SRC(`arBuckets[n]')) {
[1474]149                Bucket *next = PTR_FROM_VIRTUAL_EX(`Bucket', `DST(`arBuckets[n]')');
[1460]150                do {
151                        dstBucket = next;
[1472]152                        next = PTR_FROM_VIRTUAL_EX(`Bucket', `next->pNext');
[1460]153                        if (dstBucket->pListLast) {
[1471]154                            RELOCATE_EX(Bucket, dstBucket->pListLast)
[1460]155                        }
156                        if (dstBucket->pListNext) {
[1471]157                            RELOCATE_EX(Bucket, dstBucket->pListNext)
[1460]158                        }
159                        if (dstBucket->pNext) {
[1471]160                            RELOCATE_EX(Bucket, dstBucket->pNext)
[1460]161                        }
162                        if (dstBucket->pLast) {
[1471]163                            RELOCATE_EX(Bucket, dstBucket->pLast)
[1460]164                        }
165                } while (next);
166
[1471]167                RELOCATE(Bucket, arBuckets[n])
[1460]168            }
169        }
170        ')
[1494]171        if (SRC(`nNumOfElements')) {
172            RELOCATE(Bucket, pListHead)
173            RELOCATE(Bucket, pListTail)
174        }
[1471]175        RELOCATE(Bucket *, arBuckets)
[824]176#ifdef ZEND_ENGINE_2_4
177    }
[1380]178    else { /* if (SRC(`nTableMask')) */
[1460]179        IFCOPY(`DST(`pListHead') = NULL;') DONE(pListHead)
180        IFCOPY(`DST(`pListTail') = NULL;') DONE(pListTail)
[824]181        DONE(arBuckets)
182    }
183#endif
[1459]184    IFCOPY(`DST(`pDestructor') = SRC(`pDestructor');') DONE(pDestructor)
185    PROCESS(zend_bool, persistent)
[1]186#ifdef IS_UNICODE
[1459]187    PROCESS(zend_bool, unicode)
[1]188#endif
[1459]189    PROCESS(unsigned char, nApplyCount)
190    PROCESS(zend_bool, bApplyProtection)
[1]191#if ZEND_DEBUG
[1459]192    PROCESS(int, inconsistent)
[1]193#endif
[1459]194    ')dnl IFDASM
195    popdef(`FUNC_NAME')
196')')
Note: See TracBrowser for help on using the repository browser.