[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[avr-libc-dev] [bug #53284] realloc() does not respect __freelist size f
From: |
David Glaze |
Subject: |
[avr-libc-dev] [bug #53284] realloc() does not respect __freelist size for small allocations |
Date: |
Sun, 4 Mar 2018 17:19:45 -0500 (EST) |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:58.0) Gecko/20100101 Firefox/58.0 |
URL:
<http://savannah.nongnu.org/bugs/?53284>
Summary: realloc() does not respect __freelist size for small
allocations
Project: AVR C Runtime Library
Submitted by: djglaze
Submitted on: Sun 04 Mar 2018 10:19:44 PM UTC
Category: Library
Severity: 3 - Normal
Priority: 5 - Normal
Item Group: libc code
Status: None
Percent Complete: 0%
Assigned to: None
Originator Email:
Open/Closed: Open
Discussion Lock: Any
Release: 2.0.0
Fixed Release: None
_______________________________________________________
Details:
The realloc() function does not respect the __freelist size when resizing an
allocation down to 0 or 1 bytes. If this allocation is then deallocated with
free(), a __freelist entry is placed in its slot that can partially overwrite
an adjacent allocation, leading to irrecoverable memory corruption. The
following code can reproduce the corruption:
// Relevant bytes in heap allocation shown in comments (User storage denoted
with 0xFF)
char * resizedVar = (char*)malloc(6); // 0x06 0x00 0xFF 0xFF 0xFF 0xFF
0xFF 0xFF
resizedVar = (char*)realloc(resizedVar, 1); // 0x01 0x00 0xFF
char * fixedVar = (char*)malloc(4); // 0x01 0x00 0xFF 0x04 0x00 0xFF
0xFF 0xFF 0xFF
free(resizedVar); // 0x01 0x00 0x00 0x00 0x00 0xFF
0xFF 0xFF 0xFF
// ^ Size of
fixedVar overwritten
malloc() handles this issue with a minimum allocation size, so that requested
allocations of 0, 1, or 2 bytes all take the same storage. The same technique
can be used here to prevent problems, as shown in the attached patch.
_______________________________________________________
File Attachments:
-------------------------------------------------------
Date: Sun 04 Mar 2018 10:19:44 PM UTC Name: realloc_small_size.patch Size:
614B By: djglaze
<http://savannah.nongnu.org/bugs/download.php?file_id=43463>
_______________________________________________________
Reply to this item at:
<http://savannah.nongnu.org/bugs/?53284>
_______________________________________________
Message sent via/by Savannah
http://savannah.nongnu.org/
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [avr-libc-dev] [bug #53284] realloc() does not respect __freelist size for small allocations,
David Glaze <=