Commit abbe7c4e authored by Marco Ciampa's avatar Marco Ciampa

Merge branch 'gimp-2-10' of gitlab.gnome.org:GNOME/gimp into gimp-2-10

parents 7ca3f1d4 f46cf260
......@@ -18,16 +18,21 @@
#ifndef __GIMP_BRUSH_HEADER_H__
#define __GIMP_BRUSH_HEADER_H__
#define GBRUSH_FILE_VERSION 2
#define GBRUSH_MAGIC (('G' << 24) + ('I' << 16) + ('M' << 8) + ('P' << 0))
#define GIMP_BRUSH_FILE_VERSION 2
#define GIMP_BRUSH_MAGIC (('G' << 24) + ('I' << 16) + \
('M' << 8) + ('P' << 0))
#define GIMP_BRUSH_MAX_SIZE 10000 /* Max size in either dimension in px */
#define GIMP_BRUSH_MAX_NAME 256 /* Max length of the brush's name */
/* All field entries are MSB */
typedef struct _BrushHeader BrushHeader;
typedef struct _GimpBrushHeader GimpBrushHeader;
struct _BrushHeader
struct _GimpBrushHeader
{
guint32 header_size; /* header_size = sizeof (BrushHeader) + brush name */
guint32 header_size; /* = sizeof (GimpBrushHeader) + brush name */
guint32 version; /* brush file version # */
guint32 width; /* width of brush */
guint32 height; /* height of brush */
......@@ -40,4 +45,5 @@ struct _BrushHeader
* comes the brush data--width * height * bytes bytes of it...
*/
#endif /* __GIMP_BRUSH_HEADER_H__ */
......@@ -134,15 +134,15 @@ gimp_brush_load_brush (GimpContext *context,
GInputStream *input,
GError **error)
{
GimpBrush *brush;
gsize bn_size;
BrushHeader header;
gchar *name = NULL;
guchar *pixmap;
guchar *mask;
gsize bytes_read;
gssize i, size;
gboolean success = TRUE;
GimpBrush *brush;
gsize bn_size;
GimpBrushHeader header;
gchar *name = NULL;
guchar *pixmap;
guchar *mask;
gsize bytes_read;
gssize i, size;
gboolean success = TRUE;
g_return_val_if_fail (G_IS_FILE (file), NULL);
g_return_val_if_fail (G_IS_INPUT_STREAM (input), NULL);
......@@ -188,7 +188,7 @@ gimp_brush_load_brush (GimpContext *context,
return NULL;
}
if (header.width > GIMP_BRUSH_MAX_SIZE ||
if (header.width > GIMP_BRUSH_MAX_SIZE ||
header.height > GIMP_BRUSH_MAX_SIZE)
{
g_set_error (error, GIMP_DATA_ERROR, GIMP_DATA_ERROR_READ,
......@@ -225,7 +225,7 @@ gimp_brush_load_brush (GimpContext *context,
/* fallthrough */
case 2:
if (header.magic_number == GBRUSH_MAGIC)
if (header.magic_number == GIMP_BRUSH_MAGIC)
break;
default:
......@@ -235,7 +235,7 @@ gimp_brush_load_brush (GimpContext *context,
return NULL;
}
if (header.header_size < sizeof (BrushHeader))
if (header.header_size < sizeof (GimpBrushHeader))
{
g_set_error (error, GIMP_DATA_ERROR, GIMP_DATA_ERROR_READ,
_("Unsupported brush format"));
......@@ -247,7 +247,17 @@ gimp_brush_load_brush (GimpContext *context,
{
gchar *utf8;
name = g_new (gchar, bn_size);
if (bn_size > GIMP_BRUSH_MAX_NAME)
{
g_set_error (error, GIMP_DATA_ERROR, GIMP_DATA_ERROR_READ,
_("Invalid header data in '%s': "
"Brush name is too long: %lu"),
gimp_file_get_utf8_name (file),
(gulong) bn_size);
return NULL;
}
name = g_new0 (gchar, bn_size + 1);
if (! g_input_stream_read_all (input, name, bn_size,
&bytes_read, NULL, error) ||
......@@ -264,7 +274,7 @@ gimp_brush_load_brush (GimpContext *context,
name = utf8;
}
if (!name)
if (! name)
name = g_strdup (_("Unnamed"));
brush = g_object_new (GIMP_TYPE_BRUSH,
......
......@@ -21,7 +21,6 @@
#include "gimpdata.h"
#define GIMP_BRUSH_MAX_SIZE 10000.0 /*Max size in either dimension in px*/
#define GIMP_TYPE_BRUSH (gimp_brush_get_type ())
#define GIMP_BRUSH(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_BRUSH, GimpBrush))
......
......@@ -18,16 +18,21 @@
#ifndef __GIMP_PATTERN_HEADER_H__
#define __GIMP_PATTERN_HEADER_H__
#define GPATTERN_FILE_VERSION 1
#define GPATTERN_MAGIC (('G' << 24) + ('P' << 16) + ('A' << 8) + ('T' << 0))
#define GIMP_PATTERN_FILE_VERSION 1
#define GIMP_PATTERN_MAGIC (('G' << 24) + ('P' << 16) + \
('A' << 8) + ('T' << 0))
#define GIMP_PATTERN_MAX_SIZE 10000 /* Max size in either dimension in px */
#define GIMP_PATTERN_MAX_NAME 256 /* Max length of the pattern's name */
/* All field entries are MSB */
typedef struct _PatternHeader PatternHeader;
typedef struct _GimpPatternHeader GimpPatternHeader;
struct _PatternHeader
struct _GimpPatternHeader
{
guint32 header_size; /* header_size = sizeof(PatternHeader) + pattern name */
guint32 header_size; /* = sizeof (GimpPatternHeader) + pattern name */
guint32 version; /* pattern file version # */
guint32 width; /* width of pattern */
guint32 height; /* height of pattern */
......@@ -39,4 +44,5 @@ struct _PatternHeader
* comes the pattern data--width * height * bytes bytes of it...
*/
#endif /* __GIMP_PATTERN_HEADER_H__ */
......@@ -40,13 +40,13 @@ gimp_pattern_load (GimpContext *context,
GInputStream *input,
GError **error)
{
GimpPattern *pattern = NULL;
const Babl *format = NULL;
PatternHeader header;
gsize size;
gsize bytes_read;
gint bn_size;
gchar *name = NULL;
GimpPattern *pattern = NULL;
const Babl *format = NULL;
GimpPatternHeader header;
gsize size;
gsize bytes_read;
gsize bn_size;
gchar *name = NULL;
g_return_val_if_fail (G_IS_FILE (file), NULL);
g_return_val_if_fail (G_IS_INPUT_STREAM (input), NULL);
......@@ -70,8 +70,9 @@ gimp_pattern_load (GimpContext *context,
header.magic_number = g_ntohl (header.magic_number);
/* Check for correct file format */
if (header.magic_number != GPATTERN_MAGIC || header.version != 1 ||
header.header_size <= sizeof (header))
if (header.magic_number != GIMP_PATTERN_MAGIC ||
header.version != 1 ||
header.header_size <= sizeof (header))
{
g_set_error (error, GIMP_DATA_ERROR, GIMP_DATA_ERROR_READ,
_("Unknown pattern format version %d."),
......@@ -90,16 +91,16 @@ gimp_pattern_load (GimpContext *context,
}
/* Validate dimensions */
if ((header.width == 0) || (header.width > GIMP_MAX_IMAGE_SIZE) ||
(header.height == 0) || (header.height > GIMP_MAX_IMAGE_SIZE) ||
if ((header.width == 0) || (header.width > GIMP_PATTERN_MAX_SIZE) ||
(header.height == 0) || (header.height > GIMP_PATTERN_MAX_SIZE) ||
(G_MAXSIZE / header.width / header.height / header.bytes < 1))
{
g_set_error (error, GIMP_DATA_ERROR, GIMP_DATA_ERROR_READ,
_("Invalid header data in '%s': width=%lu, height=%lu, "
"bytes=%lu"), gimp_file_get_utf8_name (file),
(unsigned long int)header.width,
(unsigned long int)header.height,
(unsigned long int)header.bytes);
(gulong) header.width,
(gulong) header.height,
(gulong) header.bytes);
goto error;
}
......@@ -108,7 +109,17 @@ gimp_pattern_load (GimpContext *context,
{
gchar *utf8;
name = g_new (gchar, bn_size);
if (bn_size > GIMP_PATTERN_MAX_NAME)
{
g_set_error (error, GIMP_DATA_ERROR, GIMP_DATA_ERROR_READ,
_("Invalid header data in '%s': "
"Pattern name is too long: %lu"),
gimp_file_get_utf8_name (file),
(gulong) bn_size);
goto error;
}
name = g_new0 (gchar, bn_size + 1);
if (! g_input_stream_read_all (input, name, bn_size,
&bytes_read, NULL, error) ||
......
......@@ -30,7 +30,7 @@
#include "gegl/gimp-babl.h"
#include "core/gimpbrush.h"
#include "core/gimpbrush-header.h"
#include "core/gimpbrushgenerated.h"
#include "core/gimpdrawable.h"
#include "core/gimpdynamics.h"
......
......@@ -27,6 +27,7 @@
#include "paint-types.h"
#include "core/gimp.h"
#include "core/gimpbrush-header.h"
#include "core/gimpbrushgenerated.h"
#include "core/gimpimage.h"
#include "core/gimpdynamics.h"
......
......@@ -29,6 +29,7 @@
#include "core/gimp-palettes.h"
#include "core/gimpbrush.h"
#include "core/gimpbrush-header.h"
#include "core/gimpdrawable.h"
#include "core/gimpdynamics.h"
#include "core/gimpimage.h"
......
......@@ -348,7 +348,7 @@ load_image (GFile *file,
{
GInputStream *input;
gchar *name;
BrushHeader bh;
GimpBrushHeader bh;
guchar *brush_buf = NULL;
gint32 image_ID;
gint32 layer_ID;
......@@ -368,7 +368,7 @@ load_image (GFile *file,
if (! input)
return -1;
size = G_STRUCT_OFFSET (BrushHeader, magic_number);
size = G_STRUCT_OFFSET (GimpBrushHeader, magic_number);
if (! g_input_stream_read_all (input, &bh, size,
&bytes_read, NULL, error) ||
......@@ -386,8 +386,8 @@ load_image (GFile *file,
bh.bytes = g_ntohl (bh.bytes);
/* Sanitize values */
if ((bh.width == 0) || (bh.width > GIMP_MAX_IMAGE_SIZE) ||
(bh.height == 0) || (bh.height > GIMP_MAX_IMAGE_SIZE) ||
if ((bh.width == 0) || (bh.width > GIMP_BRUSH_MAX_SIZE) ||
(bh.height == 0) || (bh.height > GIMP_BRUSH_MAX_SIZE) ||
((bh.bytes != 1) && (bh.bytes != 2) && (bh.bytes != 4) &&
(bh.bytes != 18)) ||
(G_MAXSIZE / bh.width / bh.height / MAX (4, bh.bytes) < 1))
......@@ -395,8 +395,9 @@ load_image (GFile *file,
g_set_error (error, G_FILE_ERROR, G_FILE_ERROR_FAILED,
_("Invalid header data in '%s': width=%lu, height=%lu, "
"bytes=%lu"), g_file_get_parse_name (file),
(unsigned long int)bh.width, (unsigned long int)bh.height,
(unsigned long int)bh.bytes);
(gulong) bh.width,
(gulong) bh.height,
(gulong) bh.bytes);
return -1;
}
......@@ -406,7 +407,7 @@ load_image (GFile *file,
/* Version 1 didn't have a magic number and had no spacing */
bh.spacing = 25;
bh.header_size += 8;
if (bh.header_size < sizeof (BrushHeader))
if (bh.header_size < sizeof (GimpBrushHeader))
{
g_set_error (error, G_FILE_ERROR, G_FILE_ERROR_FAILED,
_("Unsupported brush format"));
......@@ -421,7 +422,7 @@ load_image (GFile *file,
if (! g_input_stream_read_all (input,
(guchar *) &bh +
G_STRUCT_OFFSET (BrushHeader,
G_STRUCT_OFFSET (GimpBrushHeader,
magic_number), size,
&bytes_read, NULL, error) ||
bytes_read != size)
......@@ -447,8 +448,8 @@ load_image (GFile *file,
}
}
if (bh.magic_number == GBRUSH_MAGIC &&
bh.header_size > sizeof (BrushHeader))
if (bh.magic_number == GIMP_BRUSH_MAGIC &&
bh.header_size > sizeof (GimpBrushHeader))
break;
default:
......@@ -457,9 +458,21 @@ load_image (GFile *file,
return -1;
}
if ((size = (bh.header_size - sizeof (BrushHeader))) > 0)
if ((size = (bh.header_size - sizeof (GimpBrushHeader))) > 0)
{
gchar *temp = g_new (gchar, size);
gchar *temp;
if (size > GIMP_BRUSH_MAX_NAME)
{
g_set_error (error, G_FILE_ERROR, G_FILE_ERROR_FAILED,
_("Invalid header data in '%s': "
"Brush name is too long: %lu"),
gimp_file_get_utf8_name (file),
(gulong) size);
return -1;
}
temp = g_new0 (gchar, size + 1);
if (! g_input_stream_read_all (input, temp, size,
&bytes_read, NULL, error) ||
......@@ -502,15 +515,15 @@ load_image (GFile *file,
{
case 1:
{
PatternHeader ph;
GimpPatternHeader ph;
/* For backwards-compatibility, check if a pattern follows.
* The obsolete .gpb format did it this way.
*/
if (g_input_stream_read_all (input, &ph, sizeof (PatternHeader),
if (g_input_stream_read_all (input, &ph, sizeof (GimpPatternHeader),
&bytes_read, NULL, NULL) &&
bytes_read == sizeof (PatternHeader))
bytes_read == sizeof (GimpPatternHeader))
{
/* rearrange the bytes in each unsigned int */
ph.header_size = g_ntohl (ph.header_size);
......@@ -520,16 +533,16 @@ load_image (GFile *file,
ph.bytes = g_ntohl (ph.bytes);
ph.magic_number = g_ntohl (ph.magic_number);
if (ph.magic_number == GPATTERN_MAGIC &&
ph.version == 1 &&
ph.header_size > sizeof (PatternHeader) &&
ph.bytes == 3 &&
ph.width == bh.width &&
ph.height == bh.height &&
if (ph.magic_number == GIMP_PATTERN_MAGIC &&
ph.version == 1 &&
ph.header_size > sizeof (GimpPatternHeader) &&
ph.bytes == 3 &&
ph.width == bh.width &&
ph.height == bh.height &&
g_input_stream_skip (input,
ph.header_size - sizeof (PatternHeader),
ph.header_size - sizeof (GimpPatternHeader),
NULL, NULL) ==
ph.header_size - sizeof (PatternHeader))
ph.header_size - sizeof (GimpPatternHeader))
{
guchar *plain_brush = brush_buf;
gint i;
......@@ -660,18 +673,18 @@ save_image (GFile *file,
gint32 drawable_ID,
GError **error)
{
GOutputStream *output;
BrushHeader bh;
guchar *brush_buf;
GeglBuffer *buffer;
const Babl *format;
gint line;
gint x;
gint bpp;
gint file_bpp;
gint width;
gint height;
GimpRGB gray, white;
GOutputStream *output;
GimpBrushHeader bh;
guchar *brush_buf;
GeglBuffer *buffer;
const Babl *format;
gint line;
gint x;
gint bpp;
gint file_bpp;
gint width;
gint height;
GimpRGB gray, white;
gimp_rgba_set_uchar (&white, 255, 255, 255, 255);
......@@ -709,16 +722,16 @@ save_image (GFile *file,
width = gimp_drawable_width (drawable_ID);
height = gimp_drawable_height (drawable_ID);
bh.header_size = g_htonl (sizeof (BrushHeader) +
bh.header_size = g_htonl (sizeof (GimpBrushHeader) +
strlen (info.description) + 1);
bh.version = g_htonl (2);
bh.width = g_htonl (width);
bh.height = g_htonl (height);
bh.bytes = g_htonl (file_bpp);
bh.magic_number = g_htonl (GBRUSH_MAGIC);
bh.magic_number = g_htonl (GIMP_BRUSH_MAGIC);
bh.spacing = g_htonl (info.spacing);
if (! g_output_stream_write_all (output, &bh, sizeof (BrushHeader),
if (! g_output_stream_write_all (output, &bh, sizeof (GimpBrushHeader),
NULL, NULL, error))
{
g_object_unref (output);
......
......@@ -452,15 +452,15 @@ gih_load_one_brush (GInputStream *input,
gint32 image_ID,
GError **error)
{
gchar *name = NULL;
BrushHeader bh;
guchar *brush_buf = NULL;
gint32 layer_ID;
gsize size;
GimpImageType image_type;
gint width, height;
gint new_width, new_height;
gsize bytes_read;
gchar *name = NULL;
GimpBrushHeader bh;
guchar *brush_buf = NULL;
gint32 layer_ID;
gsize size;
GimpImageType image_type;
gint width, height;
gint new_width, new_height;
gsize bytes_read;
if (! g_input_stream_read_all (input, &bh, sizeof (bh),
&bytes_read, NULL, error) ||
......@@ -479,15 +479,16 @@ gih_load_one_brush (GInputStream *input,
bh.spacing = g_ntohl (bh.spacing);
/* Sanitize values */
if ((bh.width == 0) || (bh.width > GIMP_MAX_IMAGE_SIZE) ||
(bh.height == 0) || (bh.height > GIMP_MAX_IMAGE_SIZE) ||
if ((bh.width == 0) || (bh.width > GIMP_BRUSH_MAX_SIZE) ||
(bh.height == 0) || (bh.height > GIMP_BRUSH_MAX_SIZE) ||
((bh.bytes != 1) && (bh.bytes != 4)) ||
(G_MAXSIZE / bh.width / bh.height / bh.bytes < 1))
{
return FALSE;
}
if ((bh.magic_number != GBRUSH_MAGIC || bh.version != 2) ||
if ((bh.magic_number != GIMP_BRUSH_MAGIC ||
bh.version != 2) ||
bh.header_size <= sizeof (bh))
{
return FALSE;
......@@ -495,6 +496,14 @@ gih_load_one_brush (GInputStream *input,
if ((size = (bh.header_size - sizeof (bh))) > 0)
{
if (size > GIMP_BRUSH_MAX_NAME)
{
g_set_error (error, G_FILE_ERROR, G_FILE_ERROR_FAILED,
_("Brush name is too long: %lu"),
(gulong) size);
return FALSE;
}
name = g_new0 (gchar, size + 1);
if (! g_input_stream_read_all (input, name, size,
......@@ -526,15 +535,15 @@ gih_load_one_brush (GInputStream *input,
if (bh.bytes == 1)
{
PatternHeader ph;
GimpPatternHeader ph;
/* For backwards-compatibility, check if a pattern follows.
* The obsolete .gpb format did it this way.
*/
if (g_input_stream_read_all (input, &ph, sizeof (PatternHeader),
if (g_input_stream_read_all (input, &ph, sizeof (GimpPatternHeader),
&bytes_read, NULL, error) &&
bytes_read == sizeof (PatternHeader))
bytes_read == sizeof (GimpPatternHeader))
{
/* rearrange the bytes in each unsigned int */
ph.header_size = g_ntohl (ph.header_size);
......@@ -544,16 +553,16 @@ gih_load_one_brush (GInputStream *input,
ph.bytes = g_ntohl (ph.bytes);
ph.magic_number = g_ntohl (ph.magic_number);
if (ph.magic_number == GPATTERN_MAGIC &&
ph.version == 1 &&
ph.header_size > sizeof (PatternHeader) &&
ph.bytes == 3 &&
ph.width == bh.width &&
ph.height == bh.height &&
if (ph.magic_number == GIMP_PATTERN_MAGIC &&
ph.version == 1 &&
ph.header_size > sizeof (GimpPatternHeader) &&
ph.bytes == 3 &&
ph.width == bh.width &&
ph.height == bh.height &&
g_input_stream_skip (input,
ph.header_size - sizeof (PatternHeader),
ph.header_size - sizeof (GimpPatternHeader),
NULL, NULL) ==
ph.header_size - sizeof (PatternHeader))
ph.header_size - sizeof (GimpPatternHeader))
{
guchar *plain_brush = brush_buf;
gint i;
......@@ -580,7 +589,7 @@ gih_load_one_brush (GInputStream *input,
g_free (plain_brush);
}
else if (! g_seekable_seek (G_SEEKABLE (input),
- sizeof (PatternHeader), G_SEEK_CUR,
- sizeof (GimpPatternHeader), G_SEEK_CUR,
NULL, NULL))
{
g_message (_("GIMP brush file appears to be corrupted."));
......@@ -703,7 +712,7 @@ gih_load_image (GFile *file,
g_string_free (buffer, FALSE);
if (!name)
if (! name)
{
g_message ("Couldn't read name for brush pipe from '%s'",
g_file_get_parse_name (file));
......@@ -1193,13 +1202,13 @@ gih_save_one_brush (GOutputStream *output,
const gchar *name,
GError **error)
{
GeglBuffer *buffer;
const Babl *format;
BrushHeader bh;
guchar *data;
GimpImageType drawable_type;
gint bpp;
gint y;
GeglBuffer *buffer;
const Babl *format;
GimpBrushHeader bh;
guchar *data;
GimpImageType drawable_type;
gint bpp;
gint y;
buffer = gimp_drawable_get_buffer (drawable_ID);
......@@ -1232,7 +1241,7 @@ gih_save_one_brush (GOutputStream *output,
bh.width = g_htonl (rect->width);
bh.height = g_htonl (rect->height);
bh.bytes = g_htonl (bpp);
bh.magic_number = g_htonl (GBRUSH_MAGIC);
bh.magic_number = g_htonl (GIMP_BRUSH_MAGIC);
bh.spacing = g_htonl (info.spacing);
if (! g_output_stream_write_all (output, &bh, sizeof (bh),
......
......@@ -318,20 +318,21 @@ static gint32
load_image (GFile *file,
GError **error)
{
GInputStream *input;
PatternHeader ph;
gchar *name;
gchar *temp;
guchar *buf;
gint32 image_ID;
gint32 layer_ID;
GimpParasite *parasite;
GeglBuffer *buffer;
const Babl *file_format;
gint line;
GimpImageBaseType base_type;
GimpImageType image_type;
gsize bytes_read;
GInputStream *input;
GimpPatternHeader ph;
gchar *name;
gchar *temp;
guchar *buf;
gint32 image_ID;
gint32 layer_ID;
GimpParasite *parasite;
GeglBuffer *buffer;
const Babl *file_format;
gint line;
GimpImageBaseType base_type;
GimpImageType image_type;
gsize bytes_read;
gsize size;
gimp_progress_init_printf (_("Opening '%s'"),
g_file_get_parse_name (file));
......@@ -340,9 +341,9 @@ load_image (GFile *file,
if (! input)
return -1;
if (! g_input_stream_read_all (input, &ph, sizeof (PatternHeader),
if (! g_input_stream_read_all (input, &ph, sizeof (GimpPatternHeader),
&bytes_read, NULL, error) ||
bytes_read != sizeof (PatternHeader))
bytes_read != sizeof (GimpPatternHeader))
{
g_object_unref (input);
return -1;
......@@ -356,30 +357,45 @@ load_image (GFile *file,
ph.bytes = g_ntohl (ph.bytes);
ph.magic_number = g_ntohl (ph.magic_number);
if (ph.magic_number != GPATTERN_MAGIC ||
ph.version != 1 ||
ph.header_size <= sizeof (PatternHeader))
if (ph.magic_number != GIMP_PATTERN_MAGIC ||
ph.version != 1 ||
ph.header_size <= sizeof (GimpPatternHeader))
{
g_object_unref (input);
return -1;
}
temp = g_new (gchar, ph.header_size - sizeof (PatternHeader));
if (! g_input_stream_read_all (input,
temp, ph.header_size - sizeof (PatternHeader),
&bytes_read, NULL, error) ||
bytes_read != ph.header_size - sizeof (PatternHeader))
if ((size = (ph.header_size - sizeof (GimpPatternHeader))) > 0)
{
if (size > GIMP_PATTERN_MAX_NAME)
{
g_set_error (error, G_FILE_ERROR, G_FILE_ERROR_FAILED,
_("Invalid header data in '%s': "
"Pattern name is too long: %lu"),
gimp_file_get_utf8_name (file),
(gulong) size);
return -1;
}
temp = g_new0 (gchar, size + 1);
if (! g_input_stream_read_all (input, temp, size,
&bytes_read, NULL, error) ||
bytes_read != size)
{
g_free (temp);
g_object_unref (input);
return -1;
}
name = gimp_any_to_utf8 (temp, size - 1,
_("Invalid UTF-8 string in pattern file '%s'."),
g_file_get_parse_name (file));
g_free (temp);
g_object_unref (input);
return -1;
}
name = gimp_any_to_utf8 (temp, ph.header_size - sizeof (PatternHeader) - 1,
_("Invalid UTF-8 string in pattern file '%s'."),
g_file_get_parse_name (file));
g_free (temp);
if (! name)
name = g_strdup (_("Unnamed"));
/* Now there's just raw data left. */
......@@ -417,15 +433,16 @@ load_image (GFile *file,
}
/* Sanitize input dimensions and guard against overflows. */
if ((ph.width == 0) || (ph.width > GIMP_MAX_IMAGE_SIZE) ||
(ph.height == 0) || (ph.height > GIMP_MAX_IMAGE_SIZE) ||
if ((ph.width == 0) || (ph.width > GIMP_PATTERN_MAX_SIZE) ||
(ph.height == 0) || (ph.height > GIMP_PATTERN_MAX_SIZE) ||
(G_MAXSIZE / ph.width / ph.bytes < 1))
{
g_set_error (error, G_FILE_ERROR, G_FILE_ERROR_FAILED,
_("Invalid header data in '%s': width=%lu, height=%lu, "
"bytes=%lu"), g_file_get_parse_name (file),
(unsigned long int)ph.width, (unsigned long int)ph.height,
(unsigned long int)ph.bytes);
(gulong) ph.width,
(gulong) ph.height,
(gulong) ph.bytes);
g_object_unref (input);
return -1;
}
......@@ -449,7 +466,7 @@ load_image (GFile *file,
buffer = gimp_drawable_get_buffer (layer_ID);
/* this can't overflow because ph.width is <= GIMP_MAX_IMAGE_SIZE */
/* this can't overflow because ph.width is <= GIMP_PATTERN_MAX_SIZE */
buf = g_malloc (ph.width * ph.bytes);
for (line = 0; line < ph.height; line++)
......@@ -495,15 +512,15 @@ save_image (GFile *file,
gint32 drawable_ID,
GError **error)
{
GOutputStream *output;
PatternHeader ph;
GeglBuffer *buffer;
const Babl *file_format;
guchar *buf;
gint width;
gint heigh