aboutsummaryrefslogtreecommitdiffstats
path: root/src/playlist
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2010-06-01 09:10:58 +0200
committerMax Kellermann <max@duempel.org>2010-06-01 09:59:54 +0200
commitcaf93d9a2c2360a5b4a1d841fb83394d6bf4fc09 (patch)
tree0bc9ab2cd488cb508e183d05cffeff54fb3995ad /src/playlist
parent747e945d29e847403cec928ca4a3df7f27864cfc (diff)
downloadmpd-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.
Diffstat (limited to '')
-rw-r--r--src/playlist_list.c6
-rw-r--r--src/playlist_list.h4
-rw-r--r--src/playlist_mapper.c22
-rw-r--r--src/playlist_mapper.h8
-rw-r--r--src/playlist_print.c8
-rw-r--r--src/playlist_queue.c7
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;
}