#45437 [Fbk]: Calls to imagettftext crash

From: Date: Sun, 06 Jul 2008 22:45:56 +0000
Subject: #45437 [Fbk]: Calls to imagettftext crash
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-126327@lists.php.net to get a copy of this message
ID: 45437 Updated by: pajoye@php.net Reported By: ms at mac-specialist dot com Status: Feedback Bug Type: GD related Operating System: OS X 10.5.3 PHP Version: 5.2.6 Assigned To: pajoye New Comment: We need a small script. It should only contains the image creation, draw some text and save the image, without using any GET/POST/SESSION or whatever else but the ttf file. Something like a 5 lines scripts. Previous Comments: ------------------------------------------------------------------------ [2008-07-06 22:03:13] ms at mac-specialist dot com This includes the three files (which I have renamed to make them easier to distinguish), as well as the browser output source : ( 1 ) Main File : random_image_sample.php ( 2 ) Include File : inc_random_image_one.php ( a ) 'inc_random_image_one.php' requires "images/noise.jpg", which can be downloaded from http://www.reconn.us/images/noise.png ( b ) 'inc_random_image_one.php' requires that you copy 10 different named fonts from /Library/Fonts/ to ./fonts/ and rename them from "1.ttf" to "10.ttf" ( 3 ) Include File : inc_random_image_two.php ( a ) This is example ( 1 ) found on http://us.php.net/imagettftext <?php session_start(); // <!-- [4325] ( BEGIN ) random_image_sample.php --> ?> <HTML> <HEAD> <TITLE>Random image sample</TITLE> <META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; charset=iso- 8859-1\"> </HEAD> <BODY> <?php if(isset($_POST['Submit'])) { $number = $_POST['number']; if(md5($number) != $_SESSION['image_value']) echo '<h1>Validation string not valid! Please try again!</h1>'; else { echo '<h1>Your string is valid!</h1>'; // do something with the data } } ?> <form name="form1" method="post" action="random_sample.php"> <table cellspacing="0" width="600" align="center"> <tr><td valign="top" align="right">Comments</td> <td><input name="message" size=40 value="...your message here"> </td></tr> <tr><td colspan=2 align="center"> <font size="1" face="Geneva, Arial, Helvetica, sans- serif"><strong><font size="2"> Please enter the string shown in the image in the form.<br> The possible characters are letters from A to Z in capitalized form and the numbers from 0 to 9. </font></td></tr> <tr><td align="center" colspan=2><input name="number" type="text" id=\"number\"></td></tr> <tr><td colspan=2 align="center"> <?php $which_image = 2 ; echo ($which_image == 1) ? '<img src="inc_random_image_one.php">' : '<img src="inc_random_image_two.php">' ; ?> </td></tr> <tr><td colspan=2 align="center"><input name="Submit" type="submit" value="Submit"></td></tr> </table> </form> </BODY> </HTML> <!-- [4325] ( _END_ ) random_image_sample.php --> <?php // <!-- [4326] ( BEGIN ) inc_random_image_one.php --> // This demo requires "images/noise.jpg", which can be downloaded from http://www.reconn.us/images/noise.png // start a session session_start(); // this function is called recursivelly function random_string($len=5, $str='') { for($i=1; $i<=$len; $i++) { // Generates a random number that will be the ASCII code of the character. // We only want numbers (ascii code from 48 to 57) and caps letters. $ord=rand(48, 90); if((($ord >= 48) && ($ord <= 57)) || (($ord >= 65) && ($ord <= 90))) $str.=chr($ord); // If the number is not good we generate another one else $str.=random_string(1); } return $str; } // create the random string using the upper function (if you want more than 5 characters just modify the parameter) $rand_str=random_string(5); // We memorize the md5 sum of the string into a session variable $_SESSION['image_value'] = md5($rand_str); // Get each letter in one valiable, we will format all letters different $letter1=substr($rand_str,0,1); $letter2=substr($rand_str,1,1); $letter3=substr($rand_str,2,1); $letter4=substr($rand_str,3,1); $letter5=substr($rand_str,4,1); // Creates an image from a png file. If you want to use gif or jpg images, just use the coresponding functions: imagecreatefromjpeg and imagecreatefromgif. // You can download "noise.png" at http://www.reconn.us/images/noise.png $image=imagecreatefrompng("images/noise.png"); // $image=imagecreatefromjpeg("images/noise.jpg"); // Get a random angle for each letter to be rotated with. $angle1 = rand(-20, 20); $angle2 = rand(-20, 20); $angle3 = rand(-20, 20); $angle4 = rand(-20, 20); $angle5 = rand(-20, 20); // Get a random font. (In this examples, the fonts are located in "fonts" directory and named from 1.ttf to 10.ttf) // The easiest thing here is to copy 10 different named fonts from /Library/Fonts/ to ./fonts/ and rename them $font1 = "fonts/".rand(1, 10).".ttf"; $font2 = "fonts/".rand(1, 10).".ttf"; $font3 = "fonts/".rand(1, 10).".ttf"; $font4 = "fonts/".rand(1, 10).".ttf"; $font5 = "fonts/".rand(1, 10).".ttf"; // Define a table with colors (the values are the RGB components for each color). $colors[0]=array(122,229,112); $colors[1]=array(85,178,85); $colors[2]=array(226,108,97); $colors[3]=array(141,214,210); $colors[4]=array(214,141,205); $colors[5]=array(100,138,204); // Get a random color for each letter. $color1=rand(0, 5); $color2=rand(0, 5); $color3=rand(0, 5); $color4=rand(0, 5); $color5=rand(0, 5); // Allocate colors for letters. $textColor1 = imagecolorallocate ($image, $colors[$color1][0],$colors[$color1][1], $colors[$color1][2]); $textColor2 = imagecolorallocate ($image, $colors[$color2][0],$colors[$color2][1], $colors[$color2][2]); $textColor3 = imagecolorallocate ($image, $colors[$color3][0],$colors[$color3][1], $colors[$color3][2]); $textColor4 = imagecolorallocate ($image, $colors[$color4][0],$colors[$color4][1], $colors[$color4][2]); $textColor4 = imagecolorallocate ($image, $colors[$color5][0],$colors[$color5][1], $colors[$color5][2]); // Write text to the image using TrueType fonts. $size = 20; imagettftext($image, $size, $angle1, 10, $size+15, $textColor1, $font1, $letter1); imagettftext($image, $size, $angle2, 35, $size+15, $textColor2, $font2, $letter2); imagettftext($image, $size, $angle3, 60, $size+15, $textColor3, $font3, $letter3); imagettftext($image, $size, $angle4, 85, $size+15, $textColor4, $font4, $letter4); imagettftext($image, $size, $angle5, 110, $size+15, $textColor5, $font5, $letter5); header('Content-type: image/jpeg'); imagejpeg($image); // Output image to browser imagedestroy($image); // Destroys the image // <!-- [4326] ( _END_ ) inc_random_image_one.php --> ?> <?php // <!-- [4327] ( BEGIN ) inc_random_image_two.php --> // This is example ( 1 ) found on http://us.php.net/imagettftext //Set the content-type header("Content-type:image/png"); //Create the image $image=imagecreatetruecolor(400,30); //Create some colors $white=imagecolorallocate($image,255,255,255); $grey=imagecolorallocate($image,128,128,128); $black=imagecolorallocate($image,0,0,0); imagefilledrectangle($image,0,0,399,29,$white); //The text to draw $text='Testing...'; //Replace path by your own font path // $font='fonts/10.ttf'; // $font='/[path to font]/Arial.ttf'; $font='/Library/Fonts/Verdana.ttf'; //Add some shadow to the text imagettftext($image,20,0,11,21,$grey,$font,$text); //Addthetext imagettftext($image,20,0,10,20,$black,$font,$text); //Using imagepng()results in clearer text compared with imagejpeg() imagepng($image); imagedestroy($image); // <!-- [4327] ( _END_ ) inc_random_image_two.php --> ?> <!-- OUTPUT BROWSER SOURCE --> <!-- [4325] ( BEGIN ) random_image_sample.php --> <HTML> <HEAD> <TITLE>Random image sample</TITLE> <META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; charset=iso- 8859-1\"> </HEAD> <BODY> <form name="form1" method="post" action="random_sample.php"> <table cellspacing="0" width="600" align="center"> <tr><td valign="top" align="right">Comments</td> <td><input name="message" size=40 value="...your message here"> </td></tr> <tr><td colspan=2 align="center"> <font size="1" face="Geneva, Arial, Helvetica, sans- serif"><strong><font size="2"> Please enter the string shown in the image in the form.<br> The possible characters are letters from A to Z in capitalized form and the numbers from 0 to 9. </font></td></tr> <tr><td align="center" colspan=2><input name="number" type="text" id=\"number\"></td></tr> <tr><td colspan=2 align="center"> <img src="random_image_two.php"> <!-- THIS IMAGE CONTAINS NOTHING --> </td></tr> <tr><td colspan=2 align="center"><input name="Submit" type="submit" value="Submit"></td></tr> </table> </form> </BODY> </HTML> <!-- [4325] ( _END_ ) random_image_sample.php --> ------------------------------------------------------------------------ [2008-07-06 09:39:06] pajoye@php.net Please provide a link to the font you use. Also you may send the header right before the PNG generation: header("Content-type:image/png"); imagepng($image); imagedestroy($image); You may look at the contents of the page (show source), If it is a blank page, it may contain error messages not displayed because of the Content-Type. ------------------------------------------------------------------------ [2008-07-06 06:27:26] ms at mac-specialist dot com Description: ------------ Same exact problem as Bug #44524, which has been written off as bogus. IT IS NOT BOGUS... Problem: ------------ Calls to imagettftext always fail with no error on Leopard 10.5.3 when run under MacPorts Apache 2.2.6, PHP 5.2.5 and the GD library. Originally I tried the "PHP Form image verification" example at : http://www.reconn.us/content/view/28/49/ I then tried example ( 1 ) found on http://us.php.net/imagettftext Both examples failed to display the results and provided not visible error, so I fired up the ZEND DEBUGGER and that is when I found the culprit, I then checked the Apache error log and found... Reproduce code: --------------- <?php // This is example ( 1 ) found on http://us.php.net/imagettftext //Set the content-type header("Content-type:image/png"); //Create the image $image=imagecreatetruecolor(400,30); //Create some colors $white=imagecolorallocate($image,255,255,255); $grey=imagecolorallocate($image,128,128,128); $black=imagecolorallocate($image,0,0,0); imagefilledrectangle($image,0,0,399,29,$white); //The text to draw $text='Testing...'; //Replace path by your own font path // $font='fonts/10.ttf'; $font='/[path to font]/Arial.ttf'; //Add some shadow to the text imagettftext($image,20,0,11,21,$grey,$font,$text); //Addthetext imagettftext($image,20,0,10,20,$black,$font,$text); //Using imagepng()results in clearer text compared with imagejpeg() imagepng($image); imagedestroy($image); ?> Expected result: ---------------- Small image containing "Testing..." Actual result: -------------- Checking the Apache error log shows many instances of : Break on __THE_PROCESS_HAS_FORKED_AND_YOU_CANNOT_USE_THIS_COREFOUNDATION_FUNCTION ALITY___YOU_MUST_EXEC__() to debug. [Sun Jul 06 00:45:18 2008] [notice] child pid 2990 exit signal Trace/BPT trap (5) When I trace Using ZEND DEBUGGER the call to imagettftext shows where the break in execution occurs. ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/?id=45437&edit=1

« previous php.bugs (#126327) next »