Merge branch 'v0.19.x'

This commit is contained in:
Max Kellermann 2016-03-07 14:30:43 +01:00
commit 6ff01cc72c
7 changed files with 41 additions and 23 deletions

8
NEWS
View File

@ -52,6 +52,14 @@ ver 0.20 (not yet released)
* update * update
- apply .mpdignore matches to subdirectories - apply .mpdignore matches to subdirectories
ver 0.19.14 (not yet released)
* decoder
- dsdiff: fix off-by-one buffer overflow
- opus: limit tag size to 64 kB
* archive
- iso9660: fix buffer overflow
* fix build failures on non-glibc builds due to constexpr Mutex
ver 0.19.13 (2016/02/23) ver 0.19.13 (2016/02/23)
* tags * tags
- aiff, riff: fix ID3 chunk padding - aiff, riff: fix ID3 chunk padding

View File

@ -65,7 +65,11 @@ public:
return iso9660_iso_seek_read(iso, ptr, start, i_size); return iso9660_iso_seek_read(iso, ptr, start, i_size);
} }
void Visit(const char *path, ArchiveVisitor &visitor); /**
* @param capacity the path buffer size
*/
void Visit(char *path, size_t length, size_t capacity,
ArchiveVisitor &visitor);
virtual void Close() override { virtual void Close() override {
Unref(); Unref();
@ -83,32 +87,36 @@ static constexpr Domain iso9660_domain("iso9660");
/* archive open && listing routine */ /* archive open && listing routine */
inline void inline void
Iso9660ArchiveFile::Visit(const char *psz_path, ArchiveVisitor &visitor) Iso9660ArchiveFile::Visit(char *path, size_t length, size_t capacity,
ArchiveVisitor &visitor)
{ {
CdioList_t *entlist; auto *entlist = iso9660_ifs_readdir(iso, path);
CdioListNode_t *entnode;
iso9660_stat_t *statbuf;
char pathname[4096];
entlist = iso9660_ifs_readdir (iso, psz_path);
if (!entlist) { if (!entlist) {
return; return;
} }
/* Iterate over the list of nodes that iso9660_ifs_readdir gives */ /* Iterate over the list of nodes that iso9660_ifs_readdir gives */
CdioListNode_t *entnode;
_CDIO_LIST_FOREACH (entnode, entlist) { _CDIO_LIST_FOREACH (entnode, entlist) {
statbuf = (iso9660_stat_t *) _cdio_list_node_data (entnode); auto *statbuf = (iso9660_stat_t *)
_cdio_list_node_data(entnode);
const char *filename = statbuf->filename;
if (strcmp(filename, ".") == 0 || strcmp(filename, "..") == 0)
continue;
strcpy(pathname, psz_path); size_t filename_length = strlen(filename);
strcat(pathname, statbuf->filename); if (length + filename_length + 1 >= capacity)
/* file name is too long */
continue;
memcpy(path + length, filename, filename_length + 1);
size_t new_length = length + filename_length;
if (iso9660_stat_s::_STAT_DIR == statbuf->type ) { if (iso9660_stat_s::_STAT_DIR == statbuf->type ) {
if (strcmp(statbuf->filename, ".") && strcmp(statbuf->filename, "..")) { memcpy(path + new_length, "/", 2);
strcat(pathname, "/"); Visit(path, new_length + 1, capacity, visitor);
Visit(pathname, visitor);
}
} else { } else {
//remove leading / //remove leading /
visitor.VisitArchiveEntry(pathname + 1); visitor.VisitArchiveEntry(path + 1);
} }
} }
_cdio_list_free (entlist, true); _cdio_list_free (entlist, true);
@ -132,7 +140,8 @@ iso9660_archive_open(Path pathname, Error &error)
void void
Iso9660ArchiveFile::Visit(ArchiveVisitor &visitor) Iso9660ArchiveFile::Visit(ArchiveVisitor &visitor)
{ {
Visit("/", visitor); char path[4096] = "/";
Visit(path, 1, sizeof(path), visitor);
} }
/* single archive handling */ /* single archive handling */

View File

@ -205,7 +205,7 @@ dsdiff_handle_native_tag(InputStream &is,
if (length == 0 || length > 60) if (length == 0 || length > 60)
return; return;
char string[length]; char string[length + 1];
char *label; char *label;
label = string; label = string;

View File

@ -85,7 +85,7 @@ public:
char *ReadString() { char *ReadString() {
uint32_t length; uint32_t length;
if (!ReadWord(length)) if (!ReadWord(length) || length >= 65536)
return nullptr; return nullptr;
const char *src = (const char *)Read(length); const char *src = (const char *)Read(length);

View File

@ -213,7 +213,7 @@ PulseMixer::SetVolume(unsigned new_volume, Error &error)
struct pa_cvolume cvolume; struct pa_cvolume cvolume;
pa_cvolume_set(&cvolume, volume.channels, pa_cvolume_set(&cvolume, volume.channels,
(pa_volume_t)new_volume * PA_VOLUME_NORM / 100 + 0.5); (new_volume * PA_VOLUME_NORM + 50) / 100);
bool success = pulse_output_set_volume(output, &cvolume, error); bool success = pulse_output_set_volume(output, &cvolume, error);
if (success) if (success)
volume = cvolume; volume = cvolume;

View File

@ -78,7 +78,7 @@ ParseCommandArgRange(const char *s)
throw FormatProtocolError(ACK_ERROR_ARG, throw FormatProtocolError(ACK_ERROR_ARG,
"Number is negative: %s", s); "Number is negative: %s", s);
if (unsigned(value) > std::numeric_limits<unsigned>::max()) if (value > std::numeric_limits<int>::max())
throw FormatProtocolError(ACK_ERROR_ARG, throw FormatProtocolError(ACK_ERROR_ARG,
"Number too large: %s", s); "Number too large: %s", s);
@ -99,7 +99,8 @@ ParseCommandArgRange(const char *s)
throw FormatProtocolError(ACK_ERROR_ARG, throw FormatProtocolError(ACK_ERROR_ARG,
"Number is negative: %s", s); "Number is negative: %s", s);
if (unsigned(value) > std::numeric_limits<unsigned>::max())
if (value > std::numeric_limits<int>::max())
throw FormatProtocolError(ACK_ERROR_ARG, throw FormatProtocolError(ACK_ERROR_ARG,
"Number too large: %s", s); "Number too large: %s", s);

View File

@ -46,7 +46,7 @@ static size_t
AlignToPageSize(size_t size) AlignToPageSize(size_t size)
{ {
static const long page_size = sysconf(_SC_PAGESIZE); static const long page_size = sysconf(_SC_PAGESIZE);
if (page_size > 0) if (page_size == 0)
return size; return size;
size_t ps(page_size); size_t ps(page_size);