]> git.imager.perl.org - imager.git/blobdiff - JPEG/imexif.c
add probe support for FLIF files
[imager.git] / JPEG / imexif.c
index 07f75b87f8dd1a44a21bfbc8c796e61e39ffa3b2..8cb90b7808aeac46346b6c2927bb3dc47fc1522e 100644 (file)
@@ -282,6 +282,7 @@ invalid data.
 
 Returns true if an Exif header was seen.
 
+=cut
 */
 
 int
@@ -920,7 +921,7 @@ tiff_load_ifd(imtiff *tiff, unsigned long offset) {
 
   /* rough check count + 1 entry + next offset */
   if (offset + (2+12+4) > tiff->size) {
-    mm_log((2, "offset %uld beyond end off Exif block"));
+    mm_log((2, "offset %lu beyond end off Exif block", offset));
     return 0;
   }
 
@@ -929,7 +930,7 @@ tiff_load_ifd(imtiff *tiff, unsigned long offset) {
   /* check we can fit the whole thing */
   ifd_size = 2 + count * 12 + 4; /* count + count entries + next offset */
   if (offset + ifd_size > tiff->size) {
-    mm_log((2, "offset %uld beyond end off Exif block"));
+    mm_log((2, "offset %lu beyond end off Exif block", offset));
     return 0;
   }
 
@@ -1298,15 +1299,27 @@ copy_num_array_tags(i_img *im, imtiff *tiff, tag_map *map, int map_count) {
        if (entry->type == ift_rational || entry->type == ift_srational) {
          double value;
          char workstr[MAX_ARRAY_STRING];
+         size_t len = 0, item_len;
          *workstr = '\0';
          for (j = 0; j < entry->count; ++j) {
            if (!tiff_get_tag_double_array(tiff, tag_index, &value, j)) {
              mm_log((3, "unexpected failure from tiff_get_tag_double_array(..., %d, ..., %d)\n", tag_index, j));
              return;
            }
-           if (j) 
+           if (len >= sizeof(workstr) - 1) {
+             mm_log((3, "Buffer would overflow reading tag %#x\n", entry->tag));
+             return;
+           }
+           if (j) {
              strcat(workstr, " ");
-           sprintf(workstr + strlen(workstr), "%.6g", value);
+             ++len;
+           }
+#ifdef IMAGER_SNPRINTF
+           item_len = snprintf(workstr + len, sizeof(workstr)-len, "%.6g", value);
+#else
+           item_len = sprintf(workstr + len, "%.6g", value);
+#endif
+           len += item_len;
          }
          i_tags_set(&im->tags, map[i].name, workstr, -1);
        }
@@ -1315,15 +1328,27 @@ copy_num_array_tags(i_img *im, imtiff *tiff, tag_map *map, int map_count) {
                 || entry->type == ift_byte) {
          int value;
          char workstr[MAX_ARRAY_STRING];
+         size_t len = 0, item_len;
          *workstr = '\0';
          for (j = 0; j < entry->count; ++j) {
            if (!tiff_get_tag_int_array(tiff, tag_index, &value, j)) {
              mm_log((3, "unexpected failure from tiff_get_tag_int_array(..., %d, ..., %d)\n", tag_index, j));
              return;
            }
-           if (j) 
+           if (len >= sizeof(workstr) - 1) {
+             mm_log((3, "Buffer would overflow reading tag %#x\n", entry->tag));
+             return;
+           }
+           if (j) {
              strcat(workstr, " ");
-           sprintf(workstr + strlen(workstr), "%d", value);
+             ++len;
+           }
+#ifdef IMAGER_SNPRINTF
+           item_len = snprintf(workstr + len, sizeof(workstr) - len, "%d", value);
+#else
+           item_len = sprintf(workstr + len, "%d", value);
+#endif
+           len += item_len;
          }
          i_tags_set(&im->tags, map[i].name, workstr, -1);
        }
@@ -1396,7 +1421,8 @@ Retrieve a 16 bit unsigned integer from offset.
 static unsigned
 tiff_get16(imtiff *tiff, unsigned long offset) {
   if (offset + 2 > tiff->size) {
-    mm_log((3, "attempt to get16 at %uld in %uld image", offset, tiff->size));
+    mm_log((3, "attempt to get16 at %lu in %lu image", offset,
+           (unsigned long)tiff->size));
     return 0;
   }
 
@@ -1417,7 +1443,8 @@ Retrieve a 32-bit unsigned integer from offset.
 static unsigned
 tiff_get32(imtiff *tiff, unsigned long offset) {
   if (offset + 4 > tiff->size) {
-    mm_log((3, "attempt to get16 at %uld in %uld image", offset, tiff->size));
+    mm_log((3, "attempt to get16 at %lu in %lu image", offset,
+           (unsigned long)tiff->size));
     return 0;
   }
 
@@ -1468,7 +1495,8 @@ tiff_get16s(imtiff *tiff, unsigned long offset) {
   int result;
 
   if (offset + 2 > tiff->size) {
-    mm_log((3, "attempt to get16 at %uld in %uld image", offset, tiff->size));
+    mm_log((3, "attempt to get16 at %lu in %lu image", offset,
+           (unsigned long)tiff->size));
     return 0;
   }
 
@@ -1496,7 +1524,8 @@ tiff_get32s(imtiff *tiff, unsigned long offset) {
   unsigned work;
 
   if (offset + 4 > tiff->size) {
-    mm_log((3, "attempt to get16 at %uld in %uld image", offset, tiff->size));
+    mm_log((3, "attempt to get16 at %lu in %lu image", offset,
+           (unsigned long)tiff->size));
     return 0;
   }
 
@@ -1526,7 +1555,8 @@ static double
 tiff_get_rat(imtiff *tiff, unsigned long offset) {
   unsigned long numer, denom;
   if (offset + 8 > tiff->size) {
-    mm_log((3, "attempt to get_rat at %lu in %lu image", offset, tiff->size));
+    mm_log((3, "attempt to get_rat at %lu in %lu image", offset,
+           (unsigned long)tiff->size));
     return 0;
   }
 
@@ -1552,7 +1582,8 @@ static double
 tiff_get_rats(imtiff *tiff, unsigned long offset) {
   long numer, denom;
   if (offset + 8 > tiff->size) {
-    mm_log((3, "attempt to get_rat at %lu in %lu image", offset, tiff->size));
+    mm_log((3, "attempt to get_rat at %lu in %lu image", offset,
+           (unsigned long)tiff->size));
     return 0;
   }