chore(draw_buf): add invalid cf and stride check (#5177)

Signed-off-by: Xu Xingliang <xuxingliang@xiaomi.com>
This commit is contained in:
Neo Xu
2024-01-05 05:32:27 +08:00
committed by GitHub
parent d89d05f77f
commit 3e5856c058
2 changed files with 15 additions and 5 deletions

View File

@@ -147,6 +147,8 @@ lv_draw_buf_t * lv_draw_buf_create(uint32_t w, uint32_t h, lv_color_format_t cf,
void * buf = lv_draw_buf_malloc(size, cf);
LV_ASSERT_MALLOC(buf);
if(buf == NULL) {
LV_LOG_WARN("No memory: %"LV_PRIu32"x%"LV_PRIu32", cf: %d, stride: %"LV_PRIu32", %"LV_PRIu32"Byte, ",
w, h, cf, stride, size);
lv_free(draw_buf);
return NULL;
}
@@ -156,6 +158,7 @@ lv_draw_buf_t * lv_draw_buf_create(uint32_t w, uint32_t h, lv_color_format_t cf,
draw_buf->header.cf = cf;
draw_buf->header.flags = LV_IMAGE_FLAGS_MODIFIABLE | LV_IMAGE_FLAGS_ALLOCATED;
draw_buf->header.stride = stride;
draw_buf->header.magic = LV_IMAGE_HEADER_MAGIC;
draw_buf->data = lv_draw_buf_align(buf, cf);
draw_buf->unaligned_data = buf;
draw_buf->data_size = size;
@@ -184,6 +187,8 @@ lv_draw_buf_t * lv_draw_buf_reshape(lv_draw_buf_t * draw_buf, lv_color_format_t
{
if(draw_buf == NULL) return NULL;
/*If color format is unknown, keep using the original color format.*/
if(cf == LV_COLOR_FORMAT_UNKNOWN) cf = draw_buf->header.cf;
if(stride == 0) stride = lv_draw_buf_width_to_stride(w, cf);
uint32_t size = _calculate_draw_buf_size(w, h, cf, stride);
@@ -236,18 +241,23 @@ lv_draw_buf_t * lv_draw_buf_adjust_stride(const lv_draw_buf_t * src, uint32_t st
if(src == NULL) return NULL;
if(src->data == NULL) return NULL;
const lv_image_header_t * header = &src->header;
/*Use global stride*/
if(stride == 0) stride = lv_draw_buf_width_to_stride(header->w, header->cf);
/*Check if stride already match*/
if(src->header.stride == stride) return NULL;
if(header->stride == stride) return NULL;
/*Calculate the minimal stride allowed from bpp*/
uint32_t bpp = lv_color_format_get_bpp(src->header.cf);
uint32_t min_stride = (src->header.w * bpp + 7) >> 3;
uint32_t bpp = lv_color_format_get_bpp(header->cf);
uint32_t min_stride = (header->w * bpp + 7) >> 3;
if(stride < min_stride) {
LV_LOG_WARN("New stride is too small. min: %" LV_PRId32, min_stride);
return NULL;
}
lv_draw_buf_t * dst = lv_draw_buf_create(src->header.w, src->header.h, src->header.cf, stride);
lv_draw_buf_t * dst = lv_draw_buf_create(header->w, header->h, header->cf, stride);
if(dst == NULL) return NULL;
uint8_t * dst_data = dst->data;