@@ -404,15 +404,15 @@ static inline void accel_unlock_all(void)
404
404
#define STRTAB_INVALID_POS 0
405
405
406
406
#define STRTAB_HASH_TO_SLOT (tab , h ) \
407
- ((uint32_t *)((char*)(tab) + sizeof(*(tab)) + ((h) & (tab)->nTableMask)))
407
+ ((zend_string_table_pos_t *)((char*)(tab) + sizeof(*(tab)) + ((h) & (tab)->nTableMask)))
408
408
#define STRTAB_STR_TO_POS (tab , s ) \
409
- ((uint32_t )((char*)s - (char*)(tab)))
409
+ ((zend_string_table_pos_t )((( char*)s - (char*)(tab))/ZEND_STRING_TABLE_POS_ALIGNMENT ))
410
410
#define STRTAB_POS_TO_STR (tab , pos ) \
411
- ((zend_string*)((char*)(tab) + (pos)))
411
+ ((zend_string*)((char*)(tab) + ((uintptr_t)( pos)*ZEND_STRING_TABLE_POS_ALIGNMENT )))
412
412
#define STRTAB_COLLISION (s ) \
413
- (*((uint32_t *)((char*)s - sizeof(uint32_t ))))
413
+ (*((zend_string_table_pos_t *)((char*)s - sizeof(zend_string_table_pos_t ))))
414
414
#define STRTAB_STR_SIZE (s ) \
415
- ZEND_MM_ALIGNED_SIZE_EX(_ZSTR_HEADER_SIZE + ZSTR_LEN(s) + 5, 8 )
415
+ ZEND_MM_ALIGNED_SIZE_EX(_ZSTR_STRUCT_SIZE( ZSTR_LEN(s)) + sizeof(zend_string_table_pos_t), ZEND_STRING_TABLE_POS_ALIGNMENT )
416
416
#define STRTAB_NEXT (s ) \
417
417
((zend_string*)((char*)(s) + STRTAB_STR_SIZE(s)))
418
418
@@ -500,7 +500,7 @@ static zend_always_inline zend_string *accel_find_interned_string(zend_string *s
500
500
zend_string * ZEND_FASTCALL accel_new_interned_string (zend_string * str )
501
501
{
502
502
zend_ulong h ;
503
- uint32_t pos , * hash_slot ;
503
+ zend_string_table_pos_t pos , * hash_slot ;
504
504
zend_string * s ;
505
505
506
506
if (UNEXPECTED (file_cache_only )) {
@@ -2842,7 +2842,7 @@ static zend_result zend_accel_init_shm(void)
2842
2842
} else {
2843
2843
/* Make sure there is always at least one interned string hash slot,
2844
2844
* so the table can be queried unconditionally. */
2845
- accel_shared_globals_size = sizeof (zend_accel_shared_globals ) + sizeof (uint32_t );
2845
+ accel_shared_globals_size = sizeof (zend_accel_shared_globals ) + sizeof (zend_string_table_pos_t );
2846
2846
}
2847
2847
2848
2848
accel_shared_globals = zend_shared_alloc (accel_shared_globals_size );
@@ -2869,18 +2869,22 @@ static zend_result zend_accel_init_shm(void)
2869
2869
hash_size |= (hash_size >> 8 );
2870
2870
hash_size |= (hash_size >> 16 );
2871
2871
2872
- ZCSG (interned_strings ).nTableMask = hash_size << 2 ;
2872
+ ZCSG (interned_strings ).nTableMask =
2873
+ hash_size * sizeof (zend_string_table_pos_t );
2873
2874
ZCSG (interned_strings ).nNumOfElements = 0 ;
2874
2875
ZCSG (interned_strings ).start =
2875
2876
(zend_string * )((char * )& ZCSG (interned_strings ) +
2876
2877
sizeof (zend_string_table ) +
2877
- ((hash_size + 1 ) * sizeof (uint32_t ))) +
2878
+ ((hash_size + 1 ) * sizeof (zend_string_table_pos_t ))) +
2878
2879
8 ;
2880
+ ZEND_ASSERT (((uintptr_t )ZCSG (interned_strings ).start & 0x7 ) == 0 ); /* should be 8 byte aligned */
2881
+
2879
2882
ZCSG (interned_strings ).top =
2880
2883
ZCSG (interned_strings ).start ;
2881
2884
ZCSG (interned_strings ).end =
2882
2885
(zend_string * )((char * )(accel_shared_globals + 1 ) + /* table data is stored after accel_shared_globals */
2883
2886
ZCG (accel_directives ).interned_strings_buffer * 1024 * 1024 );
2887
+ ZEND_ASSERT (((uintptr_t )ZCSG (interned_strings ).end - (uintptr_t )& ZCSG (interned_strings )) / ZEND_STRING_TABLE_POS_ALIGNMENT < ZEND_STRING_TABLE_POS_MAX );
2884
2888
ZCSG (interned_strings ).saved_top = NULL ;
2885
2889
2886
2890
memset ((char * )& ZCSG (interned_strings ) + sizeof (zend_string_table ),
0 commit comments