buflib: Add crc field protecting buflib cookie integrity

This should catch the case of buffer misuse which results
in corrupted cookie of next allocation. The check is performed
on move_block() so it may be a bit late.

There is buflib_check_valid() provided which checks the
integrity of all cookies for given context.
On DEBUG build with --sdl-thread this check is carried out
for core_ctx on every context switch to catch problems earlier.

Change-Id: I999d4576084592394e3dbd3bdf0f32935ff5f601
Reviewed-on: http://gerrit.rockbox.org/711
Reviewed-by: Thomas Martitz <kugel@rockbox.org>
This commit is contained in:
Marcin Bukat 2014-01-09 21:37:07 +01:00
parent 7f5dce4116
commit 7ab237b025
9 changed files with 95 additions and 13 deletions

View file

@ -40,6 +40,7 @@ union buflib_data
struct buflib_callbacks* ops;
char* alloc;
union buflib_data *handle;
uint32_t crc;
};
struct buflib_context
@ -346,4 +347,9 @@ int buflib_get_num_blocks(struct buflib_context *ctx);
*/
void buflib_print_block_at(struct buflib_context *ctx, int block_num,
char* buf, size_t bufsize);
/**
* Check integrity of given buflib context
*/
void buflib_check_valid(struct buflib_context *ctx);
#endif

View file

@ -17,6 +17,9 @@ bool core_shrink(int handle, void* new_start, size_t new_size);
int core_free(int handle);
size_t core_available(void);
size_t core_allocatable(void);
#ifdef DEBUG
void core_check_valid(void);
#endif
/* DO NOT ADD wrappers for buflib_buffer_out/in. They do not call
* the move callbacks and are therefore unsafe in the core */

View file

@ -18,10 +18,12 @@
* KIND, either express or implied.
*
****************************************************************************/
#include <stdint.h>
#ifndef _CRC32_H
#define _CRC32_H
unsigned crc_32(const void *src, unsigned len, unsigned crc32);
uint32_t crc_32(const void *src, uint32_t len, uint32_t crc32);
#endif