From 90ba8e253672155e44dbe2c133badb4f19aa11d1 Mon Sep 17 00:00:00 2001
From: Ozkan Sezer <[EMAIL REDACTED]>
Date: Sun, 28 Mar 2021 17:55:02 +0300
Subject: [PATCH] ogg, opus: make sure that ov_comment() or op_tags() returned
non-NULL.
---
src/codecs/music_ogg.c | 88 +++++++++++++++++++++--------------------
src/codecs/music_opus.c | 88 +++++++++++++++++++++--------------------
2 files changed, 90 insertions(+), 86 deletions(-)
diff --git a/src/codecs/music_ogg.c b/src/codecs/music_ogg.c
index 99beb77..820f2b7 100644
--- a/src/codecs/music_ogg.c
+++ b/src/codecs/music_ogg.c
@@ -266,55 +266,57 @@ static void *OGG_CreateFromRW(SDL_RWops *src, int freesrc)
return NULL;
}
- vc = vorbis.ov_comment(&music->vf, -1);
rate = music->vi.rate;
- for (i = 0; i < vc->comments; i++) {
- char *param = SDL_strdup(vc->user_comments[i]);
- char *argument = param;
- char *value = SDL_strchr(param, '=');
- if (value == NULL) {
- value = param + SDL_strlen(param);
- } else {
- *(value++) = '\0';
- }
+ vc = vorbis.ov_comment(&music->vf, -1);
+ if (vc != NULL) {
+ for (i = 0; i < vc->comments; i++) {
+ char *param = SDL_strdup(vc->user_comments[i]);
+ char *argument = param;
+ char *value = SDL_strchr(param, '=');
+ if (value == NULL) {
+ value = param + SDL_strlen(param);
+ } else {
+ *(value++) = '\0';
+ }
- /* Want to match LOOP-START, LOOP_START, etc. Remove - or _ from
- * string if it is present at position 4. */
- if (_Mix_IsLoopTag(argument) && ((argument[4] == '_') || (argument[4] == '-'))) {
- SDL_memmove(argument + 4, argument + 5, SDL_strlen(argument) - 4);
- }
+ /* Want to match LOOP-START, LOOP_START, etc. Remove - or _ from
+ * string if it is present at position 4. */
+ if (_Mix_IsLoopTag(argument) && ((argument[4] == '_') || (argument[4] == '-'))) {
+ SDL_memmove(argument + 4, argument + 5, SDL_strlen(argument) - 4);
+ }
- if (SDL_strcasecmp(argument, "LOOPSTART") == 0)
- music->loop_start = _Mix_ParseTime(value, rate);
- else if (SDL_strcasecmp(argument, "LOOPLENGTH") == 0) {
- music->loop_len = SDL_strtoll(value, NULL, 10);
- is_loop_length = SDL_TRUE;
- } else if (SDL_strcasecmp(argument, "LOOPEND") == 0) {
- music->loop_end = _Mix_ParseTime(value, rate);
- is_loop_length = SDL_FALSE;
- } else if (SDL_strcasecmp(argument, "TITLE") == 0) {
- meta_tags_set(&music->tags, MIX_META_TITLE, value);
- } else if (SDL_strcasecmp(argument, "ARTIST") == 0) {
- meta_tags_set(&music->tags, MIX_META_ARTIST, value);
- } else if (SDL_strcasecmp(argument, "ALBUM") == 0) {
- meta_tags_set(&music->tags, MIX_META_ALBUM, value);
- } else if (SDL_strcasecmp(argument, "COPYRIGHT") == 0) {
- meta_tags_set(&music->tags, MIX_META_COPYRIGHT, value);
+ if (SDL_strcasecmp(argument, "LOOPSTART") == 0)
+ music->loop_start = _Mix_ParseTime(value, rate);
+ else if (SDL_strcasecmp(argument, "LOOPLENGTH") == 0) {
+ music->loop_len = SDL_strtoll(value, NULL, 10);
+ is_loop_length = SDL_TRUE;
+ } else if (SDL_strcasecmp(argument, "LOOPEND") == 0) {
+ music->loop_end = _Mix_ParseTime(value, rate);
+ is_loop_length = SDL_FALSE;
+ } else if (SDL_strcasecmp(argument, "TITLE") == 0) {
+ meta_tags_set(&music->tags, MIX_META_TITLE, value);
+ } else if (SDL_strcasecmp(argument, "ARTIST") == 0) {
+ meta_tags_set(&music->tags, MIX_META_ARTIST, value);
+ } else if (SDL_strcasecmp(argument, "ALBUM") == 0) {
+ meta_tags_set(&music->tags, MIX_META_ALBUM, value);
+ } else if (SDL_strcasecmp(argument, "COPYRIGHT") == 0) {
+ meta_tags_set(&music->tags, MIX_META_COPYRIGHT, value);
+ }
+ SDL_free(param);
}
- SDL_free(param);
- }
- if (is_loop_length) {
- music->loop_end = music->loop_start + music->loop_len;
- } else {
- music->loop_len = music->loop_end - music->loop_start;
- }
+ if (is_loop_length) {
+ music->loop_end = music->loop_start + music->loop_len;
+ } else {
+ music->loop_len = music->loop_end - music->loop_start;
+ }
- /* Ignore invalid loop tag */
- if (music->loop_start < 0 || music->loop_len < 0 || music->loop_end < 0) {
- music->loop_start = 0;
- music->loop_len = 0;
- music->loop_end = 0;
+ /* Ignore invalid loop tag */
+ if (music->loop_start < 0 || music->loop_len < 0 || music->loop_end < 0) {
+ music->loop_start = 0;
+ music->loop_len = 0;
+ music->loop_end = 0;
+ }
}
full_length = vorbis.ov_pcm_total(&music->vf, -1);
diff --git a/src/codecs/music_opus.c b/src/codecs/music_opus.c
index e792f3c..beac121 100644
--- a/src/codecs/music_opus.c
+++ b/src/codecs/music_opus.c
@@ -214,7 +214,7 @@ static void *OPUS_CreateFromRW(SDL_RWops *src, int freesrc)
{
OPUS_music *music;
OpusFileCallbacks callbacks;
- const OpusTags* tags = NULL;
+ const OpusTags* tags;
int err = 0, ci;
SDL_bool is_loop_length = SDL_FALSE;
ogg_int64_t full_length;
@@ -253,53 +253,55 @@ static void *OPUS_CreateFromRW(SDL_RWops *src, int freesrc)
}
tags = opus.op_tags(music->of, -1);
- for (ci=0; ci < tags->comments; ci++) {
- char *param = SDL_strdup(tags->user_comments[ci]);
- char *argument = param;
- char *value = SDL_strchr(param, '=');
- if (value == NULL) {
- value = param + SDL_strlen(param);
- } else {
- *(value++) = '\0';
- }
+ if (tags != NULL) {
+ for (ci = 0; ci < tags->comments; ci++) {
+ char *param = SDL_strdup(tags->user_comments[ci]);
+ char *argument = param;
+ char *value = SDL_strchr(param, '=');
+ if (value == NULL) {
+ value = param + SDL_strlen(param);
+ } else {
+ *(value++) = '\0';
+ }
- /* Want to match LOOP-START, LOOP_START, etc. Remove - or _ from
- * string if it is present at position 4. */
- if (_Mix_IsLoopTag(argument) && ((argument[4] == '_') || (argument[4] == '-'))) {
- SDL_memmove(argument + 4, argument + 5, SDL_strlen(argument) - 4);
- }
+ /* Want to match LOOP-START, LOOP_START, etc. Remove - or _ from
+ * string if it is present at position 4. */
+ if (_Mix_IsLoopTag(argument) && ((argument[4] == '_') || (argument[4] == '-'))) {
+ SDL_memmove(argument + 4, argument + 5, SDL_strlen(argument) - 4);
+ }
- if (SDL_strcasecmp(argument, "LOOPSTART") == 0)
- music->loop_start = _Mix_ParseTime(value, 48000);
- else if (SDL_strcasecmp(argument, "LOOPLENGTH") == 0) {
- music->loop_len = SDL_strtoll(value, NULL, 10);
- is_loop_length = SDL_TRUE;
- } else if (SDL_strcasecmp(argument, "LOOPEND") == 0) {
- music->loop_end = _Mix_ParseTime(value, 48000);
- is_loop_length = SDL_FALSE;
- } else if (SDL_strcasecmp(argument, "TITLE") == 0) {
- meta_tags_set(&music->tags, MIX_META_TITLE, value);
- } else if (SDL_strcasecmp(argument, "ARTIST") == 0) {
- meta_tags_set(&music->tags, MIX_META_ARTIST, value);
- } else if (SDL_strcasecmp(argument, "ALBUM") == 0) {
- meta_tags_set(&music->tags, MIX_META_ALBUM, value);
- } else if (SDL_strcasecmp(argument, "COPYRIGHT") == 0) {
- meta_tags_set(&music->tags, MIX_META_COPYRIGHT, value);
+ if (SDL_strcasecmp(argument, "LOOPSTART") == 0)
+ music->loop_start = _Mix_ParseTime(value, 48000);
+ else if (SDL_strcasecmp(argument, "LOOPLENGTH") == 0) {
+ music->loop_len = SDL_strtoll(value, NULL, 10);
+ is_loop_length = SDL_TRUE;
+ } else if (SDL_strcasecmp(argument, "LOOPEND") == 0) {
+ music->loop_end = _Mix_ParseTime(value, 48000);
+ is_loop_length = SDL_FALSE;
+ } else if (SDL_strcasecmp(argument, "TITLE") == 0) {
+ meta_tags_set(&music->tags, MIX_META_TITLE, value);
+ } else if (SDL_strcasecmp(argument, "ARTIST") == 0) {
+ meta_tags_set(&music->tags, MIX_META_ARTIST, value);
+ } else if (SDL_strcasecmp(argument, "ALBUM") == 0) {
+ meta_tags_set(&music->tags, MIX_META_ALBUM, value);
+ } else if (SDL_strcasecmp(argument, "COPYRIGHT") == 0) {
+ meta_tags_set(&music->tags, MIX_META_COPYRIGHT, value);
+ }
+ SDL_free(param);
}
- SDL_free(param);
- }
- if (is_loop_length) {
- music->loop_end = music->loop_start + music->loop_len;
- } else {
- music->loop_len = music->loop_end - music->loop_start;
- }
+ if (is_loop_length) {
+ music->loop_end = music->loop_start + music->loop_len;
+ } else {
+ music->loop_len = music->loop_end - music->loop_start;
+ }
- /* Ignore invalid loop tag */
- if (music->loop_start < 0 || music->loop_len < 0 || music->loop_end < 0) {
- music->loop_start = 0;
- music->loop_len = 0;
- music->loop_end = 0;
+ /* Ignore invalid loop tag */
+ if (music->loop_start < 0 || music->loop_len < 0 || music->loop_end < 0) {
+ music->loop_start = 0;
+ music->loop_len = 0;
+ music->loop_end = 0;
+ }
}
full_length = opus.op_pcm_total(music->of, -1);