php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #50962 Using a ftp stream to a windows ftp server to upload results in missing data
Submitted: 2010-02-08 09:29 UTC Modified: 2010-03-03 18:34 UTC
From: m dot ebbers at i-real dot nl Assigned:
Status: No Feedback Package: Streams related
PHP Version: 5.*, 6 (2010-02-23) OS: Linux
Private report: No CVE-ID: None
Have you experienced this issue?
Rate the importance of this bug to you:

 [2010-02-08 09:29 UTC] m dot ebbers at i-real dot nl
Description:
------------
When fopen/fwrite are used to upload a file, through ftp to a ftp server running on windows, it is not always uploaded completely despite the fact that fwrite returns that all bytes of the file are written.

I've testen the following scenarios with the attached code:
From Ubuntu 9.10 to Bulletproof ftpd under windows xp (vmware). (failed)
From Ubuntu 9.10 to Serv-u ftpd under windows xp (vmware). (failed)
From Ubuntu 9.10 to vsftpd on same machine. (ok)
Different hardware and network:
From CentOS release 5 to Bulletproof ftpd on windows server (failed)

When using the ftp command it all works great.

Also tried the build-in ftp client from php and that works fine. It only failed when using fopen/fwrite/file_put_contents.


Reproduce code:
---------------
$host = '192.168.1.34';
$user = 'marke';
$passwd = 'ebbers';
$path = '/';
$file = $argv[1];
$url='ftp://'.$user.':'.$passwd.'@'.$host.$path.$file;

$content = file_get_contents($file);
$handle = fopen($url, 'w');
$written = 0;

while ($written != strlen($content))
{

	$write = fwrite($handle, substr($content, $written));
	fflush($handle);
	if($write){
		$written .= $write;
		echo "Written: ".$written.'\n';
	}else{
		break;
	}
}

Expected result:
----------------
Output script: Written: 293346 (Test file is 293346 bytes.)
And a file on the ftp server of the same size.

Actual result:
--------------
Output script: Written: 293346 (Test file is 293346 bytes.)
A file on the server, but it is smaller. (and the sizes varies)

I've also a wireshark sniff available. The strange thing in the sniff is that the every byte of the file is actually send, but by an unknown reason there is tcp resend and the data in that resend is also the last data in the file on the server.

Strace:
socket(PF_INET6, SOCK_DGRAM, IPPROTO_IP) = 3
socket(PF_NETLINK, SOCK_RAW, 0)         = 3
bind(3, {sa_family=AF_NETLINK, pid=0, groups=00000000}, 12) = 0
getsockname(3, {sa_family=AF_NETLINK, pid=6499, groups=00000000}, [12]) = 0
sendto(3, "\24\0\0\0\26\0\1\3\220\321oK\0\0\0\0\0\0\0\0", 20, 0, {sa_family=AF_NETLINK, pid=0, groups=00000000}, 12) = 20
recvmsg(3, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"0\0\0\0\24\0\2\0\220\321oKc\31\0\0\2\10\200\376\1\0\0\0\10\0\1\0\177\0\0\1"..., 4096}], msg_controllen=0, msg_flags=0}, 0) = 228
recvmsg(3, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"@\0\0\0\24\0\2\0\220\321oKc\31\0\0\n\200\200\376\1\0\0\0\24\0\1\0\0\0\0\0"..., 4096}], msg_controllen=0, msg_flags=0}, 0) = 256
recvmsg(3, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"\24\0\0\0\3\0\2\0\220\321oKc\31\0\0\0\0\0\0\1\0\0\0\24\0\1\0\0\0\0\0"..., 4096}], msg_controllen=0, msg_flags=0}, 0) = 20
socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = 3
connect(3, {sa_family=AF_INET, sin_port=htons(21), sin_addr=inet_addr("192.168.1.34")}, 16) = -1 EINPROGRESS (Operation now in progress)
getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
recv(3, "220 Serv-U FTP Server v9.3 ready"..., 8192, MSG_DONTWAIT) = 37
send(3, "USER marke\r\n", 12, MSG_DONTWAIT) = 12
recv(3, "331 User name okay, need passwor"..., 8192, MSG_DONTWAIT) = 36
send(3, "PASS ebbers\r\n", 13, MSG_DONTWAIT) = 13
recv(3, "230 User logged in, proceed.\r\n", 8192, MSG_DONTWAIT) = 30
send(3, "TYPE I\r\n", 8, MSG_DONTWAIT)  = 8
recv(3, "200 Type set to I.\r\n", 8192, MSG_DONTWAIT) = 20
send(3, "SIZE /bin2\r\n", 12, MSG_DONTWAIT) = 12
recv(3, "550 /bin2: No such file.\r\n", 8192, MSG_DONTWAIT) = 26
send(3, "EPSV\r\n", 6, MSG_DONTWAIT)    = 6
recv(3, "500 'EPSV': command not understo"..., 8192, MSG_DONTWAIT) = 37
send(3, "PASV\r\n", 6, MSG_DONTWAIT)    = 6
recv(3, "227 Entering Passive Mode (192,1"..., 8192, MSG_DONTWAIT) = 47
send(3, "STOR /bin2\r\n", 12, MSG_DONTWAIT) = 12
socket(PF_NETLINK, SOCK_RAW, 0)         = 4
bind(4, {sa_family=AF_NETLINK, pid=0, groups=00000000}, 12) = 0
getsockname(4, {sa_family=AF_NETLINK, pid=6499, groups=00000000}, [12]) = 0
sendto(4, "\24\0\0\0\26\0\1\3\220\321oK\0\0\0\0\0\0\0\0", 20, 0, {sa_family=AF_NETLINK, pid=0, groups=00000000}, 12) = 20
recvmsg(4, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"0\0\0\0\24\0\2\0\220\321oKc\31\0\0\2\10\200\376\1\0\0\0\10\0\1\0\177\0\0\1"..., 4096}], msg_controllen=0, msg_flags=0}, 0) = 228
recvmsg(4, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"@\0\0\0\24\0\2\0\220\321oKc\31\0\0\n\200\200\376\1\0\0\0\24\0\1\0\0\0\0\0"..., 4096}], msg_controllen=0, msg_flags=0}, 0) = 256
recvmsg(4, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"\24\0\0\0\3\0\2\0\220\321oKc\31\0\0\0\0\0\0\1\0\0\0\24\0\1\0\0\0\0\0"..., 4096}], msg_controllen=0, msg_flags=0}, 0) = 20
socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = 4
connect(4, {sa_family=AF_INET, sin_port=htons(1097), sin_addr=inet_addr("192.168.1.34")}, 16) = -1 EINPROGRESS (Operation now in progress)
getsockopt(4, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
recv(3, "150 Opening BINARY mode data con"..., 8192, MSG_DONTWAIT) = 51
send(4, ".0.1.2.3.4.5.6.7.8.9.10.11.12.13"..., 8192, MSG_DONTWAIT) = 8192
send(4, "860.1861.1862.1863.1864.1865.186"..., 8192, MSG_DONTWAIT) = 8192
send(4, "8.3499.3500.3501.3502.3503.3504."..., 8192, MSG_DONTWAIT) = 8192
send(4, "5137.5138.5139.5140.5141.5142.51"..., 8192, MSG_DONTWAIT) = 8192
send(4, "75.6776.6777.6778.6779.6780.6781"..., 8192, MSG_DONTWAIT) = 3432
send(4, ".7462.7463.7464.7465.7466.7467.7"..., 8192, MSG_DONTWAIT) = -1 EAGAIN (Resource temporarily unavailable)
send(4, ".7462.7463.7464.7465.7466.7467.7"..., 8192, MSG_DONTWAIT) = 8192
send(4, "100.9101.9102.9103.9104.9105.910"..., 8192, MSG_DONTWAIT) = 8192
send(4, "0.951.952.953.954.955.956.957.95"..., 8192, MSG_DONTWAIT) = 8192
send(4, ".2599.2600.2601.2602.2603.2604.2"..., 8192, MSG_DONTWAIT) = 8192
send(4, "237.4238.4239.4240.4241.4242.424"..., 8192, MSG_DONTWAIT) = 3432
send(4, "3.4924.4925.4926.4927.4928.4929."..., 8192, MSG_DONTWAIT) = 8192
send(4, "6562.6563.6564.6565.6566.6567.65"..., 8192, MSG_DONTWAIT) = 8192
send(4, "00.8201.8202.8203.8204.8205.8206"..., 8192, MSG_DONTWAIT) = 8192
send(4, ".9839.9840.9841.9842.9843.9844.9"..., 8192, MSG_DONTWAIT) = 7280
send(4, "6.1517.1518.1519.1520.1521.1522."..., 8192, MSG_DONTWAIT) = -1 EAGAIN (Resource temporarily unavailable)
send(4, "6.1517.1518.1519.1520.1521.1522."..., 8192, MSG_DONTWAIT) = 8192
send(4, "3155.3156.3157.3158.3159.3160.31"..., 8192, MSG_DONTWAIT) = 8192
send(4, "93.4794.4795.4796.4797.4798.4799"..., 8192, MSG_DONTWAIT) = 8192
send(4, ".6432.6433.6434.6435.6436.6437.6"..., 8192, MSG_DONTWAIT) = 8192
send(4, "070.8071.8072.8073.8074.8075.807"..., 8192, MSG_DONTWAIT) = 8192
send(4, "8.9709.9710.9711.9712.9713.9714."..., 8192, MSG_DONTWAIT) = 8192
send(4, ".1569.1570.1571.1572.1573.1574.1"..., 8192, MSG_DONTWAIT) = 8192
send(4, "207.3208.3209.3210.3211.3212.321"..., 8192, MSG_DONTWAIT) = 6368
send(4, ".4481.4482.4483.4484.4485.4486.4"..., 8192, MSG_DONTWAIT) = -1 EAGAIN (Resource temporarily unavailable)
send(4, ".4481.4482.4483.4484.4485.4486.4"..., 8192, MSG_DONTWAIT) = 8192
send(4, "119.6120.6121.6122.6123.6124.612"..., 8192, MSG_DONTWAIT) = 8192
send(4, "7.7758.7759.7760.7761.7762.7763."..., 8192, MSG_DONTWAIT) = 8192
send(4, "9396.9397.9398.9399.9400.9401.94"..., 8192, MSG_DONTWAIT) = 8192
send(4, "256.1257.1258.1259.1260.1261.126"..., 8192, MSG_DONTWAIT) = 8192
send(4, "4.2895.2896.2897.2898.2899.2900."..., 8192, MSG_DONTWAIT) = 8192
send(4, "4533.4534.4535.4536.4537.4538.45"..., 8192, MSG_DONTWAIT) = 8192
send(4, "71.6172.6173.6174.6175.6176.6177"..., 8192, MSG_DONTWAIT) = 6368
send(4, "7445.7446.7447.7448.7449.7450.74"..., 8192, MSG_DONTWAIT) = 8192
send(4, "83.9084.9085.9086.9087.9088.9089"..., 8192, MSG_DONTWAIT) = 8192
send(4, "9.930.931.932.933.934.935.936.93"..., 8192, MSG_DONTWAIT) = 8192
send(4, "2582.2583.2584.2585.2586.2587.25"..., 8192, MSG_DONTWAIT) = 8192
send(4, "20.4221.4222.4223.4224.4225.4226"..., 8192, MSG_DONTWAIT) = 8192
send(4, ".5859.5860.5861.5862.5863.5864.5"..., 8192, MSG_DONTWAIT) = 8192
send(4, "497.7498.7499.7500.7501.7502.750"..., 8192, MSG_DONTWAIT) = 8192
send(4, "5.9136.9137.9138.9139.9140.9141."..., 4322, MSG_DONTWAIT) = 4322
Written: 0293346\n
send(3, "QUIT\r\n", 6, MSG_DONTWAIT)    = 6




Patches

Add a Patch

Pull Requests

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2010-02-13 21:49 UTC] jani@php.net
Please try using this snapshot:

  http://snaps.php.net/php5.3-latest.tar.gz
 
For Windows:

  http://windows.php.net/snapshots/


 [2010-02-23 08:10 UTC] m dot ebbers at i-real dot nl
I've tested it with the given snapshot:
PHP 5.3.3-dev (cli) (built: Feb 23 2010 08:21:46) 
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies

With the same results. Files are not always complete. :(
 [2010-02-23 13:08 UTC] jani@php.net
When you give feedback, use the correct tab (NOT the "Add Comment" one!). And does this happen with any ftp server not under Windows? Any firewalls or such between? Have you tried the PHP FTP extension instead? (See more at: http://php.net/ftp )
 [2010-03-03 18:34 UTC] php-bugs at lists dot php dot net
No feedback was provided for this bug for over a week, so it is
being suspended automatically. If you are able to provide the
information that was originally requested, please do so and change
the status of the bug back to "Open".
 
PHP Copyright © 2001-2020 The PHP Group
All rights reserved.
Last updated: Thu Nov 26 22:01:23 2020 UTC