@@ -2251,20 +2251,41 @@ arena_i_extent_hooks_ctl(tsd_t *tsd, const size_t *mib, size_t miblen,
22512251
22522252 malloc_mutex_lock (tsd_tsdn (tsd ), & ctl_mtx );
22532253 MIB_UNSIGNED (arena_ind , 1 );
2254- if (arena_ind < narenas_total_get () && (arena =
2255- arena_get (tsd_tsdn (tsd ), arena_ind , false)) != NULL ) {
2256- if (newp != NULL ) {
2257- extent_hooks_t * old_extent_hooks ;
2258- extent_hooks_t * new_extent_hooks
2259- JEMALLOC_CC_SILENCE_INIT (NULL );
2260- WRITE (new_extent_hooks , extent_hooks_t * );
2261- old_extent_hooks = extent_hooks_set (tsd , arena ,
2262- new_extent_hooks );
2254+ if (arena_ind < narenas_total_get ()) {
2255+ extent_hooks_t * old_extent_hooks ;
2256+ arena = arena_get (tsd_tsdn (tsd ), arena_ind , false);
2257+ if (arena == NULL ) {
2258+ if (arena_ind >= narenas_auto ) {
2259+ ret = EFAULT ;
2260+ goto label_return ;
2261+ }
2262+ old_extent_hooks =
2263+ (extent_hooks_t * )& extent_hooks_default ;
22632264 READ (old_extent_hooks , extent_hooks_t * );
2265+ if (newp != NULL ) {
2266+ /* Initialize a new arena as a side effect. */
2267+ extent_hooks_t * new_extent_hooks
2268+ JEMALLOC_CC_SILENCE_INIT (NULL );
2269+ WRITE (new_extent_hooks , extent_hooks_t * );
2270+ arena = arena_init (tsd_tsdn (tsd ), arena_ind ,
2271+ new_extent_hooks );
2272+ if (arena == NULL ) {
2273+ ret = EFAULT ;
2274+ goto label_return ;
2275+ }
2276+ }
22642277 } else {
2265- extent_hooks_t * old_extent_hooks =
2266- extent_hooks_get (arena );
2267- READ (old_extent_hooks , extent_hooks_t * );
2278+ if (newp != NULL ) {
2279+ extent_hooks_t * new_extent_hooks
2280+ JEMALLOC_CC_SILENCE_INIT (NULL );
2281+ WRITE (new_extent_hooks , extent_hooks_t * );
2282+ old_extent_hooks = extent_hooks_set (tsd , arena ,
2283+ new_extent_hooks );
2284+ READ (old_extent_hooks , extent_hooks_t * );
2285+ } else {
2286+ old_extent_hooks = extent_hooks_get (arena );
2287+ READ (old_extent_hooks , extent_hooks_t * );
2288+ }
22682289 }
22692290 } else {
22702291 ret = EFAULT ;
0 commit comments