diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/playlist.c | 2 | ||||
-rw-r--r-- | src/playlist.h | 2 | ||||
-rw-r--r-- | src/storedPlaylist.c | 17 |
3 files changed, 19 insertions, 2 deletions
diff --git a/src/playlist.c b/src/playlist.c index 02528908b..56915a487 100644 --- a/src/playlist.c +++ b/src/playlist.c @@ -65,7 +65,7 @@ static Playlist playlist; static int playlist_state = PLAYLIST_STATE_STOP; -static int playlist_max_length = DEFAULT_PLAYLIST_MAX_LENGTH; +int playlist_max_length = DEFAULT_PLAYLIST_MAX_LENGTH; static int playlist_stopOnError; static int playlist_errorCount; static int playlist_queueError; diff --git a/src/playlist.h b/src/playlist.h index 0ae3a677f..c06357b1e 100644 --- a/src/playlist.h +++ b/src/playlist.h @@ -47,6 +47,8 @@ typedef struct _Playlist { extern int playlist_saveAbsolutePaths; +extern int playlist_max_length; + void initPlaylist(void); void finishPlaylist(void); diff --git a/src/storedPlaylist.c b/src/storedPlaylist.c index 32e22cc4a..0451316ea 100644 --- a/src/storedPlaylist.c +++ b/src/storedPlaylist.c @@ -191,6 +191,9 @@ StoredPlaylist *loadStoredPlaylist(const char *utf8path, int fd) slength = 0; temp = fsCharsetToUtf8(s); if (temp && !commentCharFound) { + if (sp->list->numberOfNodes >= + (playlist_max_length - 1)) + goto out; song = getSongFromDB(temp); if (song) { appendSongToStoredPlaylist(sp, song); @@ -424,17 +427,29 @@ int appendSongToStoredPlaylistByPath(int fd, const char *utf8path, Song *song) char *filename; FILE *file; char *s; + int nr_songs = 0; + char path_max_tmp[MAXPATHLEN + 1]; filename = utf8pathToFsPathInStoredPlaylist(utf8path, fd); if (!filename) return -1; - while (!(file = fopen(filename, "a")) && errno == EINTR); + while (!(file = fopen(filename, "a+")) && errno == EINTR); if (file == NULL) { commandError(fd, ACK_ERROR_NO_EXIST, "could not open file " "\"%s\": %s", filename, strerror(errno)); return -1; } + while (myFgets(path_max_tmp, sizeof(path_max_tmp), file)) { + if (path_max_tmp[0] != PLAYLIST_COMMENT && + (++nr_songs >= playlist_max_length)) + break; + } + if (nr_songs >= playlist_max_length) { + commandError(fd, ACK_ERROR_PLAYLIST_MAX, + "playlist is at the max size"); + return -1; + } if (playlist_saveAbsolutePaths && song->type == SONG_TYPE_FILE) s = rmp2amp(utf8ToFsCharset(getSongUrl(song))); |