Message ID | 20201229202416.432569-1-adhemerval.zanella@linaro.org |
---|---|
State | New |
Headers | show |
Series | malloc: preserve errno on mcheck hooks [BZ #17924] | expand |
On Tue, Dec 29, 2020 at 12:24 PM Adhemerval Zanella <adhemerval.zanella@linaro.org> wrote: > > Similar to the fix 69fda43b8d, save and restore errno for the hook > functions used for MALLOC_CHECK_=3. > > It fixes the malloc/tst-free-errno-mcheck regression. > > Checked on x86_64-linux-gnu. > --- > malloc/hooks.c | 16 +++++++++++----- > 1 file changed, 11 insertions(+), 5 deletions(-) > > diff --git a/malloc/hooks.c b/malloc/hooks.c > index 6474ba8b38..fc285f15c6 100644 > --- a/malloc/hooks.c > +++ b/malloc/hooks.c > @@ -260,6 +260,8 @@ free_check (void *mem, const void *caller) > if (!mem) > return; > > + int err = errno; > + > #ifdef USE_MTAG > /* Quickly check that the freed pointer matches the tag for the memory. > This gives a useful double-free detection. */ > @@ -274,12 +276,16 @@ free_check (void *mem, const void *caller) > { > __libc_lock_unlock (main_arena.mutex); > munmap_chunk (p); > - return; > } > - /* Mark the chunk as belonging to the library again. */ > - (void)TAG_REGION (chunk2rawmem (p), CHUNK_AVAILABLE_SIZE (p) - CHUNK_HDR_SZ); > - _int_free (&main_arena, p, 1); > - __libc_lock_unlock (main_arena.mutex); > + else > + { > + /* Mark the chunk as belonging to the library again. */ > + (void)TAG_REGION (chunk2rawmem (p), CHUNK_AVAILABLE_SIZE (p) > + - CHUNK_HDR_SZ); > + _int_free (&main_arena, p, 1); > + __libc_lock_unlock (main_arena.mutex); > + } > + __set_errno (err); > } > > static void * > -- > 2.25.1 > LGTM. Thanks.
On 12/29/20 12:24 PM, Adhemerval Zanella wrote: > Similar to the fix 69fda43b8d, save and restore errno for the hook > functions used for MALLOC_CHECK_=3. > > It fixes the malloc/tst-free-errno-mcheck regression. Thanks, this patch looks good to me.
diff --git a/malloc/hooks.c b/malloc/hooks.c index 6474ba8b38..fc285f15c6 100644 --- a/malloc/hooks.c +++ b/malloc/hooks.c @@ -260,6 +260,8 @@ free_check (void *mem, const void *caller) if (!mem) return; + int err = errno; + #ifdef USE_MTAG /* Quickly check that the freed pointer matches the tag for the memory. This gives a useful double-free detection. */ @@ -274,12 +276,16 @@ free_check (void *mem, const void *caller) { __libc_lock_unlock (main_arena.mutex); munmap_chunk (p); - return; } - /* Mark the chunk as belonging to the library again. */ - (void)TAG_REGION (chunk2rawmem (p), CHUNK_AVAILABLE_SIZE (p) - CHUNK_HDR_SZ); - _int_free (&main_arena, p, 1); - __libc_lock_unlock (main_arena.mutex); + else + { + /* Mark the chunk as belonging to the library again. */ + (void)TAG_REGION (chunk2rawmem (p), CHUNK_AVAILABLE_SIZE (p) + - CHUNK_HDR_SZ); + _int_free (&main_arena, p, 1); + __libc_lock_unlock (main_arena.mutex); + } + __set_errno (err); } static void *