php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #53241 fopen(..., 'xb') and CURLOPT_FILE make cURL fail with: fopencookie failed
Submitted: 2010-11-04 14:36 UTC Modified: 2010-11-05 19:54 UTC
From: Alexander dot Farber at gmail dot com Assigned: cataphract (profile)
Status: Closed Package: Streams related
PHP Version: Irrelevant OS: CentOS 5.5 Linux
Private report: No CVE-ID: None
View Developer Edit
Welcome! If you don't have a Git account, you can't do anything here.
If you reported this bug, you can edit this bug over here.
(description)
Block user comment
Status: Assign to:
Package:
Bug Type:
Summary:
From: Alexander dot Farber at gmail dot com
New email:
PHP Version: OS:

 

 [2010-11-04 14:36 UTC] Alexander dot Farber at gmail dot com
Description:
------------
If I call:

$fh = fopen('/tmp/yahoo.html', 'xb');
$ch = curl_init('http://www.yahoo.com/');
curl_setopt($ch, CURLOPT_FILE, $fh);

then the last line will fail with the misleading fopencookie-message.

I need to use 'xb' and not 'wb', to ensure that just 1 script instance writes into that file - please see more info here:

http://stackoverflow.com/questions/4096470/php-curl-curl-setopt-fopencookie-failed


Test script:
---------------
<?php
#phpinfo();
$fh = fopen('/tmp/yahoo.html', 'xb');
if ($fh) {
        $ch = curl_init('http://www.yahoo.com/');
        curl_setopt($ch, CURLOPT_FILE, $fh); # XXX the line 6
        curl_setopt($ch, CURLOPT_HEADER, FALSE);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
        curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
        #curl_setopt($ch, CURLOPT_COOKIEJAR, '/dev/null');
        #curl_setopt($ch, CURLOPT_COOKIEFILE, '/dev/null');
        #curl_setopt($ch, CURLOPT_COOKIEJAR, '/tmp/cookies.txt');
        #curl_setopt($ch, CURLOPT_COOKIEFILE, '/tmp/cookies.txt');
        curl_exec($ch);

        if(!curl_errno($ch)) {
                 $info = curl_getinfo($ch);
                  echo 'Took '.$info['total_time'] .
                    's to send a request to '.$info['url'];
        }
        curl_close($ch);
        fclose($fh);
} else {
        echo 'Can not open /tmp/yahoo.html';
}
?>


Expected result:
----------------
I expect the script create the file /tmp/yahoo.html on the 1st run and put the downloaded content into it.

Actual result:
--------------
Nov  4 12:55:19 centos httpd: PHP Fatal error:  curl_setopt() [<a href='function.curl-setopt'>function.curl-setopt</a>]: fopencookie failed in /var/www/html/proxy3.php on line 6

And the file is sero-sized:

afarber@centos:html> ls -alZ /tmp/yahoo.html
-rw-r--r--  apache apache user_u:object_r:httpd_tmp_t      /tmp/yahoo.html

Patches

Pull Requests

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2010-11-04 19:55 UTC] cataphract@php.net
-Assigned To: +Assigned To: cataphract
 [2010-11-04 19:55 UTC] cataphract@php.net
The problem is the cast to a FILE* pointer fails when the modes "x"/"c" and variants are used.

I'll see what can be done.
 [2010-11-04 19:57 UTC] cataphract@php.net
-Package: cURL related +Package: Streams related
 [2010-11-05 02:29 UTC] cataphract@php.net
Automatic comment from SVN on behalf of cataphract
Revision: http://svn.php.net/viewvc/?view=revision&amp;revision=305095
Log: - Fixed bug #53241 (stream casting that relies on fdopen/fopencookie fails
  with streams opened with, inter alia, the 'xb' mode).
 [2010-11-05 02:33 UTC] cataphract@php.net
-Status: Assigned +Status: Closed
 [2010-11-05 02:33 UTC] cataphract@php.net
Fixed for PHP 5.3 and trunk.

Thank you for your report.
 [2010-11-05 11:55 UTC] pajoye@php.net
-Status: Closed +Status: Assigned
 [2010-11-05 11:55 UTC] pajoye@php.net
Is it really necessary to export php_stream_rep_nonstand_mode? If an extension uses it now it will be then compatible only with 5.3.4 or later, which is bad (remeber the 5.2.6+ pain).

We also have some mode checks already in the stream implemenation, maybe it could be cleaner to use this function there as well.

About the implementation of php_stream_rep_nonstand_mode, it should be stricter, not assuming that anything else is 'c' or 'x', we had bugs related to bogus mode in the past.
 [2010-11-05 19:54 UTC] cataphract@php.net
-Status: Assigned +Status: Closed
 [2010-11-05 19:54 UTC] cataphract@php.net
Made the sanitizing function not exported. See rev #305108. Closing.
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Thu Nov 21 11:01:29 2024 UTC