diff options
author | William Wilgus <wilgus.william@gmail.com> | 2023-01-02 10:09:46 -0500 |
---|---|---|
committer | William Wilgus <wilgus.william@gmail.com> | 2023-01-02 10:09:46 -0500 |
commit | 6cbf2160e55ac6ec1b8423ce0ca82b6fa432e366 (patch) | |
tree | 9fd8042957e6b2ae37513e0c6c4679510a695e9f | |
parent | 3def8fee8c80a2fd85425d3278ec58de8de698c2 (diff) | |
download | rockbox-6cbf2160e55ac6ec1b8423ce0ca82b6fa432e366.tar.gz rockbox-6cbf2160e55ac6ec1b8423ce0ca82b6fa432e366.zip |
tlsf fix corruption checks
Turns out (~PTR_MASK) != (0xFFFFFFFF - PTR_MASK) in 64 bit land
tmp_b = (bhdr_t*) ( (intptr_t)b->prev_hdr & BLOCK_SIZE );
using ~STATE_MASK or even #define BLOCK_SIZE (~PTR_MASK) resolves the issue
switching BLOCK_SIZE TO ~STATE_MASK appears to fix it
Also define BLOCK_SIZE (~PTR_MASK)
Fix a few signed / unsigned errors
Change-Id: Ica59db0faa2df408831c23312243ae19259dba6b
-rw-r--r-- | lib/tlsf/src/tlsf.c | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/lib/tlsf/src/tlsf.c b/lib/tlsf/src/tlsf.c index 15fa8002d2..7943770975 100644 --- a/lib/tlsf/src/tlsf.c +++ b/lib/tlsf/src/tlsf.c | |||
@@ -163,7 +163,7 @@ void abort(void); | |||
163 | #define TLSF_SIGNATURE (0x2A59FA59) | 163 | #define TLSF_SIGNATURE (0x2A59FA59) |
164 | 164 | ||
165 | #define PTR_MASK (sizeof(void *) - 1) | 165 | #define PTR_MASK (sizeof(void *) - 1) |
166 | #define BLOCK_SIZE (0xFFFFFFFF - PTR_MASK) | 166 | #define BLOCK_SIZE (~PTR_MASK) /* BUGFIX (0xFFFFFFFF - PTR_MASK) */ |
167 | 167 | ||
168 | 168 | ||
169 | /* Dereferencing type-punned pointers will break strict aliasing.*/ | 169 | /* Dereferencing type-punned pointers will break strict aliasing.*/ |
@@ -342,12 +342,12 @@ static __inline__ int ms_bit(int i) | |||
342 | 342 | ||
343 | static __inline__ void set_bit(int nr, u32_t * addr) | 343 | static __inline__ void set_bit(int nr, u32_t * addr) |
344 | { | 344 | { |
345 | addr[nr >> 5] |= 1 << (nr & 0x1f); | 345 | addr[nr >> 5] |= 1u << (nr & 0x1f); |
346 | } | 346 | } |
347 | 347 | ||
348 | static __inline__ void clear_bit(int nr, u32_t * addr) | 348 | static __inline__ void clear_bit(int nr, u32_t * addr) |
349 | { | 349 | { |
350 | addr[nr >> 5] &= ~(1 << (nr & 0x1f)); | 350 | addr[nr >> 5] &= ~(1u << (nr & 0x1f)); |
351 | } | 351 | } |
352 | 352 | ||
353 | static __inline__ void MAPPING_SEARCH(size_t * _r, int *_fl, int *_sl) | 353 | static __inline__ void MAPPING_SEARCH(size_t * _r, int *_fl, int *_sl) |
@@ -871,7 +871,7 @@ void free_ex(void *ptr, void *mem_pool) | |||
871 | } | 871 | } |
872 | if (b->size & PREV_FREE) { | 872 | if (b->size & PREV_FREE) { |
873 | /* Coalesce previous block */ | 873 | /* Coalesce previous block */ |
874 | tmp_b = (bhdr_t*) ( (intptr_t)b->prev_hdr & BLOCK_SIZE ); | 874 | tmp_b = (bhdr_t*) ( (intptr_t)b->prev_hdr & ~STATE_MASK ); |
875 | MAPPING_INSERT(tmp_b->size & BLOCK_SIZE, &fl, &sl); | 875 | MAPPING_INSERT(tmp_b->size & BLOCK_SIZE, &fl, &sl); |
876 | EXTRACT_BLOCK(tmp_b, tlsf, fl, sl); | 876 | EXTRACT_BLOCK(tmp_b, tlsf, fl, sl); |
877 | tmp_b->size += (b->size & BLOCK_SIZE) + BHDR_OVERHEAD; | 877 | tmp_b->size += (b->size & BLOCK_SIZE) + BHDR_OVERHEAD; |