@@ -591,6 +591,17 @@ static zend_always_inline bool zend_opcache_static_cache_validate_available_writ
591591 return true;
592592}
593593
594+ static zend_always_inline bool zend_opcache_static_cache_store_backend_available (void )
595+ {
596+ if (!zend_opcache_validate_api_restriction ()) {
597+ zend_throw_exception_ex (zend_opcache_static_cache_exception_ce , 0 , ACCELERATOR_PRODUCT_NAME " API access is restricted" );
598+
599+ return false;
600+ }
601+
602+ return zend_opcache_static_cache_active_runtime ()-> available ;
603+ }
604+
594605static zend_always_inline bool zend_opcache_static_cache_acquire_write_lock (void )
595606{
596607 zend_opcache_static_cache_context * context = zend_opcache_static_cache_active_context ();
@@ -1184,9 +1195,11 @@ ZEND_METHOD(OPcache_VolatileStatic, __construct)
11841195
11851196ZEND_FUNCTION (OPcache_volatile_store )
11861197{
1198+ zend_opcache_static_cache_context * previous_context ;
11871199 zend_string * key ;
11881200 zend_long ttl = 0 ;
11891201 zval * value ;
1202+ bool stored ;
11901203
11911204 ZEND_PARSE_PARAMETERS_START (2 , 3 )
11921205 Z_PARAM_STR (key )
@@ -1203,11 +1216,24 @@ ZEND_FUNCTION(OPcache_volatile_store)
12031216 RETURN_THROWS ();
12041217 }
12051218
1206- if (!zend_opcache_static_cache_parse_ttl (ttl , 3 ) || ! zend_opcache_static_cache_validate_available_write () ) {
1219+ if (!zend_opcache_static_cache_parse_ttl (ttl , 3 )) {
12071220 RETURN_THROWS ();
12081221 }
12091222
1210- if (!zend_opcache_static_cache_explicit_store_prevalidated (key , value , ttl , false)) {
1223+ previous_context = zend_opcache_static_cache_activate_context (& zend_opcache_static_cache_volatile_context_state );
1224+ if (!zend_opcache_static_cache_store_backend_available ()) {
1225+ zend_opcache_static_cache_restore_context (previous_context );
1226+ if (EG (exception )) {
1227+ RETURN_THROWS ();
1228+ }
1229+
1230+ RETURN_FALSE ;
1231+ }
1232+
1233+ stored = zend_opcache_static_cache_explicit_store_prevalidated (key , value , ttl , false);
1234+ zend_opcache_static_cache_restore_context (previous_context );
1235+
1236+ if (!stored ) {
12111237 if (EG (exception )) {
12121238 RETURN_THROWS ();
12131239 }
@@ -1220,29 +1246,43 @@ ZEND_FUNCTION(OPcache_volatile_store)
12201246
12211247ZEND_FUNCTION (OPcache_volatile_store_array )
12221248{
1249+ zend_opcache_static_cache_context * previous_context ;
12231250 zend_string * key ;
12241251 zend_long ttl = 0 ;
12251252 zval * value ;
12261253 HashTable * values ;
1254+ bool stored ;
12271255
12281256 ZEND_PARSE_PARAMETERS_START (1 , 2 )
12291257 Z_PARAM_ARRAY_HT (values )
12301258 Z_PARAM_OPTIONAL
12311259 Z_PARAM_LONG (ttl )
12321260 ZEND_PARSE_PARAMETERS_END ();
12331261
1234- if (!zend_opcache_static_cache_parse_ttl (ttl , 2 ) || ! zend_opcache_static_cache_validate_available_write () ) {
1262+ if (!zend_opcache_static_cache_parse_ttl (ttl , 2 )) {
12351263 RETURN_THROWS ();
12361264 }
12371265
12381266 if (!zend_opcache_static_cache_validate_store_array_keys (values , 1 )) {
12391267 RETURN_THROWS ();
12401268 }
12411269
1270+ previous_context = zend_opcache_static_cache_activate_context (& zend_opcache_static_cache_volatile_context_state );
1271+ if (!zend_opcache_static_cache_store_backend_available ()) {
1272+ zend_opcache_static_cache_restore_context (previous_context );
1273+ if (EG (exception )) {
1274+ RETURN_THROWS ();
1275+ }
1276+
1277+ RETURN_FALSE ;
1278+ }
1279+
12421280 ZEND_HASH_FOREACH_STR_KEY_VAL (values , key , value ) {
12431281 ZEND_ASSERT (key != NULL );
12441282
1245- if (!zend_opcache_static_cache_explicit_store_prevalidated (key , value , ttl , false)) {
1283+ stored = zend_opcache_static_cache_explicit_store_prevalidated (key , value , ttl , false);
1284+ if (!stored ) {
1285+ zend_opcache_static_cache_restore_context (previous_context );
12461286 if (EG (exception )) {
12471287 RETURN_THROWS ();
12481288 }
@@ -1251,6 +1291,8 @@ ZEND_FUNCTION(OPcache_volatile_store_array)
12511291 }
12521292 } ZEND_HASH_FOREACH_END ();
12531293
1294+ zend_opcache_static_cache_restore_context (previous_context );
1295+
12541296 RETURN_TRUE ;
12551297}
12561298
@@ -1478,10 +1520,13 @@ ZEND_FUNCTION(OPcache_pinned_store)
14781520 }
14791521
14801522 previous_context = zend_opcache_static_cache_activate_context (& zend_opcache_static_cache_pinned_context_state );
1481- if (!zend_opcache_static_cache_validate_available_write ()) {
1523+ if (!zend_opcache_static_cache_store_backend_available ()) {
14821524 zend_opcache_static_cache_restore_context (previous_context );
1525+ if (EG (exception )) {
1526+ RETURN_THROWS ();
1527+ }
14831528
1484- RETURN_THROWS () ;
1529+ RETURN_FALSE ;
14851530 }
14861531
14871532 stored = zend_opcache_static_cache_explicit_store_prevalidated (key , value , 0 , true);
@@ -1490,6 +1535,8 @@ ZEND_FUNCTION(OPcache_pinned_store)
14901535 if (!stored ) {
14911536 RETURN_THROWS ();
14921537 }
1538+
1539+ RETURN_TRUE ;
14931540}
14941541
14951542ZEND_FUNCTION (OPcache_pinned_store_array )
@@ -1498,35 +1545,40 @@ ZEND_FUNCTION(OPcache_pinned_store_array)
14981545 zend_string * key ;
14991546 zval * value ;
15001547 HashTable * values ;
1548+ bool stored ;
15011549
15021550 ZEND_PARSE_PARAMETERS_START (1 , 1 )
15031551 Z_PARAM_ARRAY_HT (values )
15041552 ZEND_PARSE_PARAMETERS_END ();
15051553
1506- previous_context = zend_opcache_static_cache_activate_context (& zend_opcache_static_cache_pinned_context_state );
1507- if (!zend_opcache_static_cache_validate_available_write ()) {
1508- zend_opcache_static_cache_restore_context (previous_context );
1509-
1554+ if (!zend_opcache_static_cache_validate_store_array_keys (values , 1 )) {
15101555 RETURN_THROWS ();
15111556 }
15121557
1513- if (!zend_opcache_static_cache_validate_store_array_keys (values , 1 )) {
1558+ previous_context = zend_opcache_static_cache_activate_context (& zend_opcache_static_cache_pinned_context_state );
1559+ if (!zend_opcache_static_cache_store_backend_available ()) {
15141560 zend_opcache_static_cache_restore_context (previous_context );
1561+ if (EG (exception )) {
1562+ RETURN_THROWS ();
1563+ }
15151564
1516- RETURN_THROWS () ;
1565+ RETURN_FALSE ;
15171566 }
15181567
15191568 ZEND_HASH_FOREACH_STR_KEY_VAL (values , key , value ) {
15201569 ZEND_ASSERT (key != NULL );
15211570
1522- if (!zend_opcache_static_cache_explicit_store_prevalidated (key , value , 0 , true)) {
1571+ stored = zend_opcache_static_cache_explicit_store_prevalidated (key , value , 0 , true);
1572+ if (!stored ) {
15231573 zend_opcache_static_cache_restore_context (previous_context );
15241574
15251575 RETURN_THROWS ();
15261576 }
15271577 } ZEND_HASH_FOREACH_END ();
15281578
15291579 zend_opcache_static_cache_restore_context (previous_context );
1580+
1581+ RETURN_TRUE ;
15301582}
15311583
15321584ZEND_FUNCTION (OPcache_pinned_fetch )
0 commit comments