summaryrefslogtreecommitdiff
blob: a877c7f22ac29a8d5c9c6a4fe2dbd58770c2854a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
diff -Naurp libexif-0.5.12.orig/libexif/exif-data.c libexif-0.5.12/libexif/exif-data.c
--- libexif-0.5.12.orig/libexif/exif-data.c	2005-05-09 13:40:51.000000000 -0700
+++ libexif-0.5.12/libexif/exif-data.c	2005-05-09 13:43:26.000000000 -0700
@@ -172,9 +172,10 @@ exif_data_load_data_thumbnail (ExifData 
 }
 
 static void
-exif_data_load_data_content (ExifData *data, ExifContent *ifd,
-			     const unsigned char *d,
-			     unsigned int ds, unsigned int offset)
+exif_data_load_data_content_recurse (ExifData *data, ExifContent *ifd,
+				     const unsigned char *d,
+				     unsigned int ds, unsigned int offset,
+				     unsigned int level)
 {
 	ExifLong o, thumbnail_offset = 0, thumbnail_length = 0;
 	ExifShort n;
@@ -182,6 +183,11 @@ exif_data_load_data_content (ExifData *d
 	unsigned int i;
 	ExifTag tag;
 
+	if (level > 150)
+	  {
+	    return 0;
+	  }
+
 	/* Read the number of entries */
 	n = exif_get_short (d + offset, data->priv->order);
 #ifdef DEBUG
@@ -205,16 +213,16 @@ exif_data_load_data_content (ExifData *d
 					   data->priv->order);
 			switch (tag) {
 			case EXIF_TAG_EXIF_IFD_POINTER:
-				exif_data_load_data_content (data,
-					data->ifd[EXIF_IFD_EXIF], d, ds, o);
+				exif_data_load_data_content_recurse (data,
+					data->ifd[EXIF_IFD_EXIF], d, ds, o, level + 1);
 				break;
 			case EXIF_TAG_GPS_INFO_IFD_POINTER:
-				exif_data_load_data_content (data,
-					data->ifd[EXIF_IFD_GPS], d, ds, o);
+				exif_data_load_data_content_recurse (data,
+					data->ifd[EXIF_IFD_GPS], d, ds, o, level + 1);
 				break;
 			case EXIF_TAG_INTEROPERABILITY_IFD_POINTER:
-				exif_data_load_data_content (data,
-					data->ifd[EXIF_IFD_INTEROPERABILITY], d, ds, o);
+				exif_data_load_data_content_recurse (data,
+					data->ifd[EXIF_IFD_INTEROPERABILITY], d, ds, o, level + 1);
 				break;
 			case EXIF_TAG_JPEG_INTERCHANGE_FORMAT:
 #ifdef DEBUG
@@ -252,6 +260,14 @@ exif_data_load_data_content (ExifData *d
 }
 
 static void
+exif_data_load_data_content (ExifData *data, ExifContent *ifd,
+			     const unsigned char *d,
+			     unsigned int ds, unsigned int offset)
+{
+  exif_data_load_data_content_recurse (data, ifd, d, ds, offset, 0);
+}
+
+static void
 exif_data_save_data_content (ExifData *data, ExifContent *ifd,
 			     unsigned char **d, unsigned int *ds,
 			     unsigned int offset)