@@ -202,6 +202,12 @@ typedef struct _zend_file_cache_metainfo {
202202 uint32_t checksum ;
203203} zend_file_cache_metainfo ;
204204
205+ typedef struct _zend_file_cache_handle {
206+ zend_string * full_path ;
207+ zend_file_cache_metainfo info ;
208+ void * mem , * checkpoint ;
209+ } zend_file_cache_handle ;
210+
205211static int zend_file_cache_mkdir (char * filename , size_t start )
206212{
207213 char * s = filename + start ;
@@ -1813,7 +1819,7 @@ static void zend_file_cache_unserialize(zend_persistent_script *script,
18131819 zend_file_cache_unserialize_early_bindings (script , buf );
18141820}
18151821
1816- zend_always_inline zend_result zend_file_cache_open (zend_file_handle * file_handle , zend_file_cache_handle * cache_handle )
1822+ zend_result zend_file_cache_validate_and_open (zend_file_handle * file_handle , zend_file_cache_handle * cache_handle )
18171823{
18181824 int fd ;
18191825 char * filename ;
@@ -1822,9 +1828,9 @@ zend_always_inline zend_result zend_file_cache_open(zend_file_handle *file_handl
18221828 if (!file_handle || !file_handle -> opened_path ) {
18231829 return FAILURE ;
18241830 }
1825- zend_file_cache_handle -> full_path = file_handle -> opened_path
1831+ cache_handle -> full_path = file_handle -> opened_path ;
18261832
1827- filename = zend_file_cache_get_bin_file_path (zend_file_cache_handle -> full_path );
1833+ filename = zend_file_cache_get_bin_file_path (cache_handle -> full_path );
18281834 fd = zend_file_cache_open (filename , O_RDONLY | O_BINARY );
18291835 if (fd < 0 ) {
18301836 goto failure ; // Open failed
@@ -1835,35 +1841,35 @@ zend_always_inline zend_result zend_file_cache_open(zend_file_handle *file_handl
18351841 }
18361842
18371843
1838- if (read (fd , & zend_file_cache_handle -> info , sizeof (zend_file_cache_handle -> info )) != sizeof (zend_file_cache_handle -> info )) {
1844+ if (read (fd , & cache_handle -> info , sizeof (cache_handle -> info )) != sizeof (cache_handle -> info )) {
18391845 zend_accel_error (ACCEL_LOG_WARNING , "opcache cannot read from file '%s' (info)\n" , filename );
18401846 goto failure_unlock_close ;
18411847 }
18421848
18431849 // Verify header
1844- if (memcmp (zend_file_cache_handle -> info .magic , "OPCACHE" , 8 ) != 0 || memcmp (zend_file_cache_handle -> info .system_id , zend_system_id , 32 ) != 0 ) {
1850+ if (memcmp (cache_handle -> info .magic , "OPCACHE" , 8 ) != 0 || memcmp (cache_handle -> info .system_id , zend_system_id , 32 ) != 0 ) {
18451851 zend_accel_error (ACCEL_LOG_WARNING , "opcache invalid header in file '%s'\n" , filename );
18461852 goto failure_unlock_close ;
18471853 }
18481854
18491855 // Verify timestamp if required
18501856 if (ZCG (accel_directives ).validate_timestamps &&
1851- zend_get_file_handle_timestamp (file_handle , NULL ) != zend_file_cache_handle -> info .timestamp ) {
1857+ zend_get_file_handle_timestamp (file_handle , NULL ) != cache_handle -> info .timestamp ) {
18521858 goto failure_unlock_close ;
18531859 }
18541860
1855- zend_file_cache_handle -> checkpoint = zend_arena_checkpoint (CG (arena ));
1861+ cache_handle -> checkpoint = zend_arena_checkpoint (CG (arena ));
18561862#if defined(__AVX__ ) || defined(__SSE2__ )
18571863 /* Align to 64-byte boundary */
1858- zend_file_cache_handle -> mem = zend_arena_alloc (& CG (arena ), zend_file_cache_handle -> info .mem_size + zend_file_cache_handle -> info .str_size + 64 );
1859- zend_file_cache_handle -> mem = (void * )(((uintptr_t )zend_file_cache_handle -> mem + 63L ) & ~63L );
1864+ cache_handle -> mem = zend_arena_alloc (& CG (arena ), cache_handle -> info .mem_size + cache_handle -> info .str_size + 64 );
1865+ cache_handle -> mem = (void * )(((uintptr_t )cache_handle -> mem + 63L ) & ~63L );
18601866#else
1861- zend_file_cache_handle -> mem = zend_arena_alloc (& CG (arena ), zend_file_cache_handle -> info .mem_size + zend_file_cache_handle -> info .str_size );
1867+ cache_handle -> mem = zend_arena_alloc (& CG (arena ), cache_handle -> info .mem_size + cache_handle -> info .str_size );
18621868#endif
18631869
1864- if (read (fd , zend_file_cache_handle -> mem , zend_file_cache_handle -> info .mem_size + zend_file_cache_handle -> info .str_size ) != (ssize_t )(zend_file_cache_handle -> info .mem_size + zend_file_cache_handle -> info .str_size )) {
1870+ if (read (fd , cache_handle -> mem , cache_handle -> info .mem_size + cache_handle -> info .str_size ) != (ssize_t )(cache_handle -> info .mem_size + cache_handle -> info .str_size )) {
18651871 zend_accel_error (ACCEL_LOG_WARNING , "opcache cannot read from file '%s' (mem)\n" , filename );
1866- zend_arena_release (& CG (arena ), zend_file_cache_handle -> checkpoint );
1872+ zend_arena_release (& CG (arena ), cache_handle -> checkpoint );
18671873 goto failure_unlock_close ;
18681874 }
18691875 if (zend_file_cache_flock (fd , LOCK_UN ) != 0 ) {
@@ -1873,9 +1879,9 @@ zend_always_inline zend_result zend_file_cache_open(zend_file_handle *file_handl
18731879
18741880 /* verify checksum */
18751881 if (ZCG (accel_directives ).file_cache_consistency_checks &&
1876- (actual_checksum = zend_adler32 (ADLER32_INIT , zend_file_cache_handle -> mem , zend_file_cache_handle -> info .mem_size + zend_file_cache_handle -> info .str_size )) != zend_file_cache_handle -> info .checksum ) {
1877- zend_accel_error (ACCEL_LOG_WARNING , "corrupted file '%s' excepted checksum: 0x%08x actual checksum: 0x%08x\n" , filename , zend_file_cache_handle -> info .checksum , actual_checksum );
1878- zend_arena_release (& CG (arena ), zend_file_cache_handle -> checkpoint );
1882+ (actual_checksum = zend_adler32 (ADLER32_INIT , cache_handle -> mem , cache_handle -> info .mem_size + cache_handle -> info .str_size )) != cache_handle -> info .checksum ) {
1883+ zend_accel_error (ACCEL_LOG_WARNING , "corrupted file '%s' excepted checksum: 0x%08x actual checksum: 0x%08x\n" , filename , cache_handle -> info .checksum , actual_checksum );
1884+ zend_arena_release (& CG (arena ), cache_handle -> checkpoint );
18791885 goto failure ;
18801886 }
18811887
@@ -1895,18 +1901,18 @@ zend_always_inline zend_result zend_file_cache_open(zend_file_handle *file_handl
18951901 return FAILURE ;
18961902}
18971903
1898- zend_always_inline void zend_file_cache_close (zend_file_cache_handle * cache_handle )
1904+ void zend_file_cache_close (zend_file_cache_handle * cache_handle )
18991905{
1900- zend_arena_release (& CG (arena ), zend_file_cache_handle -> checkpoint );
1906+ zend_arena_release (& CG (arena ), cache_handle -> checkpoint );
19011907}
19021908
19031909zend_result zend_file_cache_validate (zend_file_handle * file_handle )
19041910{
19051911 zend_file_cache_handle cache_handle ;
19061912
1907- zend_result ret = zend_file_cache_open (file_handle , & cache_handle );
1913+ zend_result ret = zend_file_cache_validate_and_open (file_handle , & cache_handle );
19081914
1909- if (res == SUCCESS ) {
1915+ if (ret == SUCCESS ) {
19101916 zend_file_cache_close (& cache_handle );
19111917 }
19121918
@@ -1922,7 +1928,7 @@ zend_persistent_script *zend_file_cache_script_load(zend_file_handle *file_handl
19221928 bool cache_it = true;
19231929 bool ok ;
19241930
1925- if (zend_file_cache_open (file_handle , & cache_handle ) == FAILURE ) {
1931+ if (zend_file_cache_validate_and_open (file_handle , & cache_handle ) == FAILURE ) {
19261932 return NULL ;
19271933 }
19281934
@@ -1937,7 +1943,7 @@ zend_persistent_script *zend_file_cache_script_load(zend_file_handle *file_handl
19371943 /* Check if we still need to put the file into the cache (may be it was
19381944 * already stored by another process. This final check is done under
19391945 * exclusive lock) */
1940- bucket = zend_accel_hash_find_entry (& ZCSG (hash ), cache_handle -> full_path );
1946+ bucket = zend_accel_hash_find_entry (& ZCSG (hash ), cache_handle . full_path );
19411947 if (bucket ) {
19421948 script = (zend_persistent_script * )bucket -> data ;
19431949 if (!script -> corrupted ) {
@@ -1955,23 +1961,23 @@ zend_persistent_script *zend_file_cache_script_load(zend_file_handle *file_handl
19551961 goto use_process_mem ;
19561962 }
19571963
1958- buf = zend_shared_alloc_aligned (cache_handle -> info .mem_size );
1964+ buf = zend_shared_alloc_aligned (cache_handle . info .mem_size );
19591965
19601966 if (!buf ) {
19611967 zend_accel_schedule_restart_if_necessary (ACCEL_RESTART_OOM );
19621968 zend_shared_alloc_unlock ();
19631969 goto use_process_mem ;
19641970 }
1965- memcpy (buf , cache_handle -> mem , cache_handle -> info .mem_size );
1971+ memcpy (buf , cache_handle . mem , cache_handle . info .mem_size );
19661972 zend_map_ptr_extend (ZCSG (map_ptr_last ));
19671973 } else {
19681974use_process_mem :
1969- buf = cache_handle -> mem ;
1975+ buf = cache_handle . mem ;
19701976 cache_it = false;
19711977 }
19721978
1973- ZCG (cache_handle -> mem ) = ((char * )cache_handle -> mem + cache_handle -> info .mem_size );
1974- script = (zend_persistent_script * )((char * )buf + cache_handle -> info .script_offset );
1979+ ZCG (mem ) = ((char * )cache_handle . mem + cache_handle . info .mem_size );
1980+ script = (zend_persistent_script * )((char * )buf + cache_handle . info .script_offset );
19751981 script -> corrupted = !cache_it ; /* used to check if script restored to SHM or process memory */
19761982
19771983 ok = true;
0 commit comments