From a5f8d4386c3d7b59bab15499d5d70f8d2713626f Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Fri, 31 Oct 2008 16:47:21 +0100 Subject: update: check return values Nearly all mapper functions can fail and will then return NULL. Add checks to all callers. --- src/decoder_thread.c | 20 ++++++++++++-------- src/playlist_save.c | 3 ++- src/song.c | 13 ++++++++----- src/update.c | 8 ++++++-- 4 files changed, 28 insertions(+), 16 deletions(-) diff --git a/src/decoder_thread.c b/src/decoder_thread.c index 0e9633292..14a1f858f 100644 --- a/src/decoder_thread.c +++ b/src/decoder_thread.c @@ -31,20 +31,25 @@ static void decodeStart(void) { struct song *song = dc.next_song; + char buffer[MPD_PATH_MAX]; + const char *uri; struct decoder decoder; int ret; bool close_instream = true; struct input_stream inStream; struct decoder_plugin *plugin = NULL; - char path_max_fs[MPD_PATH_MAX]; if (song_is_file(song)) - map_song_fs(song, path_max_fs); + uri = map_song_fs(song, buffer); else - song_get_url(song, path_max_fs); + uri = song_get_url(song, buffer); + if (uri == NULL) { + dc.error = DECODE_ERROR_FILE; + return; + } dc.current_song = dc.next_song; /* NEED LOCK */ - if (!input_stream_open(&inStream, path_max_fs)) { + if (!input_stream_open(&inStream, uri)) { dc.error = DECODE_ERROR_FILE; return; } @@ -98,7 +103,7 @@ static void decodeStart(void) /* if that fails, try suffix matching the URL: */ if (plugin == NULL) { - const char *s = getSuffix(path_max_fs); + const char *s = getSuffix(uri); next = 0; while ((plugin = decoder_plugin_from_suffix(s, next++))) { if (plugin->stream_decode == NULL) @@ -129,7 +134,7 @@ static void decodeStart(void) } } else { unsigned int next = 0; - const char *s = getSuffix(path_max_fs); + const char *s = getSuffix(uri); while ((plugin = decoder_plugin_from_suffix(s, next++))) { if (!plugin->stream_types & INPUT_PLUGIN_STREAM_FILE) continue; @@ -142,8 +147,7 @@ static void decodeStart(void) input_stream_close(&inStream); close_instream = false; decoder.plugin = plugin; - ret = plugin->file_decode(&decoder, - path_max_fs); + ret = plugin->file_decode(&decoder, uri); break; } else if (plugin->stream_decode != NULL) { decoder.plugin = plugin; diff --git a/src/playlist_save.c b/src/playlist_save.c index 9c72e0aef..4ae965154 100644 --- a/src/playlist_save.c +++ b/src/playlist_save.c @@ -52,5 +52,6 @@ playlist_print_uri(FILE *file, const char *uri) else s = utf8_to_fs_charset(tmp, uri); - fprintf(file, "%s\n", s); + if (s != NULL) + fprintf(file, "%s\n", s); } diff --git a/src/song.c b/src/song.c index d99b3a29f..4ab0afadf 100644 --- a/src/song.c +++ b/src/song.c @@ -94,28 +94,31 @@ song_free(struct song *song) bool song_file_update(struct song *song) { + char buffer[MPD_PATH_MAX]; + const char *path_fs; struct decoder_plugin *plugin; unsigned int next = 0; - char abs_path[MPD_PATH_MAX]; struct stat st; assert(song_is_file(song)); - map_song_fs(song, abs_path); + path_fs = map_song_fs(song, buffer); + if (path_fs == NULL) + return false; if (song->tag != NULL) { tag_free(song->tag); song->tag = NULL; } - if (stat(abs_path, &st) < 0 || !S_ISREG(st.st_mode)) + if (stat(path_fs, &st) < 0 || !S_ISREG(st.st_mode)) return false; song->mtime = st.st_mtime; while (song->tag == NULL && - (plugin = hasMusicSuffix(abs_path, next++))) - song->tag = plugin->tag_dup(abs_path); + (plugin = hasMusicSuffix(path_fs, next++))) + song->tag = plugin->tag_dup(path_fs); return song->tag != NULL; } diff --git a/src/update.c b/src/update.c index 5ab75d7ac..38bc22a28 100644 --- a/src/update.c +++ b/src/update.c @@ -206,9 +206,13 @@ static int stat_directory_child(const struct directory *parent, const char *name, struct stat *st) { - char path_fs[MPD_PATH_MAX]; + char buffer[MPD_PATH_MAX]; + const char *path_fs; + + path_fs = map_directory_child_fs(parent, name, buffer); + if (path_fs == NULL) + return -1; - map_directory_child_fs(parent, name, path_fs); return stat(path_fs, st); } -- cgit v1.2.3