Make TIFF parsing a bit safer
At least on 64-bit systems, 32-bit may still have holes.
This commit is contained in:
		
							
								
								
									
										15
									
								
								tools/info.h
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								tools/info.h
									
									
									
									
									
								
							@@ -92,8 +92,8 @@ static jv parse_jpeg(jv o, const uint8_t *p, size_t len);
 | 
			
		||||
static jv parse_exif_ifd(struct tiffer *T, const struct tiff_entry *info);
 | 
			
		||||
 | 
			
		||||
static bool
 | 
			
		||||
parse_exif_subifds_entry(struct tiffer *T, const struct tiffer_entry *entry,
 | 
			
		||||
	struct tiffer *subT)
 | 
			
		||||
parse_exif_subifds_entry(const struct tiffer *T,
 | 
			
		||||
	const struct tiffer_entry *entry, struct tiffer *subT)
 | 
			
		||||
{
 | 
			
		||||
	int64_t offset = 0;
 | 
			
		||||
	return tiffer_integer(T, entry, &offset) &&
 | 
			
		||||
@@ -101,7 +101,7 @@ parse_exif_subifds_entry(struct tiffer *T, const struct tiffer_entry *entry,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static jv
 | 
			
		||||
parse_exif_subifds(struct tiffer *T, struct tiffer_entry *entry,
 | 
			
		||||
parse_exif_subifds(const struct tiffer *T, struct tiffer_entry *entry,
 | 
			
		||||
	struct tiff_entry *info)
 | 
			
		||||
{
 | 
			
		||||
	struct tiffer subT = {};
 | 
			
		||||
@@ -173,7 +173,7 @@ parse_exif_extract_sole_array_element(jv a)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static jv
 | 
			
		||||
parse_exif_entry(jv o, struct tiffer *T, struct tiffer_entry *entry,
 | 
			
		||||
parse_exif_entry(jv o, const struct tiffer *T, struct tiffer_entry *entry,
 | 
			
		||||
	const struct tiff_entry *info)
 | 
			
		||||
{
 | 
			
		||||
	static struct tiff_entry empty[] = {{}};
 | 
			
		||||
@@ -679,7 +679,7 @@ static struct tiff_entry mpf_entries[] = {
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static uint32_t
 | 
			
		||||
parse_mpf_mpentry(jv *a, const uint8_t *p, struct tiffer *T)
 | 
			
		||||
parse_mpf_mpentry(jv *a, const uint8_t *p, const struct tiffer *T)
 | 
			
		||||
{
 | 
			
		||||
	uint32_t attrs = T->un->u32(p);
 | 
			
		||||
	uint32_t offset = T->un->u32(p + 8);
 | 
			
		||||
@@ -725,7 +725,7 @@ parse_mpf_mpentry(jv *a, const uint8_t *p, struct tiffer *T)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static jv
 | 
			
		||||
parse_mpf_index_entry(jv o, const uint8_t ***offsets, struct tiffer *T,
 | 
			
		||||
parse_mpf_index_entry(jv o, const uint8_t ***offsets, const struct tiffer *T,
 | 
			
		||||
	struct tiffer_entry *entry)
 | 
			
		||||
{
 | 
			
		||||
	// 5.2.3.3. MP Entry
 | 
			
		||||
@@ -738,6 +738,9 @@ parse_mpf_index_entry(jv o, const uint8_t ***offsets, struct tiffer *T,
 | 
			
		||||
	jv a = jv_array_sized(count);
 | 
			
		||||
	const uint8_t **out = *offsets = calloc(sizeof *out, count + 1);
 | 
			
		||||
	for (uint32_t i = 0; i < count; i++) {
 | 
			
		||||
		// 5.2.3.3.3. Individual Image Data Offset
 | 
			
		||||
		// XXX: We might want to warn about out-of-bounds pointers,
 | 
			
		||||
		// however T->end is for the MPF segment and ends too early.
 | 
			
		||||
		uint32_t offset = parse_mpf_mpentry(&a, entry->p + i * 16, T);
 | 
			
		||||
		if (offset)
 | 
			
		||||
			*out++ = T->begin + offset;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user