Bug #14052 Updated: ftp_rawlist: Hangs up

From: 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

« previous php.bugs (#13792) next »