From 0700e55a62c329adfa8db0f81301b7ab8af76c45 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Tue, 29 Jan 2008 09:22:39 +0000 Subject: storedPlaylist: faster, but less accurate check for maximum sizes There are still other ways to run the mpd server out of disk-space, so permissions are still recommended to protect against malicious users. git-svn-id: https://svn.musicpd.org/mpd/branches/branch-0.13.0-fixes@7178 09075e82-0dd4-0310-85a5-a0d7c8717e4f --- src/storedPlaylist.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/storedPlaylist.c b/src/storedPlaylist.c index 0451316ea..daa97c76f 100644 --- a/src/storedPlaylist.c +++ b/src/storedPlaylist.c @@ -427,25 +427,25 @@ int appendSongToStoredPlaylistByPath(int fd, const char *utf8path, Song *song) char *filename; FILE *file; char *s; - int nr_songs = 0; + struct stat st; 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 (fstat(fileno(file), &st) < 0) { + commandError(fd, ACK_ERROR_NO_EXIST, "could not stat file " + "\"%s\": %s", path_max_tmp, strerror(errno)); + return -1; } - if (nr_songs >= playlist_max_length) { + if (st.st_size >= ((MAXPATHLEN+1) * playlist_max_length)) { commandError(fd, ACK_ERROR_PLAYLIST_MAX, "playlist is at the max size"); return -1; -- cgit v1.2.3