From: [EMAIL PROTECTED]
Operating system: Linux 2.4.7-10, Redhat 7.2
PHP version: 4.1.1
PHP Bug Type: Reproducible crash
Bug description: copy() causes bus error with files which change size
The copy() function (actually php_copy_file() at ext/standard/file.c:1934)
uses mmap() when available. The mmap() function has the documented
"feature" (bug!) that if the file that is mapped is truncated (e.g. by
another process) after mmap() is called, a SIGBUS (bus error) signal is
generated during the write() to the destination file using the mmap'ed
pointer as the source of the write. This, of course, crashes php.
I can not find a workaround for this. I have not been able to find any
combination of flags to pass to mmap such that mmap() will fail gracefully
rather than write() failing non-gracefully. Don't use mmep()? That would
be a shame, but seems to be the solution.
Simple example. Note that /computers/win95 is an smbmount'ed file system.
The file being accessed here, a Window's swap file, is of course changing
all the time.
<?php
copy("/computers/win95/C/WINDOWS/WIN386.SWP", "/tmp/zzz");
?>
Here's a simple C program which replicates what's going on in
php_copy_file()
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>
int main(int argc, char * argv[])
{
int fdSrc;
int fdDest;
int len;
char buf[8192];
void * srcfile;
struct stat sbuf;
if ((fdSrc = open("/computers/win95/C/WINDOWS/WIN386.SWP", 0)) < 0)
{
perror("open");
exit(1);
}
if ((fdDest = creat("/tmp/zzz", 0777)) < 0)
{
perror("creat");
exit(1);
}
if (fstat(fdSrc, &sbuf))
{
perror("fstat");
exit(1);
}
srcfile = mmap(NULL, sbuf.st_size, PROT_READ, MAP_SHARED, fdSrc, 0);
printf("srcfile=%p\n", srcfile);
if (srcfile != (void *) MAP_FAILED)
{
if ((len = write(fdDest, srcfile, sbuf.st_size)) != sbuf.st_size)
{
printf("write returned %d; expected %d\n", len, sbuf.st_size);
}
munmap(srcfile, sbuf.st_size);
}
printf("Success\n");
close(fdSrc);
close(fdDest);
exit(0);
}
--
Edit bug report at: http://bugs.php.net/?id=15327&edit=1
--
PHP Development Mailing List <http://www.php.net/>
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
To contact the list administrators, e-mail: [EMAIL PROTECTED]