SDL_mixer: ogg, opus: make sure that ov_comment() or op_tags() returned non-NULL.

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);