summaryrefslogtreecommitdiff
path: root/apps/gui/skin_engine/skin_parser.c
diff options
context:
space:
mode:
authorSolomon Peachy <pizza@shaftnet.org>2020-10-27 11:14:23 -0400
committerSolomon Peachy <pizza@shaftnet.org>2020-10-28 08:42:49 -0400
commita605cdf7008f856946cbf01193f4dffc3ee63fdb (patch)
tree53368641340ffd9d10f77f56b2bde66916a1cfd1 /apps/gui/skin_engine/skin_parser.c
parent621e363e70e69a92169494515c5637551ceba219 (diff)
downloadrockbox-a605cdf7008f856946cbf01193f4dffc3ee63fdb.tar.gz
rockbox-a605cdf7008f856946cbf01193f4dffc3ee63fdb.zip
Fix multiple potential null pointer dereferencess
GCC's optimizer thinks all of these _will_ fail at some point Change-Id: I287eeb574162a5d3b3347654d25aa1f53e9f5563
Diffstat (limited to 'apps/gui/skin_engine/skin_parser.c')
-rw-r--r--apps/gui/skin_engine/skin_parser.c54
1 files changed, 37 insertions, 17 deletions
diff --git a/apps/gui/skin_engine/skin_parser.c b/apps/gui/skin_engine/skin_parser.c
index e1a8118190..b64bfc143c 100644
--- a/apps/gui/skin_engine/skin_parser.c
+++ b/apps/gui/skin_engine/skin_parser.c
@@ -183,13 +183,16 @@ void *skin_find_item(const char *label, enum skin_find_what what,
183 { 183 {
184 bool skip = false; 184 bool skip = false;
185 struct wps_token *token = NULL; 185 struct wps_token *token = NULL;
186 itemlabel = NULL;
186 if (!isvplist) 187 if (!isvplist)
187 token = SKINOFFSETTOPTR(databuf, list.linkedlist->token); 188 token = SKINOFFSETTOPTR(databuf, list.linkedlist->token);
188 switch (what) 189 if (token)
190 switch (what)
189 { 191 {
190 case SKIN_FIND_UIVP: 192 case SKIN_FIND_UIVP:
191 case SKIN_FIND_VP: 193 case SKIN_FIND_VP:
192 ret = SKINOFFSETTOPTR(databuf, list.vplist->data); 194 ret = SKINOFFSETTOPTR(databuf, list.vplist->data);
195 if (!ret) break;
193 if (((struct skin_viewport *)ret)->label == VP_DEFAULT_LABEL) 196 if (((struct skin_viewport *)ret)->label == VP_DEFAULT_LABEL)
194 itemlabel = VP_DEFAULT_LABEL_STRING; 197 itemlabel = VP_DEFAULT_LABEL_STRING;
195 else 198 else
@@ -199,10 +202,12 @@ void *skin_find_item(const char *label, enum skin_find_what what,
199 break; 202 break;
200 case SKIN_FIND_IMAGE: 203 case SKIN_FIND_IMAGE:
201 ret = SKINOFFSETTOPTR(databuf, token->value.data); 204 ret = SKINOFFSETTOPTR(databuf, token->value.data);
205 if (!ret) break;
202 itemlabel = SKINOFFSETTOPTR(databuf, ((struct gui_img *)ret)->label); 206 itemlabel = SKINOFFSETTOPTR(databuf, ((struct gui_img *)ret)->label);
203 break; 207 break;
204#ifdef HAVE_TOUCHSCREEN 208#ifdef HAVE_TOUCHSCREEN
205 case SKIN_FIND_TOUCHREGION: 209 case SKIN_FIND_TOUCHREGION:
210 if (!ret) break;
206 ret = SKINOFFSETTOPTR(databuf, token->value.data); 211 ret = SKINOFFSETTOPTR(databuf, token->value.data);
207 itemlabel = SKINOFFSETTOPTR(databuf, ((struct touchregion *)ret)->label); 212 itemlabel = SKINOFFSETTOPTR(databuf, ((struct touchregion *)ret)->label);
208 break; 213 break;
@@ -210,6 +215,7 @@ void *skin_find_item(const char *label, enum skin_find_what what,
210#ifdef HAVE_SKIN_VARIABLES 215#ifdef HAVE_SKIN_VARIABLES
211 case SKIN_VARIABLE: 216 case SKIN_VARIABLE:
212 ret = SKINOFFSETTOPTR(databuf, token->value.data); 217 ret = SKINOFFSETTOPTR(databuf, token->value.data);
218 if (!ret) break;
213 itemlabel = SKINOFFSETTOPTR(databuf, ((struct skin_var *)ret)->label); 219 itemlabel = SKINOFFSETTOPTR(databuf, ((struct skin_var *)ret)->label);
214 break; 220 break;
215#endif 221#endif
@@ -1708,23 +1714,30 @@ void skin_data_free_buflib_allocs(struct wps_data *wps_data)
1708{ 1714{
1709 if (wps_data->wps_loaded) 1715 if (wps_data->wps_loaded)
1710 skin_buffer = get_skin_buffer(wps_data); 1716 skin_buffer = get_skin_buffer(wps_data);
1717 if (!skin_buffer)
1718 return;
1719
1711#ifndef __PCTOOL__ 1720#ifndef __PCTOOL__
1712 struct skin_token_list *list = SKINOFFSETTOPTR(skin_buffer, wps_data->images); 1721 struct skin_token_list *list = SKINOFFSETTOPTR(skin_buffer, wps_data->images);
1713 int *font_ids = SKINOFFSETTOPTR(skin_buffer, wps_data->font_ids); 1722 int *font_ids = SKINOFFSETTOPTR(skin_buffer, wps_data->font_ids);
1714 while (list) 1723 while (list)
1715 { 1724 {
1716 struct wps_token *token = SKINOFFSETTOPTR(skin_buffer, list->token); 1725 struct wps_token *token = SKINOFFSETTOPTR(skin_buffer, list->token);
1717 struct gui_img *img = (struct gui_img*)SKINOFFSETTOPTR(skin_buffer, token->value.data); 1726 struct gui_img *img = NULL;
1718 if (img->buflib_handle > 0) 1727 if (token)
1728 img = (struct gui_img*)SKINOFFSETTOPTR(skin_buffer, token->value.data);
1729 if (img && img->buflib_handle > 0)
1719 { 1730 {
1720 struct skin_token_list *imglist = SKINOFFSETTOPTR(skin_buffer, list->next); 1731 struct skin_token_list *imglist = SKINOFFSETTOPTR(skin_buffer, list->next);
1721 core_free(img->buflib_handle);
1722 1732
1733 core_free(img->buflib_handle);
1723 while (imglist) 1734 while (imglist)
1724 { 1735 {
1725 struct wps_token *freetoken = SKINOFFSETTOPTR(skin_buffer, imglist->token); 1736 struct wps_token *freetoken = SKINOFFSETTOPTR(skin_buffer, imglist->token);
1726 struct gui_img *freeimg = (struct gui_img*)SKINOFFSETTOPTR(skin_buffer, freetoken->value.data); 1737 struct gui_img *freeimg = NULL;
1727 if (img->buflib_handle == freeimg->buflib_handle) 1738 if (freetoken)
1739 freeimg = (struct gui_img*)SKINOFFSETTOPTR(skin_buffer, freetoken->value.data);
1740 if (freeimg && img->buflib_handle == freeimg->buflib_handle)
1728 freeimg->buflib_handle = -1; 1741 freeimg->buflib_handle = -1;
1729 imglist = SKINOFFSETTOPTR(skin_buffer, imglist->next); 1742 imglist = SKINOFFSETTOPTR(skin_buffer, imglist->next);
1730 } 1743 }
@@ -1885,8 +1898,10 @@ static bool load_skin_bitmaps(struct wps_data *wps_data, char *bmpdir)
1885 while (list) 1898 while (list)
1886 { 1899 {
1887 struct wps_token *token = SKINOFFSETTOPTR(skin_buffer, list->token); 1900 struct wps_token *token = SKINOFFSETTOPTR(skin_buffer, list->token);
1901 if (!token) goto skip;
1888 struct gui_img *img = (struct gui_img*)SKINOFFSETTOPTR(skin_buffer, token->value.data); 1902 struct gui_img *img = (struct gui_img*)SKINOFFSETTOPTR(skin_buffer, token->value.data);
1889 if (!img->loaded) 1903
1904 if (img && !img->loaded)
1890 { 1905 {
1891 if (img->using_preloaded_icons) 1906 if (img->using_preloaded_icons)
1892 { 1907 {
@@ -1901,20 +1916,22 @@ static bool load_skin_bitmaps(struct wps_data *wps_data, char *bmpdir)
1901 handle = load_skin_bmp(wps_data, &img->bm, bmpdir); 1916 handle = load_skin_bmp(wps_data, &img->bm, bmpdir);
1902 img->buflib_handle = handle; 1917 img->buflib_handle = handle;
1903 img->loaded = img->buflib_handle >= 0; 1918 img->loaded = img->buflib_handle >= 0;
1919
1904 if (img->loaded) 1920 if (img->loaded)
1905 { 1921 {
1906 struct skin_token_list *imglist = SKINOFFSETTOPTR(skin_buffer, list->next); 1922 struct skin_token_list *imglist = SKINOFFSETTOPTR(skin_buffer, list->next);
1907
1908 img->subimage_height = img->bm.height / img->num_subimages; 1923 img->subimage_height = img->bm.height / img->num_subimages;
1909 while (imglist) 1924 while (imglist)
1910 { 1925 {
1911 token = SKINOFFSETTOPTR(skin_buffer, imglist->token); 1926 token = SKINOFFSETTOPTR(skin_buffer, imglist->token);
1912 img = (struct gui_img*)SKINOFFSETTOPTR(skin_buffer, token->value.data); 1927 if (token) {
1913 if (!strcmp(path, img->bm.data)) 1928 img = (struct gui_img*)SKINOFFSETTOPTR(skin_buffer, token->value.data);
1914 { 1929 if (img && !strcmp(path, img->bm.data))
1915 img->loaded = true; 1930 {
1916 img->buflib_handle = handle; 1931 img->loaded = true;
1917 img->subimage_height = img->bm.height / img->num_subimages; 1932 img->buflib_handle = handle;
1933 img->subimage_height = img->bm.height / img->num_subimages;
1934 }
1918 } 1935 }
1919 imglist = SKINOFFSETTOPTR(skin_buffer, imglist->next); 1936 imglist = SKINOFFSETTOPTR(skin_buffer, imglist->next);
1920 } 1937 }
@@ -1923,6 +1940,7 @@ static bool load_skin_bitmaps(struct wps_data *wps_data, char *bmpdir)
1923 retval = false; 1940 retval = false;
1924 } 1941 }
1925 } 1942 }
1943 skip:
1926 list = SKINOFFSETTOPTR(skin_buffer, list->next); 1944 list = SKINOFFSETTOPTR(skin_buffer, list->next);
1927 } 1945 }
1928 1946
@@ -1947,6 +1965,7 @@ static bool skin_load_fonts(struct wps_data *data)
1947 /* first, find the viewports that have a non-sys/ui-font font */ 1965 /* first, find the viewports that have a non-sys/ui-font font */
1948 struct skin_viewport *skin_vp = 1966 struct skin_viewport *skin_vp =
1949 SKINOFFSETTOPTR(skin_buffer, vp_list->data); 1967 SKINOFFSETTOPTR(skin_buffer, vp_list->data);
1968 if (!skin_vp) continue;
1950 struct viewport *vp = &skin_vp->vp; 1969 struct viewport *vp = &skin_vp->vp;
1951 1970
1952 font_id = skin_vp->parsed_fontid; 1971 font_id = skin_vp->parsed_fontid;
@@ -2507,9 +2526,10 @@ bool skin_data_load(enum screen_type screen, struct wps_data *wps_data,
2507 while (regions) 2526 while (regions)
2508 { 2527 {
2509 struct wps_token *token = SKINOFFSETTOPTR(skin_buffer, regions->token); 2528 struct wps_token *token = SKINOFFSETTOPTR(skin_buffer, regions->token);
2510 struct touchregion *r = SKINOFFSETTOPTR(skin_buffer, token->value.data); 2529 struct touchregion *r = NULL;
2511 2530 if (token)
2512 if (r->action != ACTION_TOUCH_SCROLLBAR && 2531 r = SKINOFFSETTOPTR(skin_buffer, token->value.data);
2532 if (r && r->action != ACTION_TOUCH_SCROLLBAR &&
2513 r->action != ACTION_TOUCH_VOLUME) 2533 r->action != ACTION_TOUCH_VOLUME)
2514 { 2534 {
2515 user_touch_region_found = true; 2535 user_touch_region_found = true;