The copy() function will report failure when copying a 0 byte file, even
though a duplicate file has successfully been created.
The problem occurs because _php_stream_copy_to_stream function inside stream.c
does not check if the source file is 0 bytes and returns haveread bytes,
which in case of blank file is 0. This later on get interpreted as a failure
to copy file.
Below is a patch against the latest CVS, which fixes this problem.
--- streams.c Thu Aug 8 19:57:50 2002
+++ streams.c Thu Aug 8 19:51:36 2002
@@ -473,6 +473,12 @@
if (fstat(srcfd, &sbuf) == 0) {
void *srcfile;
+
+ /* in the event the source file's size is 0 bytes,
return 1 to
+ * indicate success, because opening the file for
write had already
+ * created a copy
+ * */
+ if (sbuf.st_size == 0) return 1;
if (maxlen > sbuf.st_size || maxlen == 0)
maxlen = sbuf.st_size;
The bug can be replicated with a php script listed below.
<?php
touch("mini");
var_dump(copy("mini", "mini2"));
?>
Ilia Alshanetsky
--
PHP Development Mailing List <http://www.php.net/>
To unsubscribe, visit: http://www.php.net/unsub.php