Skip to content

Commit f27f902

Browse files
gdegouletkrakjoe
authored andcommitted
Fix #77546 iptcembed broken function
1 parent 362d6ce commit f27f902

File tree

3 files changed

+112
-1
lines changed

3 files changed

+112
-1
lines changed

NEWS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ PHP NEWS
88
. Fixed bug #77498 (Custom extension Segmentation fault when declare static
99
property). (Nikita)
1010
. Fixed bug #77530 (PHP crashes when parsing `(2)::class`). (Ekin)
11+
. Fixed bug #77546 (iptcembed broken function). (gdegoulet)
1112

1213
- Mbstring:
1314
. Fixed bug #77514 (mb_ereg_replace() with trailing backslash adds null byte).

ext/standard/iptc.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -273,7 +273,7 @@ PHP_FUNCTION(iptcembed)
273273
iptcdata_len++; /* make the length even */
274274
}
275275

276-
psheader[ 2 ] = (char) (iptcdata_len+28)>>8;
276+
psheader[ 2 ] = (char) ((iptcdata_len+28)>>8);
277277
psheader[ 3 ] = (iptcdata_len+28)&0xff;
278278

279279
for (inx = 0; inx < 28; inx++) {
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
--TEST--
2+
iptcembed() valid jpg stream
3+
--FILE--
4+
<?php
5+
/*
6+
# source code to generate base64 use behind as $base64_1x1_jpeg
7+
# we don't want to be gd library dependant for this test
8+
$file="1x1.jpg";
9+
$ret=imagejpeg(imagecreatetruecolor(1, 1), $file, 100);
10+
echo md5(file_get_contents($file)).PHP_EOL;
11+
echo base64_encode(file_get_contents($file)).PHP_EOL;
12+
unlink($file);
13+
*/
14+
15+
/*
16+
test description :
17+
1) create local file 1x1 jpeg (without iptc) (use base64 content to create file)
18+
2) generate iptcdata string with function iptc_make_tag describe behind
19+
3) use iptcembed php function with our 1x1 jpeg file and our iptcdata string
20+
4) write local file2 with iptcembed return content
21+
5) various check on file2 to verify that's a valid jpeg file with our tags
22+
*/
23+
24+
25+
#iptc_make_tag function from http://php.net/iptcembed
26+
function iptc_make_tag($rec, $data, $value)
27+
{
28+
$length = strlen($value);
29+
$retval = chr(0x1C) . chr($rec) . chr($data);
30+
if($length < 0x8000) { $retval .= chr($length >> 8) . chr($length & 0xFF); }
31+
else { $retval .= chr(0x80) . chr(0x04) . chr(($length >> 24) & 0xFF) . chr(($length >> 16) & 0xFF) . chr(($length >> 8) & 0xFF) . chr($length & 0xFF); }
32+
return $retval . $value;
33+
}
34+
35+
36+
$file="1x1.jpg";
37+
$file2="1x1_with_iptc_tags.jpg";
38+
$base64_1x1_jpeg="/9j/4AAQSkZJRgABAQEAYABgAAD//gA8Q1JFQVRPUjogZ2QtanBlZyB2MS4wICh1c2luZyBJSkcgSlBFRyB2ODApLCBxdWFsaXR5ID0gMTAwCv/bAEMAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAf/bAEMBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAf/AABEIAAEAAQMBEQACEQEDEQH/xAAfAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgv/xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+fr/xAAfAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgv/xAC1EQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl5ufo6ery8/T19vf4+fr/2gAMAwEAAhEDEQA/AP8AP/oA/9k=";
39+
#write file
40+
$fd=fopen($file,"wb");
41+
if ($fd) { fputs($fd,base64_decode($base64_1x1_jpeg)); fclose($fd); }
42+
else { echo "error cant write $file".PHP_EOL;exit(1); }
43+
#check file md5
44+
$md5=md5_file($file);
45+
if ($md5!="07dd8594450e8c18ab8a79d7cb4573c7") { echo "md5 error".PHP_EOL;exit(1); }
46+
#check jpeg properties
47+
list($width, $height, $type, $attr) = getimagesize($file,$info);
48+
if ($width!=1) { echo "width error".PHP_EOL;exit(1); }
49+
if ($height!=1) { echo "height error".PHP_EOL;exit(1); }
50+
if ($type!=2) { echo "type error".PHP_EOL;exit(1); }
51+
if (!isset($info["APP0"])) { echo "APP0 error".PHP_EOL;exit(1); }
52+
53+
#our iptc tags
54+
$tags=array();
55+
$tags["2#105"]= "Tauren";
56+
$tags["2#120"]= "Tauren with Trunk";
57+
$tags["2#110"]= "Copyright 2004-2016, Blizzard";
58+
$tags["2#025"]= "Tauren, Chaman, Blizzard";
59+
$tags["2#090"]= "Thunder Bluffs";
60+
#feed iptc string for iptcembed
61+
$iptc='';
62+
foreach ($tags as $tag => $string) { $rec=$tag[0]; $tag = substr($tag, 2); $iptc .= iptc_make_tag($rec, $tag, $string); }
63+
#check iptc string md5
64+
if (md5(base64_encode($iptc))!="7056c4b3060f92a4f9e5b7d0caa61859") { echo "iptc md5 error".PHP_EOL;exit(1); }
65+
66+
#use iptcembed to get jpeg stream content with iptc tags
67+
$content = iptcembed($iptc, $file,0);
68+
69+
#write new image with iptc tags
70+
if ($content === false) {echo "iptcembed error".PHP_EOL;exit(1); }
71+
$fd=fopen($file2,"wb");
72+
if ($fd) { fputs($fd,$content); fclose($fd); }
73+
else { echo "error cant write $file2".PHP_EOL;exit(1); }
74+
75+
76+
#check jpeg properties for new image with iptc tags
77+
echo "new generated image with itpc tags : $file2".PHP_EOL;
78+
$ret = getimagesize($file2,$info);
79+
if ($ret===false) { echo "getimagesize error".PHP_EOL;exit(1); }
80+
list($width, $height, $type, $attr) = $ret;
81+
if ($width!=1) { echo "width error".PHP_EOL;exit(1); }
82+
if ($height!=1) { echo "height error".PHP_EOL;exit(1); }
83+
if ($type!=2) { echo "type error".PHP_EOL;exit(1); }
84+
if (!isset($info["APP0"])) { echo "APP0 error".PHP_EOL;exit(1); }
85+
if (!isset($info["APP13"])) { echo "APP13 error".PHP_EOL;exit(1); }
86+
87+
$error=0;
88+
$iptc_data_from_created_image = iptcparse($info['APP13']);
89+
foreach ($tags as $tag => $string) {
90+
#check if tag exists
91+
if (!isset($iptc_data_from_created_image[$tag])) {
92+
echo "error iptc tag $tag not found".PHP_EOL;
93+
$error++;
94+
} else {
95+
#check value
96+
if ($iptc_data_from_created_image[$tag][0]!=$string) {
97+
echo "error tag $tag : bad value ($string != ".$iptc_data_from_created_image[$tag][0].")".PHP_EOL;
98+
$error++;
99+
}
100+
}
101+
}
102+
#clean before exit
103+
@unlink($file);
104+
@unlink($file2);
105+
if ($error==0) { echo "OK".PHP_EOL;exit(0);}
106+
echo "something wrong: $error errors".PHP_EOL;
107+
?>
108+
--EXPECT--
109+
new generated image with itpc tags : 1x1_with_iptc_tags.jpg
110+
OK

0 commit comments

Comments
 (0)