X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fpcx.c;h=a5fd0c92819bef9931867f43d0eda76f744886b6;hb=5d50a7e10873581345ee63a5afafd43dbd45809b;hp=514d30de6041f7683a86e96cffed79e474767357;hpb=182260bf970d56e056a8c0c580ad61302d21ab0f;p=rocksndiamonds.git diff --git a/src/pcx.c b/src/pcx.c index 514d30de..a5fd0c92 100644 --- a/src/pcx.c +++ b/src/pcx.c @@ -45,6 +45,9 @@ struct PCX_Header unsigned char filler[58]; /* fill to struct size of 128 */ }; +/* global PCX error value */ +int errno_pcx = PCX_Success; + static byte *PCX_ReadBitmap(Image *image, byte *buffer_ptr, byte *buffer_last) { /* Run Length Encoding: If the two high bits are set, @@ -127,21 +130,29 @@ Image *Read_PCX_to_Image(char *filename) int width, height, depth; int i; + errno_pcx = PCX_Success; + if (!(file = fopen(filename, "r"))) + { + errno_pcx = PCX_OpenFailed; return NULL; + } if (fseek(file, 0, SEEK_END) == -1) { fclose(file); + errno_pcx = PCX_ReadFailed; return NULL; } file_length = ftell(file); rewind(file); - if (file_length < PCX_HEADER_SIZE + PCX_COLORMAP_SIZE) + if (file_length < PCX_HEADER_SIZE) { + /* PCX file is too short to contain a valid PCX header */ fclose(file); + errno_pcx = PCX_FileInvalid; return NULL; } @@ -150,6 +161,7 @@ Image *Read_PCX_to_Image(char *filename) if (fread(file_buffer, 1, file_length, file) != file_length) { fclose(file); + errno_pcx = PCX_ReadFailed; return NULL; } @@ -176,6 +188,7 @@ Image *Read_PCX_to_Image(char *filename) width < 0 || height < 0) { free(file_buffer); + errno_pcx = PCX_FileInvalid; return NULL; } @@ -185,6 +198,7 @@ Image *Read_PCX_to_Image(char *filename) filename, pcx.xmax, pcx.ymax, pcx.color_planes); printf("depth: %d\n", pcx.bits_per_pixel); + printf("color_planes: %d\n", pcx.color_planes); printf("bytes_per_line: %d\n", pcx.bytes_per_line); printf("palette type: %s\n", (pcx.palette_type == 1 ? "color" : @@ -202,6 +216,15 @@ Image *Read_PCX_to_Image(char *filename) { free(file_buffer); freeImage(image); + errno_pcx = PCX_FileInvalid; + return NULL; + } + + if (file_length < PCX_HEADER_SIZE + PCX_COLORMAP_SIZE) + { + /* PCX file is too short to contain a valid 256 colors colormap */ + fclose(file); + errno_pcx = PCX_ColorFailed; return NULL; } @@ -210,6 +233,7 @@ Image *Read_PCX_to_Image(char *filename) { free(file_buffer); freeImage(image); + errno_pcx = PCX_ColorFailed; return NULL; }