Commit 5ebe8faa authored by Matthias Clasen's avatar Matthias Clasen

Add valid_ras_test and invalid_bmp_1.

	* test-images.h: Add valid_ras_test and invalid_bmp_1.

	* test-loaders.c (main): Add random tests for ras and pnm and an
	invalid bmp which was a crasher until my 2002-03-12 commit.

	* io-pnm.c (gdk_pixbuf__pnm_image_load_increment): Don't unref the
	pixbuf on errors.

	* io-ras.c: Handle some errors.
parent 166894bd
2002-03-13 Matthias Clasen <maclas@gmx.de>
* test-images.h: Add valid_ras_test and invalid_bmp_1.
* test-loaders.c (main): Add random tests for ras and pnm and an
invalid bmp which was a crasher until my 2002-03-12 commit.
* io-pnm.c (gdk_pixbuf__pnm_image_load_increment): Don't unref the
pixbuf on errors.
* io-ras.c: Handle some errors.
2002-03-12 Sven Neumann <sven@gimp.org>
* gdk-pixbuf.c (gdk_pixbuf_fill): use sequential writes instead of
......
......@@ -1013,8 +1013,6 @@ gdk_pixbuf__pnm_image_load_increment (gpointer data,
if (retval == PNM_SUSPEND) {
break;
} else if (retval == PNM_FATAL_ERR) {
if (context->pixbuf)
g_object_unref (context->pixbuf);
return FALSE;
} else if (retval == PNM_OK) {
/* send updated signal */
......
......@@ -138,8 +138,9 @@ static GdkPixbuf *gdk_pixbuf__ras_image_load(FILE * f, GError **error)
return pb;
}
static void RAS2State(struct rasterfile *RAS,
struct ras_progressive_state *State)
static gboolean RAS2State(struct rasterfile *RAS,
struct ras_progressive_state *State,
GError **error)
{
State->Header.width = GUINT32_FROM_BE(RAS->width);
State->Header.height = GUINT32_FROM_BE(RAS->height);
......@@ -148,47 +149,73 @@ static void RAS2State(struct rasterfile *RAS,
State->Header.maptype = GUINT32_FROM_BE(RAS->maptype);
State->Header.maplength = GUINT32_FROM_BE(RAS->maplength);
g_assert(State->Header.maplength <= 768); /* Otherwise, we are in trouble */
if ((gint)State->Header.width <= 0 ||
(gint)State->Header.height <= 0 ||
State->Header.maplength > 768) {
g_set_error (error,
GDK_PIXBUF_ERROR,
GDK_PIXBUF_ERROR_CORRUPT_IMAGE,
_("RAS image has bogus header data"));
return FALSE;
}
State->RasType = State->Header.depth; /* This may be less trivial someday */
State->HeaderSize = 32 + State->Header.maplength;
if (State->RasType == 32)
State->LineWidth = State->Header.width * 4;
if (State->RasType == 24)
else if (State->RasType == 24)
State->LineWidth = State->Header.width * 3;
if (State->RasType == 8)
else if (State->RasType == 8)
State->LineWidth = State->Header.width * 1;
if (State->RasType == 1) {
else if (State->RasType == 1) {
State->LineWidth = State->Header.width / 8;
if ((State->Header.width & 7) != 0)
State->LineWidth++;
}
else {
g_set_error (error,
GDK_PIXBUF_ERROR,
GDK_PIXBUF_ERROR_CORRUPT_IMAGE,
_("RAS image has unknown type"));
return FALSE;
}
/* Now padd the line to be a multiple of 16 bits */
/* Now pad the line to be a multiple of 16 bits */
if ((State->LineWidth & 1) != 0)
State->LineWidth++;
if (State->LineBuf == NULL)
State->LineBuf = g_malloc(State->LineWidth);
if (!State->LineBuf) {
State->LineBuf = g_try_malloc (State->LineWidth);
g_assert(State->LineBuf != NULL);
if (!State->LineBuf) {
g_set_error (error,
GDK_PIXBUF_ERROR,
GDK_PIXBUF_ERROR_INSUFFICIENT_MEMORY,
_("Not enough memory to load RAS image"));
return FALSE;
}
}
if (State->pixbuf == NULL) {
if (!State->pixbuf) {
if (State->RasType == 32)
State->pixbuf = gdk_pixbuf_new(GDK_COLORSPACE_RGB, TRUE,
8,
(gint)
State->Header.width,
(gint)
State->Header.
height);
State->pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, TRUE, 8,
(gint) State->Header.width,
(gint) State->Header.height);
else
State->pixbuf =
gdk_pixbuf_new(GDK_COLORSPACE_RGB, FALSE, 8,
(gint) State->Header.width,
(gint) State->Header.height);
State->pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, FALSE, 8,
(gint) State->Header.width,
(gint) State->Header.height);
if (!State->pixbuf) {
g_set_error (error,
GDK_PIXBUF_ERROR,
GDK_PIXBUF_ERROR_INSUFFICIENT_MEMORY,
_("Not enough memory to load RAS image"));
return FALSE;
}
if (State->prepared_func != NULL)
/* Notify the client that we are ready to go */
(*State->prepared_func) (State->pixbuf,
......@@ -197,7 +224,7 @@ static void RAS2State(struct rasterfile *RAS,
}
if ((State->Header.maplength==0)&&(State->RasType==1)) {
if ((State->Header.maplength == 0) && (State->RasType == 1)) {
State->HeaderBuf[32] = 255;
State->HeaderBuf[33] = 0;
State->HeaderBuf[34] = 255;
......@@ -206,6 +233,7 @@ static void RAS2State(struct rasterfile *RAS,
State->HeaderBuf[37] = 0;
}
return TRUE;
}
/*
......@@ -362,6 +390,9 @@ static void OneLine1(struct ras_progressive_state *context)
static void OneLine(struct ras_progressive_state *context)
{
context->LineDone = 0;
if (context->Lines >= context->Header.height)
return;
if (context->RasType == 32)
OneLine32(context);
if (context->RasType == 24)
......@@ -372,8 +403,6 @@ static void OneLine(struct ras_progressive_state *context)
OneLine1(context);
context->LineDone = 0;
if (context->Lines > context->Header.height)
return;
context->Lines++;
if (context->updated_func != NULL) {
......@@ -392,7 +421,7 @@ static void OneLine(struct ras_progressive_state *context)
* buf - new image data
* size - length of new image data
*
* append image data onto inrecrementally built output image
* append image data onto incrementally built output image
*/
static gboolean
gdk_pixbuf__ras_image_load_increment(gpointer data,
......@@ -443,8 +472,10 @@ gdk_pixbuf__ras_image_load_increment(gpointer data,
}
if (context->HeaderDone >= 32)
RAS2State((struct rasterfile *) context->HeaderBuf,
context);
if (!RAS2State((struct rasterfile *) context->HeaderBuf,
context, error)) {
return FALSE;
}
}
......@@ -460,3 +491,4 @@ gdk_pixbuf__ras_fill_vtable (GdkPixbufModule *module)
module->stop_load = gdk_pixbuf__ras_image_stop_load;
module->load_increment = gdk_pixbuf__ras_image_load_increment;
}
This diff is collapsed.
......@@ -358,10 +358,6 @@ main (int argc, char **argv)
{
int seed;
/* Set a malloc which emulates low mem */
max_allocation = G_MAXINT;
g_mem_set_vtable (&limited_table);
if (argc > 1)
seed = atoi (argv[1]);
else
......@@ -370,6 +366,10 @@ main (int argc, char **argv)
write_seed (seed);
}
g_random_set_seed (seed);
/* Set a malloc which emulates low mem */
max_allocation = G_MAXINT;
g_mem_set_vtable (&limited_table);
g_type_init ();
g_log_set_always_fatal (G_LOG_LEVEL_WARNING | G_LOG_LEVEL_ERROR | G_LOG_LEVEL_CRITICAL);
......@@ -411,7 +411,7 @@ main (int argc, char **argv)
TEST (tiff1_test_1, FALSE);
TEST (tiff1_test_2, FALSE);
#if 0
TEST (tiff1_test_3, FALSE); /* Segfault in TIFFReadDirectory with libtiff 3.5.5, fixed in 3.5.7 */
TEST (tiff1_test_3, FALSE); /* Segfault in TIFFReadDirectory */
#endif
TEST (valid_tga_test, TRUE);
......@@ -421,7 +421,11 @@ main (int argc, char **argv)
TEST (wbmp_test_1, FALSE);
TEST (wbmp_test_2, FALSE);
TEST (invalid_bmp_1, FALSE);
TEST (valid_ras_test, TRUE);
TEST_RANDOM (GIF_HEADER, 150, FALSE);
TEST_RANDOM (PNG_HEADER, 1100, FALSE);
TEST_RANDOM (JPEG_HEADER, 800, FALSE);
......@@ -435,8 +439,9 @@ main (int argc, char **argv)
TEST_RANDOM (BMP_HEADER, 150, FALSE);
#define XPM_HEADER '/', '*', ' ', 'X', 'P', 'M', ' ', '*', '/'
TEST_RANDOM (XPM_HEADER, 150, FALSE);
#define RAS_HEADER 0x59, 0xA6, 0x6A, 0x95
TEST_RANDOM (RAS_HEADER, 300, FALSE);
TEST_RANDOMLY_MODIFIED (valid_tiff1_test, FALSE);
TEST_RANDOMLY_MODIFIED (valid_gif_test, FALSE);
TEST_RANDOMLY_MODIFIED (valid_png_test, FALSE);
......@@ -445,8 +450,9 @@ main (int argc, char **argv)
TEST_RANDOMLY_MODIFIED (valid_ico_test, FALSE);
TEST_RANDOMLY_MODIFIED (valid_bmp_test, FALSE);
TEST_RANDOMLY_MODIFIED (valid_xpm_test, FALSE);
TEST_RANDOMLY_MODIFIED (valid_ras_test, FALSE);
TEST_RANDOMLY_MODIFIED (valid_ppm_4, FALSE);
/* memory tests */
/* How do the loaders behave when memory is low?
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment