diff options
author | Solomon Peachy <pizza@shaftnet.org> | 2020-10-27 11:14:23 -0400 |
---|---|---|
committer | Solomon Peachy <pizza@shaftnet.org> | 2020-10-28 08:42:49 -0400 |
commit | a605cdf7008f856946cbf01193f4dffc3ee63fdb (patch) | |
tree | 53368641340ffd9d10f77f56b2bde66916a1cfd1 /apps/gui/skin_engine/skin_parser.c | |
parent | 621e363e70e69a92169494515c5637551ceba219 (diff) | |
download | rockbox-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.c | 54 |
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; |