aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2008-10-31 16:47:21 +0100
committerMax Kellermann <max@duempel.org>2008-10-31 16:47:21 +0100
commita5f8d4386c3d7b59bab15499d5d70f8d2713626f (patch)
tree148790958d648b34564a6c4216f3db42614c7d9d
parentd8e877e3355d0858c78a6d9a7060a6683024dd30 (diff)
downloadmpd-a5f8d4386c3d7b59bab15499d5d70f8d2713626f.tar.gz
mpd-a5f8d4386c3d7b59bab15499d5d70f8d2713626f.tar.xz
mpd-a5f8d4386c3d7b59bab15499d5d70f8d2713626f.zip
update: check return values
Nearly all mapper functions can fail and will then return NULL. Add checks to all callers.
-rw-r--r--src/decoder_thread.c20
-rw-r--r--src/playlist_save.c3
-rw-r--r--src/song.c13
-rw-r--r--src/update.c8
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);
}