Skip to content

Commit 1304707

Browse files
committed
Start error checking / polish efforts
1 parent 1f99dfa commit 1304707

File tree

1 file changed

+33
-8
lines changed

1 file changed

+33
-8
lines changed

src/IMG_png.c

Lines changed: 33 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ static struct {
117117
#endif
118118
int (*png_image_begin_read_from_memory) (png_imagep image, png_const_voidp memory, size_t size);
119119
int (*png_image_finish_read) (png_imagep image, png_const_colorp background, void *buffer, png_int_32 row_stride, void *colormap);
120+
void (*png_image_free) (png_imagep image);
120121
#if SDL_IMAGE_SAVE_PNG
121122
png_structp (*png_create_write_struct) (png_const_charp user_png_ver, png_voidp error_ptr, png_error_ptr error_fn, png_error_ptr warn_fn);
122123
void (*png_destroy_write_struct) (png_structpp png_ptr_ptr, png_infopp info_ptr_ptr);
@@ -174,6 +175,7 @@ int IMG_InitPNG()
174175
#endif
175176
FUNCTION_LOADER(png_image_begin_read_from_memory, int (*) (png_imagep image, png_const_voidp memory, size_t size))
176177
FUNCTION_LOADER(png_image_finish_read, int (*) (png_imagep image, png_const_colorp background, void *buffer, png_int_32 row_stride, void *colormap))
178+
FUNCTION_LOADER(png_image_free, void (*) (png_imagep image))
177179
#if SDL_IMAGE_SAVE_PNG
178180
FUNCTION_LOADER(png_create_write_struct, png_structp (*) (png_const_charp user_png_ver, png_voidp error_ptr, png_error_ptr error_fn, png_error_ptr warn_fn))
179181
FUNCTION_LOADER(png_destroy_write_struct, void (*) (png_structpp png_ptr_ptr, png_infopp info_ptr_ptr))
@@ -237,25 +239,48 @@ SDL_Surface *IMG_LoadPNG_RW(SDL_RWops *src) {
237239
void* colormap = NULL;
238240
Uint32 pixelformat;
239241

240-
if ( (IMG_Init(IMG_INIT_PNG) & IMG_INIT_PNG) == 0 ) {
241-
return NULL;
242-
}
243-
244242
/* This function uses libpng's "Simplified API" to read a PNG.
245243
* See https://github.com/pnggroup/libpng/blob/libpng16/libpng-manual.txt
246244
* And https://github.com/pnggroup/libpng/blob/libpng16/contrib/examples/pngtopng.c
247245
* For information about this and example usage, respectively. */
248246

247+
if ( !src ) {
248+
/* The error message has been set in SDL_RWFromFile */
249+
return NULL;
250+
}
251+
start = SDL_RWtell(src);
252+
if (start < 0) {
253+
return NULL; /*SDL error already set*/
254+
}
255+
256+
if ( (IMG_Init(IMG_INIT_PNG) & IMG_INIT_PNG) == 0 ) {
257+
return NULL;
258+
}
259+
249260
/* Only the image structure version number needs to be set. */
250261
SDL_memset(&image, 0, sizeof(image));
251262
image.version = PNG_IMAGE_VERSION;
252263

253-
src_length = SDL_RWsize(src); //todo error check
264+
src_length = SDL_RWsize(src);
265+
if (src_length < 0) {
266+
return NULL; /*SDL error already set*/
267+
}
268+
if (src_length == 0) {
269+
SDL_SetError("Cannot load PNG from length-0 RWops.");
270+
return NULL;
271+
}
254272

255-
printf("src_length=%i\n", src_length);
273+
/* Rewind to beginning of buffer to read entire thing. */
274+
if (SDL_RWseek(src, RW_SEEK_SET, 0) < 0) {
275+
return NULL; /*SDL error already set*/
276+
}
256277

257-
raw_image_buffer = SDL_malloc(src_length); // ec
258-
SDL_RWseek(src, RW_SEEK_SET, 0); // ec
278+
raw_image_buffer = SDL_malloc(src_length);
279+
if (raw_image_buffer == NULL) {
280+
SDL_OutOfMemory();
281+
return NULL;
282+
}
283+
259284
int objects_read = SDL_RWread(src, raw_image_buffer, 1, src_length); // ec
260285

261286
printf("objects_read=%i\n", objects_read);

0 commit comments

Comments
 (0)