| OLD | NEW |
| 1 | 1 |
| 2 /* pngpread.c - read a png file in push mode | 2 /* pngpread.c - read a png file in push mode |
| 3 * | 3 * |
| 4 * Last changed in libpng 1.2.44 [June 26, 2010] | 4 * Last changed in libpng 1.2.44 [June 26, 2010] |
| 5 * Copyright (c) 1998-2010 Glenn Randers-Pehrson | 5 * Copyright (c) 1998-2010 Glenn Randers-Pehrson |
| 6 * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) | 6 * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) |
| 7 * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) | 7 * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) |
| 8 * | 8 * |
| 9 * This code is released under the libpng license. | 9 * This code is released under the libpng license. |
| 10 * For conditions of distribution and use, see the disclaimer | 10 * For conditions of distribution and use, see the disclaimer |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 64 png_push_read_chunk(png_ptr, info_ptr); | 64 png_push_read_chunk(png_ptr, info_ptr); |
| 65 break; | 65 break; |
| 66 } | 66 } |
| 67 | 67 |
| 68 case PNG_READ_IDAT_MODE: | 68 case PNG_READ_IDAT_MODE: |
| 69 { | 69 { |
| 70 png_push_read_IDAT(png_ptr); | 70 png_push_read_IDAT(png_ptr); |
| 71 break; | 71 break; |
| 72 } | 72 } |
| 73 | 73 |
| 74 #ifdef PNG_READ_tEXt_SUPPORTED | |
| 75 case PNG_READ_tEXt_MODE: | |
| 76 { | |
| 77 png_push_read_tEXt(png_ptr, info_ptr); | |
| 78 break; | |
| 79 } | |
| 80 | |
| 81 #endif | |
| 82 #ifdef PNG_READ_zTXt_SUPPORTED | |
| 83 case PNG_READ_zTXt_MODE: | |
| 84 { | |
| 85 png_push_read_zTXt(png_ptr, info_ptr); | |
| 86 break; | |
| 87 } | |
| 88 | |
| 89 #endif | |
| 90 #ifdef PNG_READ_iTXt_SUPPORTED | |
| 91 case PNG_READ_iTXt_MODE: | |
| 92 { | |
| 93 png_push_read_iTXt(png_ptr, info_ptr); | |
| 94 break; | |
| 95 } | |
| 96 | |
| 97 #endif | |
| 98 case PNG_SKIP_MODE: | 74 case PNG_SKIP_MODE: |
| 99 { | 75 { |
| 100 png_push_crc_finish(png_ptr); | 76 png_push_crc_finish(png_ptr); |
| 101 break; | 77 break; |
| 102 } | 78 } |
| 103 | 79 |
| 104 default: | 80 default: |
| 105 { | 81 { |
| 106 png_ptr->buffer_size = 0; | 82 png_ptr->buffer_size = 0; |
| 107 break; | 83 break; |
| (...skipping 414 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 522 #endif | 498 #endif |
| 523 #ifdef PNG_READ_tEXt_SUPPORTED | 499 #ifdef PNG_READ_tEXt_SUPPORTED |
| 524 else if (!png_memcmp(png_ptr->chunk_name, png_tEXt, 4)) | 500 else if (!png_memcmp(png_ptr->chunk_name, png_tEXt, 4)) |
| 525 { | 501 { |
| 526 if (png_ptr->push_length + 4 > png_ptr->buffer_size) | 502 if (png_ptr->push_length + 4 > png_ptr->buffer_size) |
| 527 { | 503 { |
| 528 png_push_save_buffer(png_ptr); | 504 png_push_save_buffer(png_ptr); |
| 529 return; | 505 return; |
| 530 } | 506 } |
| 531 | 507 |
| 532 png_push_handle_tEXt(png_ptr, info_ptr, png_ptr->push_length); | 508 png_handle_tEXt(png_ptr, info_ptr, png_ptr->push_length); |
| 533 } | 509 } |
| 534 | 510 |
| 535 #endif | 511 #endif |
| 536 #ifdef PNG_READ_zTXt_SUPPORTED | 512 #ifdef PNG_READ_zTXt_SUPPORTED |
| 537 else if (!png_memcmp(png_ptr->chunk_name, png_zTXt, 4)) | 513 else if (!png_memcmp(png_ptr->chunk_name, png_zTXt, 4)) |
| 538 { | 514 { |
| 539 if (png_ptr->push_length + 4 > png_ptr->buffer_size) | 515 if (png_ptr->push_length + 4 > png_ptr->buffer_size) |
| 540 { | 516 { |
| 541 png_push_save_buffer(png_ptr); | 517 png_push_save_buffer(png_ptr); |
| 542 return; | 518 return; |
| 543 } | 519 } |
| 544 | 520 |
| 545 png_push_handle_zTXt(png_ptr, info_ptr, png_ptr->push_length); | 521 png_handle_zTXt(png_ptr, info_ptr, png_ptr->push_length); |
| 546 } | 522 } |
| 547 | 523 |
| 548 #endif | 524 #endif |
| 549 #ifdef PNG_READ_iTXt_SUPPORTED | 525 #ifdef PNG_READ_iTXt_SUPPORTED |
| 550 else if (!png_memcmp(png_ptr->chunk_name, png_iTXt, 4)) | 526 else if (!png_memcmp(png_ptr->chunk_name, png_iTXt, 4)) |
| 551 { | 527 { |
| 552 if (png_ptr->push_length + 4 > png_ptr->buffer_size) | 528 if (png_ptr->push_length + 4 > png_ptr->buffer_size) |
| 553 { | 529 { |
| 554 png_push_save_buffer(png_ptr); | 530 png_push_save_buffer(png_ptr); |
| 555 return; | 531 return; |
| 556 } | 532 } |
| 557 | 533 |
| 558 png_push_handle_iTXt(png_ptr, info_ptr, png_ptr->push_length); | 534 png_handle_iTXt(png_ptr, info_ptr, png_ptr->push_length); |
| 559 } | 535 } |
| 560 | 536 |
| 561 #endif | 537 #endif |
| 562 else | 538 else |
| 563 { | 539 { |
| 564 if (png_ptr->push_length + 4 > png_ptr->buffer_size) | 540 if (png_ptr->push_length + 4 > png_ptr->buffer_size) |
| 565 { | 541 { |
| 566 png_push_save_buffer(png_ptr); | 542 png_push_save_buffer(png_ptr); |
| 567 return; | 543 return; |
| 568 } | 544 } |
| 569 png_push_handle_unknown(png_ptr, info_ptr, png_ptr->push_length); | 545 png_handle_unknown(png_ptr, info_ptr, png_ptr->push_length); |
| 570 } | 546 } |
| 571 | 547 |
| 572 png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER; | 548 png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER; |
| 573 } | 549 } |
| 574 | 550 |
| 575 void /* PRIVATE */ | 551 void /* PRIVATE */ |
| 576 png_push_crc_skip(png_structp png_ptr, png_uint_32 skip) | 552 png_push_crc_skip(png_structp png_ptr, png_uint_32 skip) |
| 577 { | 553 { |
| 578 png_ptr->process_mode = PNG_SKIP_MODE; | 554 png_ptr->process_mode = PNG_SKIP_MODE; |
| 579 png_ptr->skip_length = skip; | 555 png_ptr->skip_length = skip; |
| (...skipping 614 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1194 png_ptr->num_rows = (png_ptr->height + | 1170 png_ptr->num_rows = (png_ptr->height + |
| 1195 png_pass_yinc[png_ptr->pass] - 1 - | 1171 png_pass_yinc[png_ptr->pass] - 1 - |
| 1196 png_pass_ystart[png_ptr->pass]) / | 1172 png_pass_ystart[png_ptr->pass]) / |
| 1197 png_pass_yinc[png_ptr->pass]; | 1173 png_pass_yinc[png_ptr->pass]; |
| 1198 | 1174 |
| 1199 } while (png_ptr->iwidth == 0 || png_ptr->num_rows == 0); | 1175 } while (png_ptr->iwidth == 0 || png_ptr->num_rows == 0); |
| 1200 } | 1176 } |
| 1201 #endif /* PNG_READ_INTERLACING_SUPPORTED */ | 1177 #endif /* PNG_READ_INTERLACING_SUPPORTED */ |
| 1202 } | 1178 } |
| 1203 | 1179 |
| 1204 #ifdef PNG_READ_tEXt_SUPPORTED | |
| 1205 void /* PRIVATE */ | |
| 1206 png_push_handle_tEXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 | |
| 1207 length) | |
| 1208 { | |
| 1209 if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND)) | |
| 1210 { | |
| 1211 png_error(png_ptr, "Out of place tEXt"); | |
| 1212 info_ptr = info_ptr; /* To quiet some compiler warnings */ | |
| 1213 } | |
| 1214 | |
| 1215 #ifdef PNG_MAX_MALLOC_64K | |
| 1216 png_ptr->skip_length = 0; /* This may not be necessary */ | |
| 1217 | |
| 1218 if (length > (png_uint_32)65535L) /* Can't hold entire string in memory */ | |
| 1219 { | |
| 1220 png_warning(png_ptr, "tEXt chunk too large to fit in memory"); | |
| 1221 png_ptr->skip_length = length - (png_uint_32)65535L; | |
| 1222 length = (png_uint_32)65535L; | |
| 1223 } | |
| 1224 #endif | |
| 1225 | |
| 1226 png_ptr->current_text = (png_charp)png_malloc(png_ptr, | |
| 1227 (png_uint_32)(length + 1)); | |
| 1228 png_ptr->current_text[length] = '\0'; | |
| 1229 png_ptr->current_text_ptr = png_ptr->current_text; | |
| 1230 png_ptr->current_text_size = (png_size_t)length; | |
| 1231 png_ptr->current_text_left = (png_size_t)length; | |
| 1232 png_ptr->process_mode = PNG_READ_tEXt_MODE; | |
| 1233 } | |
| 1234 | |
| 1235 void /* PRIVATE */ | |
| 1236 png_push_read_tEXt(png_structp png_ptr, png_infop info_ptr) | |
| 1237 { | |
| 1238 if (png_ptr->buffer_size && png_ptr->current_text_left) | |
| 1239 { | |
| 1240 png_size_t text_size; | |
| 1241 | |
| 1242 if (png_ptr->buffer_size < png_ptr->current_text_left) | |
| 1243 text_size = png_ptr->buffer_size; | |
| 1244 | |
| 1245 else | |
| 1246 text_size = png_ptr->current_text_left; | |
| 1247 | |
| 1248 png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size); | |
| 1249 png_ptr->current_text_left -= text_size; | |
| 1250 png_ptr->current_text_ptr += text_size; | |
| 1251 } | |
| 1252 if (!(png_ptr->current_text_left)) | |
| 1253 { | |
| 1254 png_textp text_ptr; | |
| 1255 png_charp text; | |
| 1256 png_charp key; | |
| 1257 int ret; | |
| 1258 | |
| 1259 if (png_ptr->buffer_size < 4) | |
| 1260 { | |
| 1261 png_push_save_buffer(png_ptr); | |
| 1262 return; | |
| 1263 } | |
| 1264 | |
| 1265 png_push_crc_finish(png_ptr); | |
| 1266 | |
| 1267 #ifdef PNG_MAX_MALLOC_64K | |
| 1268 if (png_ptr->skip_length) | |
| 1269 return; | |
| 1270 #endif | |
| 1271 | |
| 1272 key = png_ptr->current_text; | |
| 1273 | |
| 1274 for (text = key; *text; text++) | |
| 1275 /* Empty loop */ ; | |
| 1276 | |
| 1277 if (text < key + png_ptr->current_text_size) | |
| 1278 text++; | |
| 1279 | |
| 1280 text_ptr = (png_textp)png_malloc(png_ptr, | |
| 1281 (png_uint_32)png_sizeof(png_text)); | |
| 1282 text_ptr->compression = PNG_TEXT_COMPRESSION_NONE; | |
| 1283 text_ptr->key = key; | |
| 1284 #ifdef PNG_iTXt_SUPPORTED | |
| 1285 text_ptr->lang = NULL; | |
| 1286 text_ptr->lang_key = NULL; | |
| 1287 #endif | |
| 1288 text_ptr->text = text; | |
| 1289 | |
| 1290 ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1); | |
| 1291 | |
| 1292 png_free(png_ptr, key); | |
| 1293 png_free(png_ptr, text_ptr); | |
| 1294 png_ptr->current_text = NULL; | |
| 1295 | |
| 1296 if (ret) | |
| 1297 png_warning(png_ptr, "Insufficient memory to store text chunk."); | |
| 1298 } | |
| 1299 } | |
| 1300 #endif | |
| 1301 | |
| 1302 #ifdef PNG_READ_zTXt_SUPPORTED | |
| 1303 void /* PRIVATE */ | |
| 1304 png_push_handle_zTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 | |
| 1305 length) | |
| 1306 { | |
| 1307 if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND)) | |
| 1308 { | |
| 1309 png_error(png_ptr, "Out of place zTXt"); | |
| 1310 info_ptr = info_ptr; /* To quiet some compiler warnings */ | |
| 1311 } | |
| 1312 | |
| 1313 #ifdef PNG_MAX_MALLOC_64K | |
| 1314 /* We can't handle zTXt chunks > 64K, since we don't have enough space | |
| 1315 * to be able to store the uncompressed data. Actually, the threshold | |
| 1316 * is probably around 32K, but it isn't as definite as 64K is. | |
| 1317 */ | |
| 1318 if (length > (png_uint_32)65535L) | |
| 1319 { | |
| 1320 png_warning(png_ptr, "zTXt chunk too large to fit in memory"); | |
| 1321 png_push_crc_skip(png_ptr, length); | |
| 1322 return; | |
| 1323 } | |
| 1324 #endif | |
| 1325 | |
| 1326 png_ptr->current_text = (png_charp)png_malloc(png_ptr, | |
| 1327 (png_uint_32)(length + 1)); | |
| 1328 png_ptr->current_text[length] = '\0'; | |
| 1329 png_ptr->current_text_ptr = png_ptr->current_text; | |
| 1330 png_ptr->current_text_size = (png_size_t)length; | |
| 1331 png_ptr->current_text_left = (png_size_t)length; | |
| 1332 png_ptr->process_mode = PNG_READ_zTXt_MODE; | |
| 1333 } | |
| 1334 | |
| 1335 void /* PRIVATE */ | |
| 1336 png_push_read_zTXt(png_structp png_ptr, png_infop info_ptr) | |
| 1337 { | |
| 1338 if (png_ptr->buffer_size && png_ptr->current_text_left) | |
| 1339 { | |
| 1340 png_size_t text_size; | |
| 1341 | |
| 1342 if (png_ptr->buffer_size < (png_uint_32)png_ptr->current_text_left) | |
| 1343 text_size = png_ptr->buffer_size; | |
| 1344 | |
| 1345 else | |
| 1346 text_size = png_ptr->current_text_left; | |
| 1347 | |
| 1348 png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size); | |
| 1349 png_ptr->current_text_left -= text_size; | |
| 1350 png_ptr->current_text_ptr += text_size; | |
| 1351 } | |
| 1352 if (!(png_ptr->current_text_left)) | |
| 1353 { | |
| 1354 png_textp text_ptr; | |
| 1355 png_charp text; | |
| 1356 png_charp key; | |
| 1357 int ret; | |
| 1358 png_size_t text_size, key_size; | |
| 1359 | |
| 1360 if (png_ptr->buffer_size < 4) | |
| 1361 { | |
| 1362 png_push_save_buffer(png_ptr); | |
| 1363 return; | |
| 1364 } | |
| 1365 | |
| 1366 png_push_crc_finish(png_ptr); | |
| 1367 | |
| 1368 key = png_ptr->current_text; | |
| 1369 | |
| 1370 for (text = key; *text; text++) | |
| 1371 /* Empty loop */ ; | |
| 1372 | |
| 1373 /* zTXt can't have zero text */ | |
| 1374 if (text >= key + png_ptr->current_text_size) | |
| 1375 { | |
| 1376 png_ptr->current_text = NULL; | |
| 1377 png_free(png_ptr, key); | |
| 1378 return; | |
| 1379 } | |
| 1380 | |
| 1381 text++; | |
| 1382 | |
| 1383 if (*text != PNG_TEXT_COMPRESSION_zTXt) /* Check compression byte */ | |
| 1384 { | |
| 1385 png_ptr->current_text = NULL; | |
| 1386 png_free(png_ptr, key); | |
| 1387 return; | |
| 1388 } | |
| 1389 | |
| 1390 text++; | |
| 1391 | |
| 1392 png_ptr->zstream.next_in = (png_bytep )text; | |
| 1393 png_ptr->zstream.avail_in = (uInt)(png_ptr->current_text_size - | |
| 1394 (text - key)); | |
| 1395 png_ptr->zstream.next_out = png_ptr->zbuf; | |
| 1396 png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; | |
| 1397 | |
| 1398 key_size = text - key; | |
| 1399 text_size = 0; | |
| 1400 text = NULL; | |
| 1401 ret = Z_STREAM_END; | |
| 1402 | |
| 1403 while (png_ptr->zstream.avail_in) | |
| 1404 { | |
| 1405 ret = inflate(&png_ptr->zstream, Z_PARTIAL_FLUSH); | |
| 1406 if (ret != Z_OK && ret != Z_STREAM_END) | |
| 1407 { | |
| 1408 inflateReset(&png_ptr->zstream); | |
| 1409 png_ptr->zstream.avail_in = 0; | |
| 1410 png_ptr->current_text = NULL; | |
| 1411 png_free(png_ptr, key); | |
| 1412 png_free(png_ptr, text); | |
| 1413 return; | |
| 1414 } | |
| 1415 if (!(png_ptr->zstream.avail_out) || ret == Z_STREAM_END) | |
| 1416 { | |
| 1417 if (text == NULL) | |
| 1418 { | |
| 1419 text = (png_charp)png_malloc(png_ptr, | |
| 1420 (png_uint_32)(png_ptr->zbuf_size | |
| 1421 - png_ptr->zstream.avail_out + key_size + 1)); | |
| 1422 | |
| 1423 png_memcpy(text + key_size, png_ptr->zbuf, | |
| 1424 png_ptr->zbuf_size - png_ptr->zstream.avail_out); | |
| 1425 | |
| 1426 png_memcpy(text, key, key_size); | |
| 1427 | |
| 1428 text_size = key_size + png_ptr->zbuf_size - | |
| 1429 png_ptr->zstream.avail_out; | |
| 1430 | |
| 1431 *(text + text_size) = '\0'; | |
| 1432 } | |
| 1433 else | |
| 1434 { | |
| 1435 png_charp tmp; | |
| 1436 | |
| 1437 tmp = text; | |
| 1438 text = (png_charp)png_malloc(png_ptr, text_size + | |
| 1439 (png_uint_32)(png_ptr->zbuf_size | |
| 1440 - png_ptr->zstream.avail_out + 1)); | |
| 1441 | |
| 1442 png_memcpy(text, tmp, text_size); | |
| 1443 png_free(png_ptr, tmp); | |
| 1444 | |
| 1445 png_memcpy(text + text_size, png_ptr->zbuf, | |
| 1446 png_ptr->zbuf_size - png_ptr->zstream.avail_out); | |
| 1447 | |
| 1448 text_size += png_ptr->zbuf_size - png_ptr->zstream.avail_out; | |
| 1449 *(text + text_size) = '\0'; | |
| 1450 } | |
| 1451 if (ret != Z_STREAM_END) | |
| 1452 { | |
| 1453 png_ptr->zstream.next_out = png_ptr->zbuf; | |
| 1454 png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; | |
| 1455 } | |
| 1456 } | |
| 1457 else | |
| 1458 { | |
| 1459 break; | |
| 1460 } | |
| 1461 | |
| 1462 if (ret == Z_STREAM_END) | |
| 1463 break; | |
| 1464 } | |
| 1465 | |
| 1466 inflateReset(&png_ptr->zstream); | |
| 1467 png_ptr->zstream.avail_in = 0; | |
| 1468 | |
| 1469 if (ret != Z_STREAM_END) | |
| 1470 { | |
| 1471 png_ptr->current_text = NULL; | |
| 1472 png_free(png_ptr, key); | |
| 1473 png_free(png_ptr, text); | |
| 1474 return; | |
| 1475 } | |
| 1476 | |
| 1477 png_ptr->current_text = NULL; | |
| 1478 png_free(png_ptr, key); | |
| 1479 key = text; | |
| 1480 text += key_size; | |
| 1481 | |
| 1482 text_ptr = (png_textp)png_malloc(png_ptr, | |
| 1483 (png_uint_32)png_sizeof(png_text)); | |
| 1484 text_ptr->compression = PNG_TEXT_COMPRESSION_zTXt; | |
| 1485 text_ptr->key = key; | |
| 1486 #ifdef PNG_iTXt_SUPPORTED | |
| 1487 text_ptr->lang = NULL; | |
| 1488 text_ptr->lang_key = NULL; | |
| 1489 #endif | |
| 1490 text_ptr->text = text; | |
| 1491 | |
| 1492 ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1); | |
| 1493 | |
| 1494 png_free(png_ptr, key); | |
| 1495 png_free(png_ptr, text_ptr); | |
| 1496 | |
| 1497 if (ret) | |
| 1498 png_warning(png_ptr, "Insufficient memory to store text chunk."); | |
| 1499 } | |
| 1500 } | |
| 1501 #endif | |
| 1502 | |
| 1503 #ifdef PNG_READ_iTXt_SUPPORTED | |
| 1504 void /* PRIVATE */ | |
| 1505 png_push_handle_iTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 | |
| 1506 length) | |
| 1507 { | |
| 1508 if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND)) | |
| 1509 { | |
| 1510 png_error(png_ptr, "Out of place iTXt"); | |
| 1511 info_ptr = info_ptr; /* To quiet some compiler warnings */ | |
| 1512 } | |
| 1513 | |
| 1514 #ifdef PNG_MAX_MALLOC_64K | |
| 1515 png_ptr->skip_length = 0; /* This may not be necessary */ | |
| 1516 | |
| 1517 if (length > (png_uint_32)65535L) /* Can't hold entire string in memory */ | |
| 1518 { | |
| 1519 png_warning(png_ptr, "iTXt chunk too large to fit in memory"); | |
| 1520 png_ptr->skip_length = length - (png_uint_32)65535L; | |
| 1521 length = (png_uint_32)65535L; | |
| 1522 } | |
| 1523 #endif | |
| 1524 | |
| 1525 png_ptr->current_text = (png_charp)png_malloc(png_ptr, | |
| 1526 (png_uint_32)(length + 1)); | |
| 1527 png_ptr->current_text[length] = '\0'; | |
| 1528 png_ptr->current_text_ptr = png_ptr->current_text; | |
| 1529 png_ptr->current_text_size = (png_size_t)length; | |
| 1530 png_ptr->current_text_left = (png_size_t)length; | |
| 1531 png_ptr->process_mode = PNG_READ_iTXt_MODE; | |
| 1532 } | |
| 1533 | |
| 1534 void /* PRIVATE */ | |
| 1535 png_push_read_iTXt(png_structp png_ptr, png_infop info_ptr) | |
| 1536 { | |
| 1537 | |
| 1538 if (png_ptr->buffer_size && png_ptr->current_text_left) | |
| 1539 { | |
| 1540 png_size_t text_size; | |
| 1541 | |
| 1542 if (png_ptr->buffer_size < png_ptr->current_text_left) | |
| 1543 text_size = png_ptr->buffer_size; | |
| 1544 | |
| 1545 else | |
| 1546 text_size = png_ptr->current_text_left; | |
| 1547 | |
| 1548 png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size); | |
| 1549 png_ptr->current_text_left -= text_size; | |
| 1550 png_ptr->current_text_ptr += text_size; | |
| 1551 } | |
| 1552 if (!(png_ptr->current_text_left)) | |
| 1553 { | |
| 1554 png_textp text_ptr; | |
| 1555 png_charp key; | |
| 1556 int comp_flag; | |
| 1557 png_charp lang; | |
| 1558 png_charp lang_key; | |
| 1559 png_charp text; | |
| 1560 int ret; | |
| 1561 | |
| 1562 if (png_ptr->buffer_size < 4) | |
| 1563 { | |
| 1564 png_push_save_buffer(png_ptr); | |
| 1565 return; | |
| 1566 } | |
| 1567 | |
| 1568 png_push_crc_finish(png_ptr); | |
| 1569 | |
| 1570 #ifdef PNG_MAX_MALLOC_64K | |
| 1571 if (png_ptr->skip_length) | |
| 1572 return; | |
| 1573 #endif | |
| 1574 | |
| 1575 key = png_ptr->current_text; | |
| 1576 | |
| 1577 for (lang = key; *lang; lang++) | |
| 1578 /* Empty loop */ ; | |
| 1579 | |
| 1580 if (lang < key + png_ptr->current_text_size - 3) | |
| 1581 lang++; | |
| 1582 | |
| 1583 comp_flag = *lang++; | |
| 1584 lang++; /* Skip comp_type, always zero */ | |
| 1585 | |
| 1586 for (lang_key = lang; *lang_key; lang_key++) | |
| 1587 /* Empty loop */ ; | |
| 1588 | |
| 1589 lang_key++; /* Skip NUL separator */ | |
| 1590 | |
| 1591 text=lang_key; | |
| 1592 | |
| 1593 if (lang_key < key + png_ptr->current_text_size - 1) | |
| 1594 { | |
| 1595 for (; *text; text++) | |
| 1596 /* Empty loop */ ; | |
| 1597 } | |
| 1598 | |
| 1599 if (text < key + png_ptr->current_text_size) | |
| 1600 text++; | |
| 1601 | |
| 1602 text_ptr = (png_textp)png_malloc(png_ptr, | |
| 1603 (png_uint_32)png_sizeof(png_text)); | |
| 1604 | |
| 1605 text_ptr->compression = comp_flag + 2; | |
| 1606 text_ptr->key = key; | |
| 1607 text_ptr->lang = lang; | |
| 1608 text_ptr->lang_key = lang_key; | |
| 1609 text_ptr->text = text; | |
| 1610 text_ptr->text_length = 0; | |
| 1611 text_ptr->itxt_length = png_strlen(text); | |
| 1612 | |
| 1613 ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1); | |
| 1614 | |
| 1615 png_ptr->current_text = NULL; | |
| 1616 | |
| 1617 png_free(png_ptr, text_ptr); | |
| 1618 if (ret) | |
| 1619 png_warning(png_ptr, "Insufficient memory to store iTXt chunk."); | |
| 1620 } | |
| 1621 } | |
| 1622 #endif | |
| 1623 | |
| 1624 /* This function is called when we haven't found a handler for this | |
| 1625 * chunk. If there isn't a problem with the chunk itself (ie a bad chunk | |
| 1626 * name or a critical chunk), the chunk is (currently) silently ignored. | |
| 1627 */ | |
| 1628 void /* PRIVATE */ | |
| 1629 png_push_handle_unknown(png_structp png_ptr, png_infop info_ptr, png_uint_32 | |
| 1630 length) | |
| 1631 { | |
| 1632 png_uint_32 skip = 0; | |
| 1633 | |
| 1634 if (!(png_ptr->chunk_name[0] & 0x20)) | |
| 1635 { | |
| 1636 #ifdef PNG_READ_UNKNOWN_CHUNKS_SUPPORTED | |
| 1637 if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name) != | |
| 1638 PNG_HANDLE_CHUNK_ALWAYS | |
| 1639 #ifdef PNG_READ_USER_CHUNKS_SUPPORTED | |
| 1640 && png_ptr->read_user_chunk_fn == NULL | |
| 1641 #endif | |
| 1642 ) | |
| 1643 #endif | |
| 1644 png_chunk_error(png_ptr, "unknown critical chunk"); | |
| 1645 | |
| 1646 info_ptr = info_ptr; /* To quiet some compiler warnings */ | |
| 1647 } | |
| 1648 | |
| 1649 #ifdef PNG_READ_UNKNOWN_CHUNKS_SUPPORTED | |
| 1650 if (png_ptr->flags & PNG_FLAG_KEEP_UNKNOWN_CHUNKS) | |
| 1651 { | |
| 1652 #ifdef PNG_MAX_MALLOC_64K | |
| 1653 if (length > (png_uint_32)65535L) | |
| 1654 { | |
| 1655 png_warning(png_ptr, "unknown chunk too large to fit in memory"); | |
| 1656 skip = length - (png_uint_32)65535L; | |
| 1657 length = (png_uint_32)65535L; | |
| 1658 } | |
| 1659 #endif | |
| 1660 png_memcpy((png_charp)png_ptr->unknown_chunk.name, | |
| 1661 (png_charp)png_ptr->chunk_name, | |
| 1662 png_sizeof(png_ptr->unknown_chunk.name)); | |
| 1663 png_ptr->unknown_chunk.name[png_sizeof(png_ptr->unknown_chunk.name) - 1] | |
| 1664 = '\0'; | |
| 1665 | |
| 1666 png_ptr->unknown_chunk.size = (png_size_t)length; | |
| 1667 | |
| 1668 if (length == 0) | |
| 1669 png_ptr->unknown_chunk.data = NULL; | |
| 1670 | |
| 1671 else | |
| 1672 { | |
| 1673 png_ptr->unknown_chunk.data = (png_bytep)png_malloc(png_ptr, | |
| 1674 (png_uint_32)length); | |
| 1675 png_crc_read(png_ptr, (png_bytep)png_ptr->unknown_chunk.data, length); | |
| 1676 } | |
| 1677 | |
| 1678 #ifdef PNG_READ_USER_CHUNKS_SUPPORTED | |
| 1679 if (png_ptr->read_user_chunk_fn != NULL) | |
| 1680 { | |
| 1681 /* Callback to user unknown chunk handler */ | |
| 1682 int ret; | |
| 1683 ret = (*(png_ptr->read_user_chunk_fn)) | |
| 1684 (png_ptr, &png_ptr->unknown_chunk); | |
| 1685 | |
| 1686 if (ret < 0) | |
| 1687 png_chunk_error(png_ptr, "error in user chunk"); | |
| 1688 | |
| 1689 if (ret == 0) | |
| 1690 { | |
| 1691 if (!(png_ptr->chunk_name[0] & 0x20)) | |
| 1692 if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name) != | |
| 1693 PNG_HANDLE_CHUNK_ALWAYS) | |
| 1694 png_chunk_error(png_ptr, "unknown critical chunk"); | |
| 1695 png_set_unknown_chunks(png_ptr, info_ptr, | |
| 1696 &png_ptr->unknown_chunk, 1); | |
| 1697 } | |
| 1698 } | |
| 1699 | |
| 1700 else | |
| 1701 #endif | |
| 1702 png_set_unknown_chunks(png_ptr, info_ptr, &png_ptr->unknown_chunk, 1); | |
| 1703 png_free(png_ptr, png_ptr->unknown_chunk.data); | |
| 1704 png_ptr->unknown_chunk.data = NULL; | |
| 1705 } | |
| 1706 | |
| 1707 else | |
| 1708 #endif | |
| 1709 skip=length; | |
| 1710 png_push_crc_skip(png_ptr, skip); | |
| 1711 } | |
| 1712 | |
| 1713 void /* PRIVATE */ | 1180 void /* PRIVATE */ |
| 1714 png_push_have_info(png_structp png_ptr, png_infop info_ptr) | 1181 png_push_have_info(png_structp png_ptr, png_infop info_ptr) |
| 1715 { | 1182 { |
| 1716 if (png_ptr->info_fn != NULL) | 1183 if (png_ptr->info_fn != NULL) |
| 1717 (*(png_ptr->info_fn))(png_ptr, info_ptr); | 1184 (*(png_ptr->info_fn))(png_ptr, info_ptr); |
| 1718 } | 1185 } |
| 1719 | 1186 |
| 1720 void /* PRIVATE */ | 1187 void /* PRIVATE */ |
| 1721 png_push_have_end(png_structp png_ptr, png_infop info_ptr) | 1188 png_push_have_end(png_structp png_ptr, png_infop info_ptr) |
| 1722 { | 1189 { |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1765 | 1232 |
| 1766 png_voidp PNGAPI | 1233 png_voidp PNGAPI |
| 1767 png_get_progressive_ptr(png_structp png_ptr) | 1234 png_get_progressive_ptr(png_structp png_ptr) |
| 1768 { | 1235 { |
| 1769 if (png_ptr == NULL) | 1236 if (png_ptr == NULL) |
| 1770 return (NULL); | 1237 return (NULL); |
| 1771 | 1238 |
| 1772 return png_ptr->io_ptr; | 1239 return png_ptr->io_ptr; |
| 1773 } | 1240 } |
| 1774 #endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ | 1241 #endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ |
| OLD | NEW |