Bug #14052 Updated: ftp_rawlist: Hangs up
| From: | sniper@php.net | Date: | Thu, 11 Jul 2002 02:48:15 +0000 |
| Subject: | Bug #14052 Updated: ftp_rawlist: Hangs up | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-13792@lists.php.net to get a copy of this message | ||
ID: 14052
Updated by: sniper@php.net
Reported By: msjackson@bluemail.ch
-Status: Open
+Status: Closed
Bug Type: FTP related
Operating System: Win2K
PHP Version: 4.1.1
New Comment:
This bug has been fixed in CVS. You can grab a snapshot of the
CVS version at http://snaps.php.net/. In case this was a
documentation
problem, the fix will show up soon at http://www.php.net/manual/.
In case this was a PHP.net website problem, the change will show
up on the PHP.net site and on the mirror sites.
Thank you for the report, and for helping us make PHP better.
Patch applied.
Previous Comments:
------------------------------------------------------------------------
[2002-07-03 11:30:35] carl@topthetable.com
Here is the aforementioned patch ...
======================
Index: ftp.c
===================================================================
RCS file: /repository/php4/ext/ftp/ftp.c,v
retrieving revision 1.49
diff -u -r1.49 ftp.c
--- ftp.c 18 Mar 2002 22:26:32 -0000 1.49
+++ ftp.c 3 Jul 2002 15:28:36 -0000
@@ -919,6 +919,8 @@
(ftp->inbuf[2] - '0');
memmove(ftp->inbuf, ftp->inbuf + 4, FTP_BUFSIZE - 4);
+ if ( ftp->extra )
+ ftp->extra -= 4;
return 1;
}
------------------------------------------------------------------------
[2002-07-03 11:27:02] carldrinkwater@mac.com
This is still an issue.
Find below a test script which does a recursive directory listing of a
FTP server.
This hangs on ProFTPd (Tested on >1.2.2) for the timeout period every
so often on the ftp_rawlist (It seems mostly to be empty directories,
but not always) but will usually continue working on the second or
third retry.
It seems OK on other FTP servers, but I've not been able to really test
this.
The FTP server logs indicate that the LIST has finished and has been
transmitted.
The fix by resolves this issue, I will post a patch against 4.3.0-dev
in a seperate comment.
===============================
<?
$ConnId = ftp_connect( "localhost" );
$LoginId = ftp_login( $ConnId, "carl", "passwd" );
if ( !$ConnId || !$LoginId ) {
echo "Login failed!\n";
die();
}
ftp_pasv( $ConnId, true );
function doDirectory( $Path, $Depth ) {
global $ConnId;
echo str_repeat( " ", $Depth );
echo "'$Path'\n";
ftp_chdir( $ConnId, $Path );
unset($ThisPath);
$i = 1;
while ( !is_array( $ThisPath ) ) {
$ThisPath = ftp_rawlist( $ConnId, "-al" );
if ( !is_array( $ThisPath ) ) {
echo str_repeat( " ", $Depth+2 );
echo "*** Error, Retrying ".($i++)." ...\n";
}
}
foreach( $ThisPath AS $Entry ) {
if( ereg( "([-d])[rwxst-]{9}.* ([0-9]*) [a-zA-Z]+ [0-9: ]*[0-9]
(.+)", $Entry, $Bits ) ) {
if ( $Bits[3] == "." || $Bits[3] == ".." ) {
continue;
}
if ( $Bits[1] == "d" ) {
doDirectory( $Bits[3], $Depth+2 );
} else {
echo str_repeat( " ", $Depth+2 );
echo $Bits[3]."\n";
}
} ## Matches the ereg?
} ## Iterate directory entries
ftp_chdir( $ConnId, ".." );
} ## End doDirectory()
doDirectory( "", 0 );
?>
------------------------------------------------------------------------
[2002-01-22 21:23:47] kofaldt@basic-vision.com
I had the same problem with linux and PHP 4.1.1.
In my opinion there's a problem in line 886 of file ext/ftp/ftp.c. I
replaced
memmove(ftp->inbuf, ftp->inbuf+4, FTP_BUFSIZE-4);
with
memmove(ftp->inbuf, ftp->inbuf+4, FTP_BUFSIZE-4);
if (ftp->extra)
ftp->extra -= 4;
The execution of memmove drops 4 bytes of the last response text which
is stored in ftp->inbuf. In case of ftp->extra != NULL, there are extra
characters and 4 characters of the next response are lost if you don't
adjust ftp->extra.
------------------------------------------------------------------------
[2002-01-20 19:35:33] erik@1000mbit.nl
Having the same problem here with WinXP proffesional
version 4.1.1
from my experience it seems it sends the "list" command.
then my FTP server (UNIX: type L8) receives it properly and
answers with the data being send in ASCii mode. and
then it hangs and i actually have to reboot for it to work
another time. It just won't interprete the script anymore
for a second there it allmost seems as if it needs to flush or waits
for a timeout to occur.
------------------------------------------------------------------------
[2002-01-09 11:32:45] yohgaki@php.net
Please update version :)
------------------------------------------------------------------------
The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at
http://bugs.php.net/14052
--
Edit this bug report at http://bugs.php.net/?id=14052&edit=1