diff options
author | Max Kellermann <max@duempel.org> | 2010-06-01 09:10:58 +0200 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2010-06-01 09:59:54 +0200 |
commit | caf93d9a2c2360a5b4a1d841fb83394d6bf4fc09 (patch) | |
tree | 0bc9ab2cd488cb508e183d05cffeff54fb3995ad | |
parent | 747e945d29e847403cec928ca4a3df7f27864cfc (diff) | |
download | mpd-caf93d9a2c2360a5b4a1d841fb83394d6bf4fc09.tar.gz mpd-caf93d9a2c2360a5b4a1d841fb83394d6bf4fc09.tar.xz mpd-caf93d9a2c2360a5b4a1d841fb83394d6bf4fc09.zip |
playlist_list: playlist_list_open_path() returns input_stream
Memory leak fix. The input_stream object passed to
playlist_list_open_stream_suffix() must be closed by the caller - this
however never happens in playlist_list_open_path(), because it does
not return it to the caller.
-rw-r--r-- | src/playlist_list.c | 6 | ||||
-rw-r--r-- | src/playlist_list.h | 4 | ||||
-rw-r--r-- | src/playlist_mapper.c | 22 | ||||
-rw-r--r-- | src/playlist_mapper.h | 8 | ||||
-rw-r--r-- | src/playlist_print.c | 8 | ||||
-rw-r--r-- | src/playlist_queue.c | 7 |
6 files changed, 39 insertions, 16 deletions
diff --git a/src/playlist_list.c b/src/playlist_list.c index 1419c6ac8..e8319bd17 100644 --- a/src/playlist_list.c +++ b/src/playlist_list.c @@ -284,7 +284,7 @@ playlist_suffix_supported(const char *suffix) } struct playlist_provider * -playlist_list_open_path(const char *path_fs) +playlist_list_open_path(const char *path_fs, struct input_stream **is_r) { GError *error = NULL; const char *suffix; @@ -318,7 +318,9 @@ playlist_list_open_path(const char *path_fs) } playlist = playlist_list_open_stream_suffix(is, suffix); - if (playlist == NULL) + if (playlist != NULL) + *is_r = is; + else input_stream_close(is); return playlist; diff --git a/src/playlist_list.h b/src/playlist_list.h index f19fa6579..11a2356da 100644 --- a/src/playlist_list.h +++ b/src/playlist_list.h @@ -55,9 +55,11 @@ playlist_list_open_stream(struct input_stream *is, const char *uri); * Opens a playlist from a local file. * * @param path_fs the path of the playlist file + * @param is_r on success, an input_stream object is returned here, + * which must be closed after the playlist_provider object is freed * @return a playlist, or NULL on error */ struct playlist_provider * -playlist_list_open_path(const char *path_fs); +playlist_list_open_path(const char *path_fs, struct input_stream **is_r); #endif diff --git a/src/playlist_mapper.c b/src/playlist_mapper.c index 3933ec194..99b322073 100644 --- a/src/playlist_mapper.c +++ b/src/playlist_mapper.c @@ -27,13 +27,15 @@ #include <assert.h> static struct playlist_provider * -playlist_open_path(const char *path_fs) +playlist_open_path(const char *path_fs, struct input_stream **is_r) { struct playlist_provider *playlist; playlist = playlist_list_open_uri(path_fs); - if (playlist == NULL) - playlist = playlist_list_open_path(path_fs); + if (playlist != NULL) + *is_r = NULL; + else + playlist = playlist_list_open_path(path_fs, is_r); return playlist; } @@ -42,7 +44,7 @@ playlist_open_path(const char *path_fs) * Load a playlist from the configured playlist directory. */ static struct playlist_provider * -playlist_open_in_playlist_dir(const char *uri) +playlist_open_in_playlist_dir(const char *uri, struct input_stream **is_r) { char *path_fs; @@ -54,7 +56,7 @@ playlist_open_in_playlist_dir(const char *uri) path_fs = g_build_filename(playlist_directory_fs, uri, NULL); - struct playlist_provider *playlist = playlist_open_path(path_fs); + struct playlist_provider *playlist = playlist_open_path(path_fs, is_r); g_free(path_fs); return playlist; @@ -64,7 +66,7 @@ playlist_open_in_playlist_dir(const char *uri) * Load a playlist from the configured music directory. */ static struct playlist_provider * -playlist_open_in_music_dir(const char *uri) +playlist_open_in_music_dir(const char *uri, struct input_stream **is_r) { char *path_fs; @@ -74,25 +76,25 @@ playlist_open_in_music_dir(const char *uri) if (path_fs == NULL) return NULL; - struct playlist_provider *playlist = playlist_open_path(path_fs); + struct playlist_provider *playlist = playlist_open_path(path_fs, is_r); g_free(path_fs); return playlist; } struct playlist_provider * -playlist_mapper_open(const char *uri) +playlist_mapper_open(const char *uri, struct input_stream **is_r) { struct playlist_provider *playlist; if (spl_valid_name(uri)) { - playlist = playlist_open_in_playlist_dir(uri); + playlist = playlist_open_in_playlist_dir(uri, is_r); if (playlist != NULL) return playlist; } if (uri_safe_local(uri)) { - playlist = playlist_open_in_music_dir(uri); + playlist = playlist_open_in_music_dir(uri, is_r); if (playlist != NULL) return playlist; } diff --git a/src/playlist_mapper.h b/src/playlist_mapper.h index 045c4b0d7..b98af1b13 100644 --- a/src/playlist_mapper.h +++ b/src/playlist_mapper.h @@ -20,11 +20,17 @@ #ifndef MPD_PLAYLIST_MAPPER_H #define MPD_PLAYLIST_MAPPER_H +struct input_stream; + /** * Opens a playlist from an URI relative to the playlist or music * directory. + * + * @param is_r on success, an input_stream object may be returned + * here, which must be closed after the playlist_provider object is + * freed */ struct playlist_provider * -playlist_mapper_open(const char *uri); +playlist_mapper_open(const char *uri, struct input_stream **is_r); #endif diff --git a/src/playlist_print.c b/src/playlist_print.c index 020b0fa87..1ef3ff849 100644 --- a/src/playlist_print.c +++ b/src/playlist_print.c @@ -29,6 +29,7 @@ #include "song.h" #include "database.h" #include "client.h" +#include "input_stream.h" void playlist_print_uris(struct client *client, const struct playlist *playlist) @@ -168,11 +169,16 @@ playlist_provider_print(struct client *client, const char *uri, bool playlist_file_print(struct client *client, const char *uri, bool detail) { - struct playlist_provider *playlist = playlist_mapper_open(uri); + struct input_stream *is; + struct playlist_provider *playlist = playlist_mapper_open(uri, &is); if (playlist == NULL) return false; playlist_provider_print(client, uri, playlist, detail); playlist_plugin_close(playlist); + + if (is != NULL) + input_stream_close(is); + return true; } diff --git a/src/playlist_queue.c b/src/playlist_queue.c index 4bda90c76..9241d4774 100644 --- a/src/playlist_queue.c +++ b/src/playlist_queue.c @@ -101,11 +101,16 @@ playlist_open_into_queue(const char *uri, struct playlist *dest) if (uri_has_scheme(uri)) return playlist_open_remote_into_queue(uri, dest); - struct playlist_provider *playlist = playlist_mapper_open(uri); + struct input_stream *is; + struct playlist_provider *playlist = playlist_mapper_open(uri, &is); if (playlist != NULL) { enum playlist_result result = playlist_load_into_queue(uri, playlist, dest); playlist_plugin_close(playlist); + + if (is != NULL) + input_stream_close(is); + return result; } |