Bug #14052 Updated: ftp_rawlist: Hangs up
| From: | carl at topthetable dot com | Date: | Wed, 03 Jul 2002 15:30:36 +0000 |
| Subject: | Bug #14052 Updated: ftp_rawlist: Hangs up | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-12994@lists.php.net to get a copy of this message | ||
ID: 14052
Updated by: carl@topthetable.com
Reported By: msjackson@bluemail.ch
Status: Open
Bug Type: FTP related
Operating System: Win2K
PHP Version: 4.1.1
New Comment:
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;
}
Previous Comments:
------------------------------------------------------------------------
[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 :)
------------------------------------------------------------------------
[2002-01-09 11:31:38] mfischer@php.net
I'm setting this to open, version to 4.1.1. Although in CVS there
exists now a way to adjust the timeout (ftp_set_option(FTP_TIMEOUT_SEC,
10); for example) it's not a solution and there are still some flaws in
the implementation IMO.
------------------------------------------------------------------------
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