/** * Check for under/over flows. * * Should be called with the buffer unmaped. */ static void pb_debug_buffer_check(struct pb_debug_buffer *buf) { uint8_t *map; map = pb_map(buf->buffer, PB_USAGE_CPU_READ | PB_USAGE_UNSYNCHRONIZED, NULL); assert(map); if (map) { boolean underflow, overflow; pb_size min_ofs, max_ofs; underflow = !check_random_pattern(map, buf->underflow_size, &min_ofs, &max_ofs); if(underflow) { debug_printf("buffer underflow (offset -%"PRIu64"%s to -%"PRIu64" bytes) detected\n", buf->underflow_size - min_ofs, min_ofs == 0 ? "+" : "", buf->underflow_size - max_ofs); } overflow = !check_random_pattern(map + buf->underflow_size + buf->base.size, buf->overflow_size, &min_ofs, &max_ofs); if(overflow) { debug_printf("buffer overflow (size %"PRIu64" plus offset %"PRIu64" to %"PRIu64"%s bytes) detected\n", buf->base.size, min_ofs, max_ofs, max_ofs == buf->overflow_size - 1 ? "+" : ""); } if(underflow || overflow) debug_backtrace_dump(buf->create_backtrace, PB_DEBUG_CREATE_BACKTRACE); debug_assert(!underflow); debug_assert(!overflow); /* re-fill if not aborted */ if(underflow) fill_random_pattern(map, buf->underflow_size); if(overflow) fill_random_pattern(map + buf->underflow_size + buf->base.size, buf->overflow_size); pb_unmap(buf->buffer); } }
/** * Check for under/over flows. * * Should be called with the buffer unmaped. */ static void pb_debug_buffer_check(struct pb_debug_buffer *buf) { uint8_t *map; map = pb_map(buf->buffer, PIPE_BUFFER_USAGE_CPU_READ); assert(map); if(map) { boolean underflow, overflow; size_t min_ofs, max_ofs; underflow = !check_random_pattern(map, buf->underflow_size, &min_ofs, &max_ofs); if(underflow) { debug_printf("buffer underflow (offset -%u%s to -%u bytes) detected\n", buf->underflow_size - min_ofs, min_ofs == 0 ? "+" : "", buf->underflow_size - max_ofs); } overflow = !check_random_pattern(map + buf->underflow_size + buf->base.base.size, buf->overflow_size, &min_ofs, &max_ofs); if(overflow) { debug_printf("buffer overflow (size %u plus offset %u to %u%s bytes) detected\n", buf->base.base.size, min_ofs, max_ofs, max_ofs == buf->overflow_size - 1 ? "+" : ""); } debug_assert(!underflow && !overflow); /* re-fill if not aborted */ if(underflow) fill_random_pattern(map, buf->underflow_size); if(overflow) fill_random_pattern(map + buf->underflow_size + buf->base.base.size, buf->overflow_size); pb_unmap(buf->buffer); } }