file-jpeg: fix loading of photoshop path split across multiple segments

Some JPEGs contain large Photoshop path metadata split across multiple APP13 markers. Collect all APP13 payloads and skip the repeated "Photoshop 3.0\0" identifier for subsequent segments so the metadata can be parsed as a single stream.
This commit is contained in:
Frank Teklote 2026-03-09 11:20:21 +01:00 committed by Frank Teklote
parent 5013aca0d4
commit 4576f5a2f1
2 changed files with 16 additions and 10 deletions

View file

@ -78,8 +78,8 @@ load_image (GFile *file,
GimpColorProfile *cmyk_profile = NULL;
gint tile_height;
gint i;
guchar *photoshop_data = NULL;
guint photoshop_len = 0;
gchar *photoshop_data = NULL;
gint32 photoshop_len = 0;
gboolean support_12_bit = FALSE;
#if LIBJPEG_TURBO_VERSION_NUMBER >= 3000000
@ -299,15 +299,22 @@ load_image (GFile *file,
}
else if (marker->marker == JPEG_APP0 + 13)
{
photoshop_data = g_new (guchar, len);
photoshop_len = len;
memcpy (photoshop_data, (guchar *) marker->data, len);
photoshop_data = g_realloc (photoshop_data,
(gsize) photoshop_len + len - sizeof (JPEG_APP_HEADER_PS));
*ps_metadata_loaded = TRUE;
memcpy (photoshop_data + photoshop_len,
data + sizeof (JPEG_APP_HEADER_PS),
len - sizeof (JPEG_APP_HEADER_PS));
photoshop_len += len;
photoshop_len -= sizeof (JPEG_APP_HEADER_PS);
if (ps_metadata_loaded)
*ps_metadata_loaded = TRUE;
#ifdef GIMP_UNSTABLE
g_print ("jpeg-load: found Photoshop block (%d bytes) %s\n",
(gint) (len - sizeof (JPEG_APP_HEADER_EXIF)), data);
(gint) (len - sizeof (JPEG_APP_HEADER_PS)), data);
#endif
}
}
@ -574,9 +581,7 @@ load_image (GFile *file,
g_strerror (errno));
}
fwrite (photoshop_data + (sizeof (JPEG_APP_HEADER_EXIF) * 2),
sizeof (guchar), photoshop_len - sizeof (JPEG_APP_HEADER_EXIF),
fp);
fwrite (photoshop_data, sizeof (guchar), photoshop_len, fp);
fclose (fp);
g_free (photoshop_data);

View file

@ -27,6 +27,7 @@
/* headers used in some APPn markers */
#define JPEG_APP_HEADER_EXIF "Exif\0\0"
#define JPEG_APP_HEADER_XMP "http://ns.adobe.com/xap/1.0/"
#define JPEG_APP_HEADER_PS "Photoshop 3.0"
typedef struct my_error_mgr
{