Bug #77546 [NEW]: iptcembed broken function
From: php at degoulet dot net
Operating system: linux
PHP version: 7.3.1
Package: *Graphics related
Bug Type: Bug
Bug description:iptcembed broken function
Description:
------------
iptcembed ( string $iptcdata , string $jpeg_file_name [, int $spool = 0
] ) : mixed
when spool is < 2, this function should return a valid jpeg stream
content.
on php 7.3 branch, sometime the stream is not valid : this bug this to
be related to this commit
https://github.com/php/php-src/commit/4fbff82c1079f2c48c769c94f0d9269be7508a59#diff-98113f2c152c3d95d366989462658a39
ext/standard/iptc.c +278
actual code
psheader[ 2 ] = (char) (iptcdata_len+28)>>8;
patch
psheader[ 2 ] = (char) ((iptcdata_len+28)>>8);
Test script:
---------------
<?php
/*
$file="1x1.jpg";
$ret=imagejpeg(imagecreatetruecolor(1, 1), $file, 100);
echo md5(file_get_contents($file)).PHP_EOL;
echo base64_encode(file_get_contents($file)).PHP_EOL;
unlink($file);
*/
function iptc_make_tag($rec, $data, $value)
{
$length = strlen($value);
$retval = chr(0x1C) . chr($rec) . chr($data);
if($length < 0x8000) { $retval .= chr($length >> 8) . chr($length &
0xFF); }
else { $retval .= chr(0x80) . chr(0x04) . chr(($length >> 24) &
0xFF) . chr(($length >> 16) & 0xFF) . chr(($length >> 8) & 0xFF) .
chr($length & 0xFF); }
return $retval . $value;
}
$file="1x1.jpg";
$file2="1x1_with_iptc_tags.jpg";
$base64_1x1_jpeg="/9j/4AAQSkZJRgABAQEAYABgAAD//gA8Q1JFQVRPUjogZ2QtanBlZyB2MS4wICh1c2luZyBJSkcgSlBFRyB2ODApLCBxdWFsaXR5ID0gMTAwCv/bAEMAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAf/bAEMBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAf/AABEIAAEAAQMBEQACEQEDEQH/xAAfAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgv/xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+fr/xAAfAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgv/xAC1EQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl5ufo6ery8/T19vf4+fr/2gAMAwEAAhEDEQA/AP8AP/oA/9k=";
#write file
$fd=fopen($file,"wb");
if ($fd) { fputs($fd,base64_decode($base64_1x1_jpeg)); fclose($fd); }
#check file md5
$md5=md5_file($file);
if ($md5!="07dd8594450e8c18ab8a79d7cb4573c7") { echo "md5
error".PHP_EOL;exit(1); }
#check jpeg properties
list($width, $height, $type, $attr) = getimagesize($file,$info);
if ($width!=1) { echo "width error".PHP_EOL;exit(1); }
if ($height!=1) { echo "height error".PHP_EOL;exit(1); }
if ($type!=2) { echo "type error".PHP_EOL;exit(1); }
if (!isset($info["APP0"])) { echo "APP0 error".PHP_EOL;exit(1); }
#our iptc tags
$tags=array();
$tags["2#105"]= "Tauren";
$tags["2#120"]= "Tauren with Trunk";
$tags["2#110"]= "Copyright 2004-2016, Blizzard";
$tags["2#025"]= "Tauren, Chaman, Blizzard";
$tags["2#090"]= "Thunder Bluffs";
#feed iptc string for iptcembed
$iptc='';
foreach ($tags as $tag => $string) { $rec=$tag[0]; $tag = substr($tag,
2); $iptc .= iptc_make_tag($rec, $tag, $string); }
#check iptc string md5
if (md5(base64_encode($iptc))!="7056c4b3060f92a4f9e5b7d0caa61859") {
echo "iptc md5 error".PHP_EOL;exit(1); }
#
$content = iptcembed($iptc, $file,0);
if ($content === false) {echo "iptcembed error".PHP_EOL;exit(1); }
$fd=fopen($file2,"wb");
if ($fd) { fputs($fd,$content); fclose($fd); }
#check jpeg properties for new image with iptc tags
echo "new generated image with itpc tags : $file2".PHP_EOL;
$ret = getimagesize($file2,$info);
if ($ret===false) { echo "getimagesize error".PHP_EOL;exit(1); }
list($width, $height, $type, $attr) = $ret;
if ($width!=1) { echo "width error".PHP_EOL;exit(1); }
if ($height!=1) { echo "height error".PHP_EOL;exit(1); }
if ($type!=2) { echo "type error".PHP_EOL;exit(1); }
if (!isset($info["APP0"])) { echo "APP0 error".PHP_EOL;exit(1); }
if (!isset($info["APP13"])) { echo "APP13 error".PHP_EOL;exit(1); }
$error=0;
$iptc_data_from_created_image = iptcparse($info['APP13']);
foreach ($tags as $tag => $string) {
#check if tag exists
if (!isset($iptc_data_from_created_image[$tag])) {
echo "error iptc tag $tag not found".PHP_EOL;
$error++;
} else {
#check value
if ($iptc_data_from_created_image[$tag][0]!=$string) {
echo "error tag $tag : bad value ($string !=
".$iptc_data_from_created_image[$tag][0].")".PHP_EOL;
$error++;
}
}
}
if ($error==0) { echo "OK".PHP_EOL;exit(0);}
echo "something wrong: $error errors".PHP_EOL;
@unlink($file);
@unlink($file2);
?>
Expected result:
----------------
on php 7.2, my debug script returns
new generated image with itpc tags : 1x1_with_iptc_tags.jpg
OK
Actual result:
--------------
on php 7.3, my debug script returns
generated image : 1x1_with_iptc_tags.jpg
getimagesize error
--
Edit bug report at https://bugs.php.net/bug.php?id=77546&edit=1
--
Try a snapshot (PHP 5.4): https://bugs.php.net/fix.php?id=77546&r=trysnapshot54
Try a snapshot (PHP 5.5): https://bugs.php.net/fix.php?id=77546&r=trysnapshot55
Try a snapshot (trunk): https://bugs.php.net/fix.php?id=77546&r=trysnapshottrunk
Fixed in SVN: https://bugs.php.net/fix.php?id=77546&r=fixed
Fixed in release: https://bugs.php.net/fix.php?id=77546&r=alreadyfixed
Need backtrace: https://bugs.php.net/fix.php?id=77546&r=needtrace
Need Reproduce Script: https://bugs.php.net/fix.php?id=77546&r=needscript
Try newer version: https://bugs.php.net/fix.php?id=77546&r=oldversion
Not developer issue: https://bugs.php.net/fix.php?id=77546&r=support
Expected behavior: https://bugs.php.net/fix.php?id=77546&r=notwrong
Not enough info: https://bugs.php.net/fix.php?id=77546&r=notenoughinfo
Submitted twice: https://bugs.php.net/fix.php?id=77546&r=submittedtwice
register_globals: https://bugs.php.net/fix.php?id=77546&r=globals
PHP 4 support discontinued: https://bugs.php.net/fix.php?id=77546&r=php4
Daylight Savings: https://bugs.php.net/fix.php?id=77546&r=dst
IIS Stability: https://bugs.php.net/fix.php?id=77546&r=isapi
Install GNU Sed: https://bugs.php.net/fix.php?id=77546&r=gnused
Floating point limitations: https://bugs.php.net/fix.php?id=77546&r=float
No Zend Extensions: https://bugs.php.net/fix.php?id=77546&r=nozend
MySQL Configuration Error: https://bugs.php.net/fix.php?id=77546&r=mysqlcfg
Thread (7 messages)
- php at degoulet dot net