commit 38e8933539ee9d044057b18a971c2eae3c21aba7
parent ffab889c1710c7646af9ed360c796a2a0a619efc
Author: Christian Grothoff <christian@grothoff.org>
Date: Fri, 13 Oct 2017 12:36:36 +0200
fix for NSF plugin's NPE reported by Leon Zhao
Diffstat:
2 files changed, 20 insertions(+), 15 deletions(-)
diff --git a/ChangeLog b/ChangeLog
@@ -1,3 +1,6 @@
+Fri Oct 13 12:30:37 CEST 2017
+ Properly check read error in NSF plugin (from signedness confusion) found by Leon Zhao. -CG
+
Fri Oct 13 12:27:38 CEST 2017
Protect against problematic integer offset in NSFE plugin found by Leon Zhao. -CG
diff --git a/src/plugins/nsf_extractor.c b/src/plugins/nsf_extractor.c
@@ -51,7 +51,7 @@ struct header
* Magic code.
*/
char magicid[5];
-
+
/**
* NSF version number.
*/
@@ -86,9 +86,9 @@ struct header
* Album title.
*/
char title[32];
-
+
/**
- * Artist name.
+ * Artist name.
*/
char artist[32];
@@ -152,13 +152,15 @@ EXTRACTOR_nsf_extract_method (struct EXTRACTOR_ExtractContext *ec)
char nsfversion[32];
const struct header *head;
void *data;
+ ssize_t ds;
- if (sizeof (struct header) >
- ec->read (ec->cls,
- &data,
- sizeof (struct header)))
+ ds = ec->read (ec->cls,
+ &data,
+ sizeof (struct header));
+ if ( (-1 == ds) ||
+ (sizeof (struct header) > ds) )
return;
- head = data;
+ head = data;
/* Check "magic" id bytes */
if (memcmp (head->magicid, "NESM\x1a", 5))
@@ -166,17 +168,17 @@ EXTRACTOR_nsf_extract_method (struct EXTRACTOR_ExtractContext *ec)
ADD ("audio/x-nsf", EXTRACTOR_METATYPE_MIMETYPE);
snprintf (nsfversion,
sizeof(nsfversion),
- "%d",
+ "%d",
head->nsfversion);
ADD (nsfversion, EXTRACTOR_METATYPE_FORMAT_VERSION);
- snprintf (songs,
+ snprintf (songs,
sizeof(songs),
"%d",
(int) head->songs);
ADD (songs, EXTRACTOR_METATYPE_SONG_COUNT);
- snprintf (startingsong,
+ snprintf (startingsong,
sizeof(startingsong),
- "%d",
+ "%d",
(int) head->firstsong);
ADD (startingsong, EXTRACTOR_METATYPE_STARTING_SONG);
memcpy (&album, head->title, 32);
@@ -196,14 +198,14 @@ EXTRACTOR_nsf_extract_method (struct EXTRACTOR_ExtractContext *ec)
else
{
if (0 != (head->tvflags & PAL_FLAG))
- ADD ("PAL", EXTRACTOR_METATYPE_BROADCAST_TELEVISION_SYSTEM);
+ ADD ("PAL", EXTRACTOR_METATYPE_BROADCAST_TELEVISION_SYSTEM);
else
- ADD ("NTSC", EXTRACTOR_METATYPE_BROADCAST_TELEVISION_SYSTEM);
+ ADD ("NTSC", EXTRACTOR_METATYPE_BROADCAST_TELEVISION_SYSTEM);
}
/* Detect Extra Sound Chips needed to play the files */
if (0 != (head->chipflags & VRCVI_FLAG))
- ADD ("VRCVI", EXTRACTOR_METATYPE_TARGET_ARCHITECTURE);
+ ADD ("VRCVI", EXTRACTOR_METATYPE_TARGET_ARCHITECTURE);
if (0 != (head->chipflags & VRCVII_FLAG))
ADD ("VRCVII", EXTRACTOR_METATYPE_TARGET_ARCHITECTURE);
if (0 != (head->chipflags & FDS_FLAG))