Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

media: vivid: fix smatch warnings

Reorganize code to fix two smatch warnings:

drivers/media/platform/vivid/vivid-core.c: drivers/media/platform/vivid/vivid-core.c:889 vivid_create_instance() warn: potentially one past the end of array
'dev->query_dv_timings_qmenu[dev->query_dv_timings_size]'
drivers/media/platform/vivid/vivid-core.c: drivers/media/platform/vivid/vivid-core.c:889 vivid_create_instance() warn: potentially one past the end of array
'dev->query_dv_timings_qmenu[dev->query_dv_timings_size]'

Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>

authored by

Hans Verkuil and committed by
Mauro Carvalho Chehab
adcfdbde 8b8130f0

+19 -6
+18 -6
drivers/media/platform/vivid/vivid-core.c
··· 625 625 vfree(dev->bitmap_out); 626 626 tpg_free(&dev->tpg); 627 627 kfree(dev->query_dv_timings_qmenu); 628 + kfree(dev->query_dv_timings_qmenu_strings); 628 629 kfree(dev); 629 630 } 630 631 ··· 877 876 if (!dev->edid) 878 877 goto free_dev; 879 878 880 - /* create a string array containing the names of all the preset timings */ 881 879 while (v4l2_dv_timings_presets[dev->query_dv_timings_size].bt.width) 882 880 dev->query_dv_timings_size++; 881 + 882 + /* 883 + * Create a char pointer array that points to the names of all the 884 + * preset timings 885 + */ 883 886 dev->query_dv_timings_qmenu = kmalloc_array(dev->query_dv_timings_size, 884 - (sizeof(void *) + 32), 885 - GFP_KERNEL); 886 - if (dev->query_dv_timings_qmenu == NULL) 887 + sizeof(char *), GFP_KERNEL); 888 + /* 889 + * Create a string array containing the names of all the preset 890 + * timings. Each name is max 31 chars long (+ terminating 0). 891 + */ 892 + dev->query_dv_timings_qmenu_strings = 893 + kmalloc_array(dev->query_dv_timings_size, 32, GFP_KERNEL); 894 + 895 + if (!dev->query_dv_timings_qmenu || 896 + !dev->query_dv_timings_qmenu_strings) 887 897 goto free_dev; 898 + 888 899 for (i = 0; i < dev->query_dv_timings_size; i++) { 889 900 const struct v4l2_bt_timings *bt = &v4l2_dv_timings_presets[i].bt; 890 - char *p = (char *)&dev->query_dv_timings_qmenu[dev->query_dv_timings_size]; 901 + char *p = dev->query_dv_timings_qmenu_strings + i * 32; 891 902 u32 htot, vtot; 892 903 893 - p += i * 32; 894 904 dev->query_dv_timings_qmenu[i] = p; 895 905 896 906 htot = V4L2_DV_BT_FRAME_WIDTH(bt);
+1
drivers/media/platform/vivid/vivid-core.h
··· 305 305 306 306 enum vivid_signal_mode dv_timings_signal_mode; 307 307 char **query_dv_timings_qmenu; 308 + char *query_dv_timings_qmenu_strings; 308 309 unsigned query_dv_timings_size; 309 310 unsigned query_dv_timings_last; 310 311 unsigned query_dv_timings;