glibc/malloc
Istvan Kurucsai b90ddd08f6 malloc: Additional checks for unsorted bin integrity I.
On Thu, Jan 11, 2018 at 3:50 PM, Florian Weimer <fweimer@redhat.com> wrote:
> On 11/07/2017 04:27 PM, Istvan Kurucsai wrote:
>>
>> +          next = chunk_at_offset (victim, size);
>
>
> For new code, we prefer declarations with initializers.

Noted.

>> +          if (__glibc_unlikely (chunksize_nomask (victim) <= 2 * SIZE_SZ)
>> +              || __glibc_unlikely (chunksize_nomask (victim) >
>> av->system_mem))
>> +            malloc_printerr("malloc(): invalid size (unsorted)");
>> +          if (__glibc_unlikely (chunksize_nomask (next) < 2 * SIZE_SZ)
>> +              || __glibc_unlikely (chunksize_nomask (next) >
>> av->system_mem))
>> +            malloc_printerr("malloc(): invalid next size (unsorted)");
>> +          if (__glibc_unlikely ((prev_size (next) & ~(SIZE_BITS)) !=
>> size))
>> +            malloc_printerr("malloc(): mismatching next->prev_size
>> (unsorted)");
>
>
> I think this check is redundant because prev_size (next) and chunksize
> (victim) are loaded from the same memory location.

I'm fairly certain that it compares mchunk_size of victim against
mchunk_prev_size of the next chunk, i.e. the size of victim in its
header and footer.

>> +          if (__glibc_unlikely (bck->fd != victim)
>> +              || __glibc_unlikely (victim->fd != unsorted_chunks (av)))
>> +            malloc_printerr("malloc(): unsorted double linked list
>> corrupted");
>> +          if (__glibc_unlikely (prev_inuse(next)))
>> +            malloc_printerr("malloc(): invalid next->prev_inuse
>> (unsorted)");
>
>
> There's a missing space after malloc_printerr.

Noted.

> Why do you keep using chunksize_nomask?  We never investigated why the
> original code uses it.  It may have been an accident.

You are right, I don't think it makes a difference in these checks. So
the size local can be reused for the checks against victim. For next,
leaving it as such avoids the masking operation.

> Again, for non-main arenas, the checks against av->system_mem could be made
> tighter (against the heap size).  Maybe you could put the condition into a
> separate inline function?

We could also do a chunk boundary check similar to what I proposed in
the thread for the first patch in the series to be even more strict.
I'll gladly try to implement either but believe that refining these
checks would bring less benefits than in the case of the top chunk.
Intra-arena or intra-heap overlaps would still be doable here with
unsorted chunks and I don't see any way to counter that besides more
generic measures like randomizing allocations and your metadata
encoding patches.

I've attached a revised version with the above comments incorporated
but without the refined checks.

Thanks,
Istvan

From a12d5d40fd7aed5fa10fc444dcb819947b72b315 Mon Sep 17 00:00:00 2001
From: Istvan Kurucsai <pistukem@gmail.com>
Date: Tue, 16 Jan 2018 14:48:16 +0100
Subject: [PATCH v2 1/1] malloc: Additional checks for unsorted bin integrity
 I.

Ensure the following properties of chunks encountered during binning:
- victim chunk has reasonable size
- next chunk has reasonable size
- next->prev_size == victim->size
- valid double linked list
- PREV_INUSE of next chunk is unset

    * malloc/malloc.c (_int_malloc): Additional binning code checks.
2018-08-17 16:04:02 +02:00
..
Depend Update. 1999-10-04 22:59:43 +00:00
Makefile [BZ #22830] malloc_stats: restore cancellation for stderr correctly. 2018-02-10 16:24:17 -05:00
Versions Implement allocation buffers for internal use 2017-06-21 22:43:57 +02:00
alloc_buffer_alloc_array.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
alloc_buffer_allocate.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
alloc_buffer_copy_bytes.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
alloc_buffer_copy_string.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
alloc_buffer_create_failure.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
arena.c Run thread shutdown functions in an explicit order 2018-06-26 15:27:12 +02:00
dynarray-skeleton.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
dynarray.h Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
dynarray_at_failure.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
dynarray_emplace_enlarge.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
dynarray_finalize.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
dynarray_resize.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
dynarray_resize_clear.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
hooks.c malloc: Update heap dumping/undumping comments [BZ #23351] 2018-06-29 14:55:15 +02:00
malloc-hooks.h Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
malloc-internal.h Run thread shutdown functions in an explicit order 2018-06-26 15:27:12 +02:00
malloc.c malloc: Additional checks for unsorted bin integrity I. 2018-08-17 16:04:02 +02:00
malloc.h Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
mallocbug.c Reformat malloc to gnu style. 2014-01-02 09:40:10 +01:00
mcheck-init.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
mcheck.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
mcheck.h Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
memusage.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
memusage.sh Update copyright dates not handled by scripts/update-copyrights. 2018-01-01 00:41:16 +00:00
memusagestat.c Update copyright dates not handled by scripts/update-copyrights. 2018-01-01 00:41:16 +00:00
morecore.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
mtrace.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
mtrace.pl Update copyright dates not handled by scripts/update-copyrights. 2018-01-01 00:41:16 +00:00
obstack.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
obstack.h Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
reallocarray.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
scratch_buffer_grow.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
scratch_buffer_grow_preserve.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
scratch_buffer_set_array_size.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
set-freeres.c libc: Extend __libc_freeres framework (Bug 23329). 2018-06-29 22:39:06 -04:00
thread-freeres.c libc: Extend __libc_freeres framework (Bug 23329). 2018-06-29 22:39:06 -04:00
tst-alloc_buffer.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
tst-calloc.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
tst-dynarray-at-fail.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
tst-dynarray-fail.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
tst-dynarray-shared.h Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
tst-dynarray.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
tst-interpose-aux-nothread.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
tst-interpose-aux-thread.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
tst-interpose-aux.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
tst-interpose-aux.h Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
tst-interpose-nothread.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
tst-interpose-skeleton.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
tst-interpose-static-nothread.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
tst-interpose-static-thread.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
tst-interpose-thread.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
tst-malloc-backtrace.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
tst-malloc-fork-deadlock.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
tst-malloc-stats-cancellation.c [BZ #22830] malloc_stats: restore cancellation for stderr correctly. 2018-02-10 16:24:17 -05:00
tst-malloc-tcache-leak.c Increase some test timeouts. 2018-01-04 21:58:40 +00:00
tst-malloc-thread-exit.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
tst-malloc-thread-fail.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
tst-malloc-too-large.c Fix integer overflows in internal memalign and malloc functions [BZ #22343] 2018-01-18 17:55:45 +01:00
tst-malloc-usable-static-tunables.c Initialize tunable list with the GLIBC_TUNABLES environment variable 2016-12-31 23:49:24 +05:30
tst-malloc-usable-static.c Add framework for tunables 2016-12-31 23:49:24 +05:30
tst-malloc-usable-tunables.c Initialize tunable list with the GLIBC_TUNABLES environment variable 2016-12-31 23:49:24 +05:30
tst-malloc-usable.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
tst-malloc.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
tst-malloc_info.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
tst-mallocfork.c Prefer https for Sourceware links 2017-11-16 11:49:26 +05:30
tst-mallocfork2.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
tst-mallocstate.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
tst-mallopt.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
tst-mcheck.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
tst-memalign.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
tst-mtrace.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
tst-mtrace.sh Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
tst-obstack.c Modify several tests to use test-skeleton.c 2014-11-05 15:24:08 +05:30
tst-posix_memalign.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
tst-pvalloc.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
tst-realloc.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
tst-reallocarray.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
tst-scratch_buffer.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
tst-trim1.c * malloc/tst-trim1.c: New file. 2007-12-16 22:57:57 +00:00
tst-valloc.c Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00