tag/{Aiff,Riff}: allow fstat() to fail
Omit the file size check if we don't know the size.
This commit is contained in:
@@ -42,16 +42,22 @@ struct aiff_chunk_header {
|
|||||||
uint32_t size;
|
uint32_t size;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
gcc_pure
|
||||||
|
static off_t
|
||||||
|
GetFileSize(FILE *file)
|
||||||
|
{
|
||||||
|
struct stat st;
|
||||||
|
return fstat(fileno(file), &st) == 0
|
||||||
|
? st.st_size
|
||||||
|
: -1;
|
||||||
|
}
|
||||||
|
|
||||||
size_t
|
size_t
|
||||||
aiff_seek_id3(FILE *file)
|
aiff_seek_id3(FILE *file)
|
||||||
{
|
{
|
||||||
/* determine the file size */
|
/* determine the file size */
|
||||||
|
|
||||||
struct stat st;
|
const off_t file_size = GetFileSize(file);
|
||||||
if (fstat(fileno(file), &st) < 0) {
|
|
||||||
LogErrno(aiff_domain, "Failed to stat file descriptor");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* seek to the beginning and read the AIFF header */
|
/* seek to the beginning and read the AIFF header */
|
||||||
|
|
||||||
@@ -64,7 +70,8 @@ aiff_seek_id3(FILE *file)
|
|||||||
size_t size = fread(&header, sizeof(header), 1, file);
|
size_t size = fread(&header, sizeof(header), 1, file);
|
||||||
if (size != 1 ||
|
if (size != 1 ||
|
||||||
memcmp(header.id, "FORM", 4) != 0 ||
|
memcmp(header.id, "FORM", 4) != 0 ||
|
||||||
FromBE32(header.size) > (uint32_t)st.st_size ||
|
(file_size >= 0 &&
|
||||||
|
FromBE32(header.size) > (uint32_t)file_size) ||
|
||||||
(memcmp(header.format, "AIFF", 4) != 0 &&
|
(memcmp(header.format, "AIFF", 4) != 0 &&
|
||||||
memcmp(header.format, "AIFC", 4) != 0))
|
memcmp(header.format, "AIFC", 4) != 0))
|
||||||
/* not a AIFF file */
|
/* not a AIFF file */
|
||||||
|
@@ -42,16 +42,22 @@ struct riff_chunk_header {
|
|||||||
uint32_t size;
|
uint32_t size;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
gcc_pure
|
||||||
|
static off_t
|
||||||
|
GetFileSize(FILE *file)
|
||||||
|
{
|
||||||
|
struct stat st;
|
||||||
|
return fstat(fileno(file), &st) == 0
|
||||||
|
? st.st_size
|
||||||
|
: -1;
|
||||||
|
}
|
||||||
|
|
||||||
size_t
|
size_t
|
||||||
riff_seek_id3(FILE *file)
|
riff_seek_id3(FILE *file)
|
||||||
{
|
{
|
||||||
/* determine the file size */
|
/* determine the file size */
|
||||||
|
|
||||||
struct stat st;
|
const off_t file_size = GetFileSize(file);
|
||||||
if (fstat(fileno(file), &st) < 0) {
|
|
||||||
LogErrno(riff_domain, "Failed to stat file descriptor");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* seek to the beginning and read the RIFF header */
|
/* seek to the beginning and read the RIFF header */
|
||||||
|
|
||||||
@@ -64,7 +70,7 @@ riff_seek_id3(FILE *file)
|
|||||||
size_t size = fread(&header, sizeof(header), 1, file);
|
size_t size = fread(&header, sizeof(header), 1, file);
|
||||||
if (size != 1 ||
|
if (size != 1 ||
|
||||||
memcmp(header.id, "RIFF", 4) != 0 ||
|
memcmp(header.id, "RIFF", 4) != 0 ||
|
||||||
FromLE32(header.size) > (uint32_t)st.st_size)
|
(file_size >= 0 && FromLE32(header.size) > (uint32_t)file_size))
|
||||||
/* not a RIFF file */
|
/* not a RIFF file */
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user