- pcx.signature = buffer[0];
- pcx.version = buffer[1];
- pcx.encoding = buffer[2];
- pcx.bits_per_pixel = buffer[3];
- pcx.xmin = buffer[4] + 256 * buffer[5];
- pcx.ymin = buffer[6] + 256 * buffer[7];
- pcx.xmax = buffer[8] + 256 * buffer[9];
- pcx.ymax = buffer[10] + 256 * buffer[11];
- pcx.color_planes = buffer[65];
- pcx.bytes_per_line = buffer[66] + 256 * buffer[67];
- pcx.palette_type = buffer[68] + 256 * buffer[69];
-
- width = pcx.xmax - pcx.xmin + 1;
+ file_length = ftell(file);
+ rewind(file);
+
+ if (file_length < PCX_HEADER_SIZE + PCX_COLORMAP_SIZE)
+ {
+ fclose(file);
+ return NULL;
+ }
+
+ file_buffer = checked_malloc(file_length);
+
+ if (fread(file_buffer, 1, file_length, file) != file_length)
+ {
+ fclose(file);
+ return NULL;
+ }
+
+ fclose(file);
+
+ pcx.signature = file_buffer[0];
+ pcx.version = file_buffer[1];
+ pcx.encoding = file_buffer[2];
+ pcx.bits_per_pixel = file_buffer[3];
+ pcx.xmin = file_buffer[4] + 256 * file_buffer[5];
+ pcx.ymin = file_buffer[6] + 256 * file_buffer[7];
+ pcx.xmax = file_buffer[8] + 256 * file_buffer[9];
+ pcx.ymax = file_buffer[10] + 256 * file_buffer[11];
+ pcx.color_planes = file_buffer[65];
+ pcx.bytes_per_line = file_buffer[66] + 256 * file_buffer[67];
+ pcx.palette_type = file_buffer[68] + 256 * file_buffer[69];
+
+ width = pcx.xmax - pcx.xmin + 1;