@@ -1813,187 +1813,58 @@ static void zend_file_cache_unserialize(zend_persistent_script *script,
1813
1813
zend_file_cache_unserialize_early_bindings (script , buf );
1814
1814
}
1815
1815
1816
- // Function to validate the file cache and return a boolean result
1817
- bool zend_file_cache_script_validate (zend_file_handle * file_handle )
1816
+ zend_always_inline zend_result zend_file_cache_open (zend_file_handle * file_handle , zend_file_cache_handle * cache_handle )
1818
1817
{
1819
- int fd ;
1820
- char * filename ;
1821
- zend_file_cache_metainfo info ;
1822
- unsigned int actual_checksum ;
1823
- void * mem , * checkpoint ;
1824
-
1825
- if (!file_handle || !file_handle -> opened_path ) {
1826
- return false;
1827
- }
1828
-
1829
- filename = zend_file_cache_get_bin_file_path (file_handle -> opened_path );
1830
- fd = zend_file_cache_open (filename , O_RDONLY | O_BINARY );
1831
- if (fd < 0 ) {
1832
- goto failure ; // Open failed
1833
- }
1834
-
1835
- if (zend_file_cache_flock (fd , LOCK_SH ) != 0 ) {
1836
- goto failure_close ; // Flock failed
1837
- }
1838
-
1839
-
1840
- if (read (fd , & info , sizeof (info )) != sizeof (info )) {
1841
- zend_accel_error (ACCEL_LOG_WARNING , "opcache cannot read from file '%s' (info)\n" , filename );
1842
- goto failure_unlock_close ;
1843
- }
1844
-
1845
- // Verify header
1846
- if (memcmp (info .magic , "OPCACHE" , 8 ) != 0 || memcmp (info .system_id , zend_system_id , 32 ) != 0 ) {
1847
- zend_accel_error (ACCEL_LOG_WARNING , "opcache invalid header in file '%s'\n" , filename );
1848
- goto failure_unlock_close ;
1849
- }
1850
-
1851
- // Verify timestamp if required
1852
- if (ZCG (accel_directives ).validate_timestamps &&
1853
- zend_get_file_handle_timestamp (file_handle , NULL ) != info .timestamp ) {
1854
- goto failure_unlock_close ;
1855
- }
1856
-
1857
- checkpoint = zend_arena_checkpoint (CG (arena ));
1858
- #if defined(__AVX__ ) || defined(__SSE2__ )
1859
- /* Align to 64-byte boundary */
1860
- mem = zend_arena_alloc (& CG (arena ), info .mem_size + info .str_size + 64 );
1861
- mem = (void * )(((uintptr_t )mem + 63L ) & ~63L );
1862
- #else
1863
- mem = zend_arena_alloc (& CG (arena ), info .mem_size + info .str_size );
1864
- #endif
1865
-
1866
- if (read (fd , mem , info .mem_size + info .str_size ) != (ssize_t )(info .mem_size + info .str_size )) {
1867
- zend_accel_error (ACCEL_LOG_WARNING , "opcache cannot read from file '%s' (mem)\n" , filename );
1868
- zend_arena_release (& CG (arena ), checkpoint );
1869
- goto failure_unlock_close ;
1870
- }
1871
- if (zend_file_cache_flock (fd , LOCK_UN ) != 0 ) {
1872
- zend_accel_error (ACCEL_LOG_WARNING , "opcache cannot unlock file '%s'\n" , filename );
1873
- }
1874
- close (fd );
1875
-
1876
- /* verify checksum */
1877
- if (ZCG (accel_directives ).file_cache_consistency_checks &&
1878
- (actual_checksum = zend_adler32 (ADLER32_INIT , mem , info .mem_size + info .str_size )) != info .checksum ) {
1879
- zend_accel_error (ACCEL_LOG_WARNING , "corrupted file '%s' excepted checksum: 0x%08x actual checksum: 0x%08x\n" , filename , info .checksum , actual_checksum );
1880
- zend_arena_release (& CG (arena ), checkpoint );
1881
- goto failure ;
1882
- }
1883
-
1884
- zend_arena_release (& CG (arena ), checkpoint );
1885
- efree (filename );
1886
- return true; // Validation successful
1887
-
1888
- failure_unlock_close :
1889
- zend_file_cache_flock (fd , LOCK_UN );
1890
- failure_close :
1891
- close (fd );
1892
- failure :
1893
- if (!ZCG (accel_directives ).file_cache_read_only ) {
1894
- zend_file_cache_unlink (filename );
1895
- }
1896
- efree (filename );
1897
-
1898
- return false; // Validation failed
1899
- }
1900
-
1901
- zend_persistent_script * zend_file_cache_script_load (zend_file_handle * file_handle )
1902
- {
1903
- zend_string * full_path = file_handle -> opened_path ;
1904
1818
int fd ;
1905
1819
char * filename ;
1906
- zend_persistent_script * script ;
1907
- zend_file_cache_metainfo info ;
1908
- zend_accel_hash_entry * bucket ;
1909
- void * mem , * checkpoint , * buf ;
1910
- bool cache_it = true;
1911
1820
unsigned int actual_checksum ;
1912
- bool ok ;
1913
1821
1914
- if (!full_path ) {
1915
- return NULL ;
1822
+ if (!file_handle || ! file_handle -> opened_path ) {
1823
+ return FAILURE ;
1916
1824
}
1917
- filename = zend_file_cache_get_bin_file_path ( full_path );
1825
+ zend_file_cache_handle -> full_path = file_handle -> opened_path
1918
1826
1827
+ filename = zend_file_cache_get_bin_file_path (zend_file_cache_handle -> full_path );
1919
1828
fd = zend_file_cache_open (filename , O_RDONLY | O_BINARY );
1920
1829
if (fd < 0 ) {
1921
- efree (filename );
1922
- return NULL ;
1830
+ goto failure ; // Open failed
1923
1831
}
1924
1832
1925
1833
if (zend_file_cache_flock (fd , LOCK_SH ) != 0 ) {
1926
- close (fd );
1927
- efree (filename );
1928
- return NULL ;
1834
+ goto failure_close ; // Flock failed
1929
1835
}
1930
1836
1931
- if (read (fd , & info , sizeof (info )) != sizeof (info )) {
1837
+
1838
+ if (read (fd , & zend_file_cache_handle -> info , sizeof (zend_file_cache_handle -> info )) != sizeof (zend_file_cache_handle -> info )) {
1932
1839
zend_accel_error (ACCEL_LOG_WARNING , "opcache cannot read from file '%s' (info)\n" , filename );
1933
- zend_file_cache_flock (fd , LOCK_UN );
1934
- close (fd );
1935
- if (!ZCG (accel_directives ).file_cache_read_only ) {
1936
- zend_file_cache_unlink (filename );
1937
- }
1938
- efree (filename );
1939
- return NULL ;
1840
+ goto failure_unlock_close ;
1940
1841
}
1941
1842
1942
- /* verify header */
1943
- if (memcmp (info .magic , "OPCACHE" , 8 ) != 0 ) {
1944
- zend_accel_error (ACCEL_LOG_WARNING , "opcache cannot read from file '%s' (wrong header)\n" , filename );
1945
- zend_file_cache_flock (fd , LOCK_UN );
1946
- close (fd );
1947
- if (!ZCG (accel_directives ).file_cache_read_only ) {
1948
- zend_file_cache_unlink (filename );
1949
- }
1950
- efree (filename );
1951
- return NULL ;
1952
- }
1953
- if (memcmp (info .system_id , zend_system_id , 32 ) != 0 ) {
1954
- zend_accel_error (ACCEL_LOG_WARNING , "opcache cannot read from file '%s' (wrong \"system_id\")\n" , filename );
1955
- zend_file_cache_flock (fd , LOCK_UN );
1956
- close (fd );
1957
- if (!ZCG (accel_directives ).file_cache_read_only ) {
1958
- zend_file_cache_unlink (filename );
1959
- }
1960
- efree (filename );
1961
- return NULL ;
1843
+ // 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 ) {
1845
+ zend_accel_error (ACCEL_LOG_WARNING , "opcache invalid header in file '%s'\n" , filename );
1846
+ goto failure_unlock_close ;
1962
1847
}
1963
1848
1964
- /* verify timestamp */
1849
+ // Verify timestamp if required
1965
1850
if (ZCG (accel_directives ).validate_timestamps &&
1966
- zend_get_file_handle_timestamp (file_handle , NULL ) != info .timestamp ) {
1967
- if (zend_file_cache_flock (fd , LOCK_UN ) != 0 ) {
1968
- zend_accel_error (ACCEL_LOG_WARNING , "opcache cannot unlock file '%s'\n" , filename );
1969
- }
1970
- close (fd );
1971
- if (!ZCG (accel_directives ).file_cache_read_only ) {
1972
- zend_file_cache_unlink (filename );
1973
- }
1974
- efree (filename );
1975
- return NULL ;
1851
+ zend_get_file_handle_timestamp (file_handle , NULL ) != zend_file_cache_handle -> info .timestamp ) {
1852
+ goto failure_unlock_close ;
1976
1853
}
1977
1854
1978
- checkpoint = zend_arena_checkpoint (CG (arena ));
1855
+ zend_file_cache_handle -> checkpoint = zend_arena_checkpoint (CG (arena ));
1979
1856
#if defined(__AVX__ ) || defined(__SSE2__ )
1980
1857
/* Align to 64-byte boundary */
1981
- mem = zend_arena_alloc (& CG (arena ), info .mem_size + info .str_size + 64 );
1982
- mem = (void * )(((uintptr_t )mem + 63L ) & ~63L );
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 );
1983
1860
#else
1984
- mem = zend_arena_alloc (& CG (arena ), info .mem_size + info .str_size );
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 );
1985
1862
#endif
1986
1863
1987
- if (read (fd , mem , info .mem_size + info .str_size ) != (ssize_t )(info .mem_size + info .str_size )) {
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 )) {
1988
1865
zend_accel_error (ACCEL_LOG_WARNING , "opcache cannot read from file '%s' (mem)\n" , filename );
1989
- zend_file_cache_flock (fd , LOCK_UN );
1990
- close (fd );
1991
- if (!ZCG (accel_directives ).file_cache_read_only ) {
1992
- zend_file_cache_unlink (filename );
1993
- }
1994
- zend_arena_release (& CG (arena ), checkpoint );
1995
- efree (filename );
1996
- return NULL ;
1866
+ zend_arena_release (& CG (arena ), zend_file_cache_handle -> checkpoint );
1867
+ goto failure_unlock_close ;
1997
1868
}
1998
1869
if (zend_file_cache_flock (fd , LOCK_UN ) != 0 ) {
1999
1870
zend_accel_error (ACCEL_LOG_WARNING , "opcache cannot unlock file '%s'\n" , filename );
@@ -2002,13 +1873,56 @@ zend_persistent_script *zend_file_cache_script_load(zend_file_handle *file_handl
2002
1873
2003
1874
/* verify checksum */
2004
1875
if (ZCG (accel_directives ).file_cache_consistency_checks &&
2005
- (actual_checksum = zend_adler32 (ADLER32_INIT , mem , info .mem_size + info .str_size )) != info .checksum ) {
2006
- zend_accel_error (ACCEL_LOG_WARNING , "corrupted file '%s' excepted checksum: 0x%08x actual checksum: 0x%08x\n" , filename , info .checksum , actual_checksum );
2007
- if (!ZCG (accel_directives ).file_cache_read_only ) {
2008
- zend_file_cache_unlink (filename );
2009
- }
2010
- zend_arena_release (& CG (arena ), checkpoint );
2011
- efree (filename );
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 );
1879
+ goto failure ;
1880
+ }
1881
+
1882
+ efree (filename );
1883
+ return SUCCESS ;
1884
+
1885
+ failure_unlock_close :
1886
+ zend_file_cache_flock (fd , LOCK_UN );
1887
+ failure_close :
1888
+ close (fd );
1889
+ failure :
1890
+ if (!ZCG (accel_directives ).file_cache_read_only ) {
1891
+ zend_file_cache_unlink (filename );
1892
+ }
1893
+ efree (filename );
1894
+
1895
+ return FAILURE ;
1896
+ }
1897
+
1898
+ zend_always_inline void zend_file_cache_close (zend_file_cache_handle * cache_handle )
1899
+ {
1900
+ zend_arena_release (& CG (arena ), zend_file_cache_handle -> checkpoint );
1901
+ }
1902
+
1903
+ zend_result zend_file_cache_validate (zend_file_handle * file_handle )
1904
+ {
1905
+ zend_file_cache_handle cache_handle ;
1906
+
1907
+ zend_result ret = zend_file_cache_open (file_handle , & cache_handle );
1908
+
1909
+ if (res == SUCCESS ) {
1910
+ zend_file_cache_close (& cache_handle );
1911
+ }
1912
+
1913
+ return ret ;
1914
+ }
1915
+
1916
+ zend_persistent_script * zend_file_cache_script_load (zend_file_handle * file_handle )
1917
+ {
1918
+ zend_file_cache_handle cache_handle ;
1919
+ zend_persistent_script * script ;
1920
+ zend_accel_hash_entry * bucket ;
1921
+ void * buf ;
1922
+ bool cache_it = true;
1923
+ bool ok ;
1924
+
1925
+ if (zend_file_cache_open (file_handle , & cache_handle ) == FAILURE ) {
2012
1926
return NULL ;
2013
1927
}
2014
1928
@@ -2023,13 +1937,12 @@ zend_persistent_script *zend_file_cache_script_load(zend_file_handle *file_handl
2023
1937
/* Check if we still need to put the file into the cache (may be it was
2024
1938
* already stored by another process. This final check is done under
2025
1939
* exclusive lock) */
2026
- bucket = zend_accel_hash_find_entry (& ZCSG (hash ), full_path );
1940
+ bucket = zend_accel_hash_find_entry (& ZCSG (hash ), cache_handle -> full_path );
2027
1941
if (bucket ) {
2028
1942
script = (zend_persistent_script * )bucket -> data ;
2029
1943
if (!script -> corrupted ) {
2030
1944
zend_shared_alloc_unlock ();
2031
- zend_arena_release (& CG (arena ), checkpoint );
2032
- efree (filename );
1945
+ zend_file_cache_close (& cache_handle );
2033
1946
return script ;
2034
1947
}
2035
1948
}
@@ -2042,23 +1955,23 @@ zend_persistent_script *zend_file_cache_script_load(zend_file_handle *file_handl
2042
1955
goto use_process_mem ;
2043
1956
}
2044
1957
2045
- buf = zend_shared_alloc_aligned (info .mem_size );
1958
+ buf = zend_shared_alloc_aligned (cache_handle -> info .mem_size );
2046
1959
2047
1960
if (!buf ) {
2048
1961
zend_accel_schedule_restart_if_necessary (ACCEL_RESTART_OOM );
2049
1962
zend_shared_alloc_unlock ();
2050
1963
goto use_process_mem ;
2051
1964
}
2052
- memcpy (buf , mem , info .mem_size );
1965
+ memcpy (buf , cache_handle -> mem , cache_handle -> info .mem_size );
2053
1966
zend_map_ptr_extend (ZCSG (map_ptr_last ));
2054
1967
} else {
2055
1968
use_process_mem :
2056
- buf = mem ;
1969
+ buf = cache_handle -> mem ;
2057
1970
cache_it = false;
2058
1971
}
2059
1972
2060
- ZCG (mem ) = ((char * )mem + info .mem_size );
2061
- script = (zend_persistent_script * )((char * )buf + info .script_offset );
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 );
2062
1975
script -> corrupted = !cache_it ; /* used to check if script restored to SHM or process memory */
2063
1976
2064
1977
ok = true;
@@ -2072,8 +1985,7 @@ zend_persistent_script *zend_file_cache_script_load(zend_file_handle *file_handl
2072
1985
zend_shared_alloc_unlock ();
2073
1986
goto use_process_mem ;
2074
1987
} else {
2075
- zend_arena_release (& CG (arena ), checkpoint );
2076
- efree (filename );
1988
+ zend_file_cache_close (& cache_handle );
2077
1989
return NULL ;
2078
1990
}
2079
1991
}
@@ -2089,9 +2001,8 @@ zend_persistent_script *zend_file_cache_script_load(zend_file_handle *file_handl
2089
2001
zend_shared_alloc_unlock ();
2090
2002
zend_accel_error (ACCEL_LOG_INFO , "File cached script loaded into memory '%s'" , ZSTR_VAL (script -> script .filename ));
2091
2003
2092
- zend_arena_release ( & CG ( arena ), checkpoint );
2004
+ zend_file_cache_close ( & cache_handle );
2093
2005
}
2094
- efree (filename );
2095
2006
2096
2007
return script ;
2097
2008
}
0 commit comments