Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(460)

Side by Side Diff: third_party/libpng/pngpread.c

Issue 1372313004: Update to libpng 1.2.52 (rollup change only) (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « third_party/libpng/pngget.c ('k') | third_party/libpng/pngread.c » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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 */
OLDNEW
« no previous file with comments | « third_party/libpng/pngget.c ('k') | third_party/libpng/pngread.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698