summaryrefslogtreecommitdiff
path: root/apps/gui/skin_engine/skin_tokens.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_tokens.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_tokens.c')
-rw-r--r--apps/gui/skin_engine/skin_tokens.c56
1 files changed, 33 insertions, 23 deletions
diff --git a/apps/gui/skin_engine/skin_tokens.c b/apps/gui/skin_engine/skin_tokens.c
index db9a9e694b..b86c664d7e 100644
--- a/apps/gui/skin_engine/skin_tokens.c
+++ b/apps/gui/skin_engine/skin_tokens.c
@@ -163,7 +163,7 @@ const char *get_cuesheetid3_token(struct wps_token *token, struct mp3entry *id3,
163 struct cuesheet *cue = id3?id3->cuesheet:NULL; 163 struct cuesheet *cue = id3?id3->cuesheet:NULL;
164 if (!cue || !cue->curr_track) 164 if (!cue || !cue->curr_track)
165 return NULL; 165 return NULL;
166 166
167 struct cue_track_info *track = cue->curr_track; 167 struct cue_track_info *track = cue->curr_track;
168 if (offset_tracks) 168 if (offset_tracks)
169 { 169 {
@@ -185,7 +185,7 @@ const char *get_cuesheetid3_token(struct wps_token *token, struct mp3entry *id3,
185 case SKIN_TOKEN_METADATA_TRACK_TITLE: 185 case SKIN_TOKEN_METADATA_TRACK_TITLE:
186 return *track->title ? track->title : NULL; 186 return *track->title ? track->title : NULL;
187 case SKIN_TOKEN_METADATA_TRACK_NUMBER: 187 case SKIN_TOKEN_METADATA_TRACK_NUMBER:
188 snprintf(buf, buf_size, "%d/%d", 188 snprintf(buf, buf_size, "%d/%d",
189 cue->curr_track_idx+offset_tracks+1, cue->track_count); 189 cue->curr_track_idx+offset_tracks+1, cue->track_count);
190 return buf; 190 return buf;
191 default: 191 default:
@@ -200,7 +200,7 @@ static const char* get_filename_token(struct wps_token *token, char* filename,
200 if (filename) 200 if (filename)
201 { 201 {
202 switch (token->type) 202 switch (token->type)
203 { 203 {
204 case SKIN_TOKEN_FILE_PATH: 204 case SKIN_TOKEN_FILE_PATH:
205 return filename; 205 return filename;
206 case SKIN_TOKEN_FILE_NAME: 206 case SKIN_TOKEN_FILE_NAME:
@@ -478,7 +478,7 @@ const char *get_radio_token(struct wps_token *token, int preset_offset,
478 { 478 {
479 *intval = val; 479 *intval = val;
480 } 480 }
481 else 481 else
482 { 482 {
483 *intval = 1+(limit-1)*(val-min)/(max-1-min); 483 *intval = 1+(limit-1)*(val-min)/(max-1-min);
484 } 484 }
@@ -514,7 +514,7 @@ const char *get_radio_token(struct wps_token *token, int preset_offset,
514 return buf; 514 return buf;
515 } 515 }
516 case SKIN_TOKEN_PRESET_COUNT: 516 case SKIN_TOKEN_PRESET_COUNT:
517 snprintf(buf, buf_size, "%d", radio_preset_count()); 517 snprintf(buf, buf_size, "%d", radio_preset_count());
518 if (intval) 518 if (intval)
519 *intval = radio_preset_count(); 519 *intval = radio_preset_count();
520 return buf; 520 return buf;
@@ -580,7 +580,7 @@ static const char* NOINLINE get_lif_token_value(struct gui_wps *gwps,
580 int b; 580 int b;
581 bool number_set = true; 581 bool number_set = true;
582 struct wps_token *liftoken = SKINOFFSETTOPTR(get_skin_buffer(gwps->data), lif->token); 582 struct wps_token *liftoken = SKINOFFSETTOPTR(get_skin_buffer(gwps->data), lif->token);
583 const char* out_text = get_token_value(gwps, liftoken, offset, buf, buf_size, &a); 583 const char* out_text = get_token_value(gwps, liftoken, offset, buf, buf_size, &a);
584 if (a == -1 && liftoken->type != SKIN_TOKEN_VOLUME) 584 if (a == -1 && liftoken->type != SKIN_TOKEN_VOLUME)
585 { 585 {
586 a = (out_text && *out_text) ? 1 : 0; 586 a = (out_text && *out_text) ? 1 : 0;
@@ -610,10 +610,13 @@ static const char* NOINLINE get_lif_token_value(struct gui_wps *gwps,
610 char temp_buf[MAX_PATH]; 610 char temp_buf[MAX_PATH];
611 const char *outb; 611 const char *outb;
612 struct skin_element *element = SKINOFFSETTOPTR(get_skin_buffer(gwps->data), lif->operand.data.code); 612 struct skin_element *element = SKINOFFSETTOPTR(get_skin_buffer(gwps->data), lif->operand.data.code);
613 if (!element) return NULL;
613 struct wps_token *token = SKINOFFSETTOPTR(get_skin_buffer(gwps->data), element->data); 614 struct wps_token *token = SKINOFFSETTOPTR(get_skin_buffer(gwps->data), element->data);
614 b = lif->num_options; 615 b = lif->num_options;
616
615 outb = get_token_value(gwps, token, offset, temp_buf, 617 outb = get_token_value(gwps, token, offset, temp_buf,
616 sizeof(temp_buf), &b); 618 sizeof(temp_buf), &b);
619
617 if (b == -1 && liftoken->type != SKIN_TOKEN_VOLUME) 620 if (b == -1 && liftoken->type != SKIN_TOKEN_VOLUME)
618 { 621 {
619 if (!out_text || !outb) 622 if (!out_text || !outb)
@@ -631,7 +634,7 @@ static const char* NOINLINE get_lif_token_value(struct gui_wps *gwps,
631 case DEFAULT: 634 case DEFAULT:
632 break; 635 break;
633 } 636 }
634 637
635 switch (lif->op) 638 switch (lif->op)
636 { 639 {
637 case IF_EQUALS: 640 case IF_EQUALS:
@@ -666,10 +669,12 @@ const char *get_token_value(struct gui_wps *gwps,
666{ 669{
667 if (!gwps) 670 if (!gwps)
668 return NULL; 671 return NULL;
672 if (!token)
673 return NULL;
669 674
670 struct wps_data *data = gwps->data; 675 struct wps_data *data = gwps->data;
671 struct wps_state *state = skin_get_global_state(); 676 struct wps_state *state = skin_get_global_state();
672 struct mp3entry *id3; /* Think very carefully about using this. 677 struct mp3entry *id3; /* Think very carefully about using this.
673 maybe get_id3_token() is the better place? */ 678 maybe get_id3_token() is the better place? */
674 const char *out_text = NULL; 679 const char *out_text = NULL;
675 char *filename = NULL; 680 char *filename = NULL;
@@ -680,7 +685,7 @@ const char *get_token_value(struct gui_wps *gwps,
680 id3 = get_mp3entry_from_offset(token->next? 1: offset, &filename); 685 id3 = get_mp3entry_from_offset(token->next? 1: offset, &filename);
681 if (id3) 686 if (id3)
682 filename = id3->path; 687 filename = id3->path;
683 688
684#if CONFIG_RTC 689#if CONFIG_RTC
685 struct tm* tm = NULL; 690 struct tm* tm = NULL;
686 691
@@ -702,10 +707,10 @@ const char *get_token_value(struct gui_wps *gwps,
702 limit = *intval; 707 limit = *intval;
703 *intval = -1; 708 *intval = -1;
704 } 709 }
705 710
706 if (id3 && id3 == state->id3 && id3->cuesheet ) 711 if (id3 && id3 == state->id3 && id3->cuesheet )
707 { 712 {
708 out_text = get_cuesheetid3_token(token, id3, 713 out_text = get_cuesheetid3_token(token, id3,
709 token->next?1:offset, buf, buf_size); 714 token->next?1:offset, buf, buf_size);
710 if (out_text) 715 if (out_text)
711 return out_text; 716 return out_text;
@@ -734,6 +739,7 @@ const char *get_token_value(struct gui_wps *gwps,
734 char *skinbuffer = get_skin_buffer(data); 739 char *skinbuffer = get_skin_buffer(data);
735 struct skin_element *element = 740 struct skin_element *element =
736 SKINOFFSETTOPTR(skinbuffer, token->value.data); 741 SKINOFFSETTOPTR(skinbuffer, token->value.data);
742 if (!element || !element->params) return NULL;
737 struct skin_tag_parameter* params = 743 struct skin_tag_parameter* params =
738 SKINOFFSETTOPTR(skinbuffer, element->params); 744 SKINOFFSETTOPTR(skinbuffer, element->params);
739 struct skin_tag_parameter* thistag; 745 struct skin_tag_parameter* thistag;
@@ -742,6 +748,7 @@ const char *get_token_value(struct gui_wps *gwps,
742 thistag = &params[i]; 748 thistag = &params[i];
743 struct skin_element *tokenelement = 749 struct skin_element *tokenelement =
744 SKINOFFSETTOPTR(skinbuffer, thistag->data.code); 750 SKINOFFSETTOPTR(skinbuffer, thistag->data.code);
751 if (!tokenelement) return NULL;
745 out_text = get_token_value(gwps, 752 out_text = get_token_value(gwps,
746 SKINOFFSETTOPTR(skinbuffer, tokenelement->data), 753 SKINOFFSETTOPTR(skinbuffer, tokenelement->data),
747 offset, buf, buf_size, intval); 754 offset, buf, buf_size, intval);
@@ -753,10 +760,12 @@ const char *get_token_value(struct gui_wps *gwps,
753 return truecount ? "true" : NULL; 760 return truecount ? "true" : NULL;
754 } 761 }
755 break; 762 break;
763
756 case SKIN_TOKEN_SUBSTRING: 764 case SKIN_TOKEN_SUBSTRING:
757 { 765 {
758 struct substring *ss = SKINOFFSETTOPTR(get_skin_buffer(data), token->value.data); 766 struct substring *ss = SKINOFFSETTOPTR(get_skin_buffer(data), token->value.data);
759 const char *token_val = get_token_value(gwps, 767 if (!ss) return NULL;
768 const char *token_val = get_token_value(gwps,
760 SKINOFFSETTOPTR(get_skin_buffer(data), ss->token), offset, 769 SKINOFFSETTOPTR(get_skin_buffer(data), ss->token), offset,
761 buf, buf_size, intval); 770 buf, buf_size, intval);
762 if (token_val) 771 if (token_val)
@@ -788,13 +797,13 @@ const char *get_token_value(struct gui_wps *gwps,
788 if (ss->expect_number && 797 if (ss->expect_number &&
789 intval && (buf[0] >= '0' && buf[0] <= '9')) 798 intval && (buf[0] >= '0' && buf[0] <= '9'))
790 *intval = atoi(buf) + 1; /* so 0 is the first item */ 799 *intval = atoi(buf) + 1; /* so 0 is the first item */
791 800
792 return buf; 801 return buf;
793 } 802 }
794 return NULL; 803 return NULL;
795 } 804 }
796 break; 805 break;
797 806
798 case SKIN_TOKEN_CHARACTER: 807 case SKIN_TOKEN_CHARACTER:
799 if (token->value.c == '\n') 808 if (token->value.c == '\n')
800 return NULL; 809 return NULL;
@@ -802,7 +811,7 @@ const char *get_token_value(struct gui_wps *gwps,
802 811
803 case SKIN_TOKEN_STRING: 812 case SKIN_TOKEN_STRING:
804 return (char*)SKINOFFSETTOPTR(get_skin_buffer(data), token->value.data); 813 return (char*)SKINOFFSETTOPTR(get_skin_buffer(data), token->value.data);
805 814
806 case SKIN_TOKEN_TRANSLATEDSTRING: 815 case SKIN_TOKEN_TRANSLATEDSTRING:
807 return (char*)P2STR(ID2P(token->value.i)); 816 return (char*)P2STR(ID2P(token->value.i));
808 817
@@ -821,6 +830,7 @@ const char *get_token_value(struct gui_wps *gwps,
821 case SKIN_TOKEN_LIST_ITEM_TEXT: 830 case SKIN_TOKEN_LIST_ITEM_TEXT:
822 { 831 {
823 struct listitem *li = (struct listitem *)SKINOFFSETTOPTR(get_skin_buffer(data), token->value.data); 832 struct listitem *li = (struct listitem *)SKINOFFSETTOPTR(get_skin_buffer(data), token->value.data);
833 if (!li) return NULL;
824 return skinlist_get_item_text(li->offset, li->wrap, buf, buf_size); 834 return skinlist_get_item_text(li->offset, li->wrap, buf, buf_size);
825 } 835 }
826 case SKIN_TOKEN_LIST_ITEM_ROW: 836 case SKIN_TOKEN_LIST_ITEM_ROW:
@@ -843,6 +853,7 @@ const char *get_token_value(struct gui_wps *gwps,
843 case SKIN_TOKEN_LIST_ITEM_ICON: 853 case SKIN_TOKEN_LIST_ITEM_ICON:
844 { 854 {
845 struct listitem *li = (struct listitem *)SKINOFFSETTOPTR(get_skin_buffer(data), token->value.data); 855 struct listitem *li = (struct listitem *)SKINOFFSETTOPTR(get_skin_buffer(data), token->value.data);
856 if (!li) return NULL;
846 int icon = skinlist_get_item_icon(li->offset, li->wrap); 857 int icon = skinlist_get_item_icon(li->offset, li->wrap);
847 if (intval) 858 if (intval)
848 *intval = icon; 859 *intval = icon;
@@ -905,11 +916,12 @@ const char *get_token_value(struct gui_wps *gwps,
905 if (in_radio_screen() || (get_radio_status() != FMRADIO_OFF)) 916 if (in_radio_screen() || (get_radio_status() != FMRADIO_OFF))
906 { 917 {
907 struct skin_albumart *aa = SKINOFFSETTOPTR(get_skin_buffer(data), data->albumart); 918 struct skin_albumart *aa = SKINOFFSETTOPTR(get_skin_buffer(data), data->albumart);
919 if (!aa) return NULL;
908 struct dim dim = {aa->width, aa->height}; 920 struct dim dim = {aa->width, aa->height};
909 handle = radio_get_art_hid(&dim); 921 handle = radio_get_art_hid(&dim);
910 } 922 }
911#endif 923#endif
912 if (handle >= 0) 924 if (handle >= 0)
913 return "C"; 925 return "C";
914 } 926 }
915 return NULL; 927 return NULL;
@@ -1009,7 +1021,7 @@ const char *get_token_value(struct gui_wps *gwps,
1009 int mode = 1; /* stop */ 1021 int mode = 1; /* stop */
1010 if (status == STATUS_PLAY) 1022 if (status == STATUS_PLAY)
1011 mode = 2; /* play */ 1023 mode = 2; /* play */
1012 if (state->is_fading || 1024 if (state->is_fading ||
1013 (status == STATUS_PAUSE && !status_get_ffmode())) 1025 (status == STATUS_PAUSE && !status_get_ffmode()))
1014 mode = 3; /* pause */ 1026 mode = 3; /* pause */
1015 else 1027 else
@@ -1336,13 +1348,13 @@ const char *get_token_value(struct gui_wps *gwps,
1336 token->value.i)) 1348 token->value.i))
1337 return "v"; 1349 return "v";
1338 return NULL; 1350 return NULL;
1339
1340 case SKIN_TOKEN_LASTTOUCH: 1351 case SKIN_TOKEN_LASTTOUCH:
1341 { 1352 {
1342#ifdef HAVE_TOUCHSCREEN 1353#ifdef HAVE_TOUCHSCREEN
1343 unsigned int last_touch = touchscreen_last_touch(); 1354 unsigned int last_touch = touchscreen_last_touch();
1344 char *skin_base = get_skin_buffer(data); 1355 char *skin_base = get_skin_buffer(data);
1345 struct touchregion_lastpress *data = SKINOFFSETTOPTR(skin_base, token->value.data); 1356 struct touchregion_lastpress *data = SKINOFFSETTOPTR(skin_base, token->value.data);
1357 if (!data) return NULL;
1346 struct touchregion *region = SKINOFFSETTOPTR(skin_base, data->region); 1358 struct touchregion *region = SKINOFFSETTOPTR(skin_base, data->region);
1347 if (region) 1359 if (region)
1348 last_touch = region->last_press; 1360 last_touch = region->last_press;
@@ -1669,10 +1681,8 @@ const char *get_token_value(struct gui_wps *gwps,
1669 } 1681 }
1670 return NULL; 1682 return NULL;
1671#endif 1683#endif
1672
1673 default: 1684 default:
1674 return NULL; 1685 return NULL;
1675 } 1686 }
1676}
1677
1678 1687
1688}