mirror of
				https://github.com/michaelrsweet/pdfio.git
				synced 2025-10-31 18:35:45 +01:00 
			
		
		
		
	Fix some compressed stream bugs.
This commit is contained in:
		| @@ -80,6 +80,8 @@ _pdfioFileError(pdfio_file_t *pdf,	// I - PDF file | |||||||
|   vsnprintf(buffer, sizeof(buffer), format, ap); |   vsnprintf(buffer, sizeof(buffer), format, ap); | ||||||
|   va_end(ap); |   va_end(ap); | ||||||
|  |  | ||||||
|  |   PDFIO_DEBUG("_pdfioFileError: %s\n", buffer); | ||||||
|  |  | ||||||
|   return ((pdf->error_cb)(pdf, buffer, pdf->error_data)); |   return ((pdf->error_cb)(pdf, buffer, pdf->error_data)); | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										24
									
								
								pdfio-file.c
									
									
									
									
									
								
							
							
						
						
									
										24
									
								
								pdfio-file.c
									
									
									
									
									
								
							| @@ -1154,11 +1154,15 @@ load_xref(pdfio_file_t *pdf,		// I - PDF file | |||||||
|       return (false); |       return (false); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     do | ||||||
|  |     { | ||||||
|       if (!_pdfioFileGets(pdf, line, sizeof(line))) |       if (!_pdfioFileGets(pdf, line, sizeof(line))) | ||||||
|       { |       { | ||||||
| 	_pdfioFileError(pdf, "Unable to read start of xref table."); | 	_pdfioFileError(pdf, "Unable to read start of xref table."); | ||||||
| 	return (false); | 	return (false); | ||||||
|       } |       } | ||||||
|  |     } | ||||||
|  |     while (!line[0]); | ||||||
|  |  | ||||||
|     PDFIO_DEBUG("load_xref: xref_offset=%lu, line='%s'\n", (unsigned long)xref_offset, line); |     PDFIO_DEBUG("load_xref: xref_offset=%lu, line='%s'\n", (unsigned long)xref_offset, line); | ||||||
|  |  | ||||||
| @@ -1169,7 +1173,8 @@ load_xref(pdfio_file_t *pdf,		// I - PDF file | |||||||
|       size_t		i;		// Looping var |       size_t		i;		// Looping var | ||||||
|       pdfio_array_t	*index_array;	// Index array |       pdfio_array_t	*index_array;	// Index array | ||||||
|       size_t		index_n,	// Current element in array |       size_t		index_n,	// Current element in array | ||||||
| 			index_count;	// Number of values in index array | 			index_count,	// Number of values in index array | ||||||
|  | 			count;		// Number of objects in current pairing | ||||||
|       pdfio_array_t	*w_array;	// W array |       pdfio_array_t	*w_array;	// W array | ||||||
|       size_t		w[3];		// Size of each cross-reference field |       size_t		w[3];		// Size of each cross-reference field | ||||||
|       size_t		w_2,		// Offset to second field |       size_t		w_2,		// Offset to second field | ||||||
| @@ -1265,12 +1270,23 @@ load_xref(pdfio_file_t *pdf,		// I - PDF file | |||||||
| 	return (false); | 	return (false); | ||||||
|       } |       } | ||||||
|  |  | ||||||
|       for (index_n = 0; index_n < index_count; index_n ++) |       for (index_n = 0; index_n < index_count; index_n += 2) | ||||||
|  |       { | ||||||
|  |         if (index_count == 1) | ||||||
|  |         { | ||||||
|  |           number = 0; | ||||||
|  |           count  = 999999999; | ||||||
|  | 	} | ||||||
|  | 	else | ||||||
| 	{ | 	{ | ||||||
|           number = (intmax_t)pdfioArrayGetNumber(index_array, index_n); |           number = (intmax_t)pdfioArrayGetNumber(index_array, index_n); | ||||||
|  |           count  = (size_t)pdfioArrayGetNumber(index_array, index_n + 1); | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	while (pdfioStreamRead(st, buffer, w_total) > 0) | 	while (count > 0 && pdfioStreamRead(st, buffer, w_total) > 0) | ||||||
| 	{ | 	{ | ||||||
|  | 	  count --; | ||||||
|  |  | ||||||
| 	  PDFIO_DEBUG("load_xref: number=%u %02X%02X%02X%02X%02X\n", (unsigned)number, buffer[0], buffer[1], buffer[2], buffer[3], buffer[4]); | 	  PDFIO_DEBUG("load_xref: number=%u %02X%02X%02X%02X%02X\n", (unsigned)number, buffer[0], buffer[1], buffer[2], buffer[3], buffer[4]); | ||||||
|  |  | ||||||
| 	  // Check whether this is an object definition... | 	  // Check whether this is an object definition... | ||||||
| @@ -1371,6 +1387,8 @@ load_xref(pdfio_file_t *pdf,		// I - PDF file | |||||||
|       { |       { | ||||||
| 	if (!strcmp(line, "trailer")) | 	if (!strcmp(line, "trailer")) | ||||||
| 	  break; | 	  break; | ||||||
|  | 	else if (!line[0]) | ||||||
|  | 	  continue; | ||||||
|  |  | ||||||
| 	if (sscanf(line, "%jd%jd", &number, &num_objects) != 2) | 	if (sscanf(line, "%jd%jd", &number, &num_objects) != 2) | ||||||
| 	{ | 	{ | ||||||
|   | |||||||
| @@ -385,6 +385,7 @@ _pdfioStreamOpen(pdfio_obj_t *obj,	// I - Object | |||||||
|       int predictor = (int)pdfioDictGetNumber(params, "Predictor"); |       int predictor = (int)pdfioDictGetNumber(params, "Predictor"); | ||||||
| 					// Predictory value, if any | 					// Predictory value, if any | ||||||
|       int status;			// ZLIB status |       int status;			// ZLIB status | ||||||
|  |       ssize_t rbytes;			// Bytes read | ||||||
|  |  | ||||||
|       PDFIO_DEBUG("_pdfioStreamOpen: FlateDecode - BitsPerComponent=%d, Colors=%d, Columns=%d, Predictor=%d\n", bpc, colors, columns, predictor); |       PDFIO_DEBUG("_pdfioStreamOpen: FlateDecode - BitsPerComponent=%d, Colors=%d, Columns=%d, Predictor=%d\n", bpc, colors, columns, predictor); | ||||||
|  |  | ||||||
| @@ -450,8 +451,28 @@ _pdfioStreamOpen(pdfio_obj_t *obj,	// I - Object | |||||||
|       else |       else | ||||||
|         st->predictor = _PDFIO_PREDICTOR_NONE; |         st->predictor = _PDFIO_PREDICTOR_NONE; | ||||||
|  |  | ||||||
|  |       if (sizeof(st->cbuffer) > st->remaining) | ||||||
|  | 	rbytes = _pdfioFileRead(st->pdf, st->cbuffer, st->remaining); | ||||||
|  |       else | ||||||
|  | 	rbytes = _pdfioFileRead(st->pdf, st->cbuffer, sizeof(st->cbuffer)); | ||||||
|  |  | ||||||
|  |       if (rbytes <= 0) | ||||||
|  |       { | ||||||
|  | 	_pdfioFileError(st->pdf, "Unable to read bytes for stream."); | ||||||
|  | 	free(st->prbuffer); | ||||||
|  | 	free(st->psbuffer); | ||||||
|  | 	free(st); | ||||||
|  | 	return (NULL); | ||||||
|  |       } | ||||||
|  |  | ||||||
|       st->flate.next_in  = (Bytef *)st->cbuffer; |       st->flate.next_in  = (Bytef *)st->cbuffer; | ||||||
|       st->flate.avail_in = (uInt)_pdfioFileRead(st->pdf, st->cbuffer, sizeof(st->cbuffer)); |       st->flate.avail_in = (uInt)rbytes; | ||||||
|  |  | ||||||
|  |       if (st->cbuffer[0] == 0x0a) | ||||||
|  |       { | ||||||
|  |         st->flate.next_in ++;		// Skip newline | ||||||
|  |         st->flate.avail_in --; | ||||||
|  |       } | ||||||
|  |  | ||||||
|       PDFIO_DEBUG("_pdfioStreamOpen: avail_in=%u, cbuffer=<%02X%02X%02X%02X%02X%02X%02X%02X...>\n", st->flate.avail_in, st->cbuffer[0], st->cbuffer[1], st->cbuffer[2], st->cbuffer[3], st->cbuffer[4], st->cbuffer[5], st->cbuffer[6], st->cbuffer[7]); |       PDFIO_DEBUG("_pdfioStreamOpen: avail_in=%u, cbuffer=<%02X%02X%02X%02X%02X%02X%02X%02X...>\n", st->flate.avail_in, st->cbuffer[0], st->cbuffer[1], st->cbuffer[2], st->cbuffer[3], st->cbuffer[4], st->cbuffer[5], st->cbuffer[6], st->cbuffer[7]); | ||||||
|  |  | ||||||
| @@ -989,7 +1010,11 @@ stream_read(pdfio_stream_t *st,		// I - Stream | |||||||
|       } |       } | ||||||
|  |  | ||||||
|       if (st->flate.avail_out > 0) |       if (st->flate.avail_out > 0) | ||||||
|         return (-1);			// Early end of stream |       { | ||||||
|  | 	// Early end of stream | ||||||
|  |         PDFIO_DEBUG("stream_read: Early EOF (remaining=%u, avail_in=%d, avail_out=%d, data_type=%d, next_in=<%02X%02X%02X%02X...>).\n", (unsigned)st->remaining, st->flate.avail_in, st->flate.avail_out, st->flate.data_type, st->flate.next_in[0], st->flate.next_in[1], st->flate.next_in[2], st->flate.next_in[3]); | ||||||
|  |         return (-1); | ||||||
|  |       } | ||||||
|  |  | ||||||
|       // Apply predictor for this line |       // Apply predictor for this line | ||||||
|       PDFIO_DEBUG("stream_read: Line %02X %02X %02X %02X %02X.\n", sptr[-1], sptr[0], sptr[0], sptr[2], sptr[3]); |       PDFIO_DEBUG("stream_read: Line %02X %02X %02X %02X %02X.\n", sptr[-1], sptr[0], sptr[0], sptr[2], sptr[3]); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user