ID: 49047 Updated by: paj...@php.net Reported By: RQuadling at GMail dot com -Status: Assigned +Status: Closed Bug Type: Filesystem function related Operating System: win32 only - Windows XP SP3 PHP Version: 5.3SVN-2009-07-24 (snap) Assigned To: pajoye New Comment:
This bug has been fixed in SVN. Snapshots of the sources are packaged every three hours; this change will be in the next snapshot. You can grab the snapshot at http://snaps.php.net/. Thank you for the report, and for helping us make PHP better. Previous Comments: ------------------------------------------------------------------------ [2009-08-25 09:16:55] s...@php.net Automatic comment from SVN on behalf of pajoye Revision: http://svn.php.net/viewvc/?view=revision&revision=287673 Log: - fix #49047, touch may fail on directory ------------------------------------------------------------------------ [2009-08-24 16:33:19] paj...@php.net commit on its way ------------------------------------------------------------------------ [2009-07-24 12:48:49] RQuadling at GMail dot com Description: ------------ Trying to touch() a win32 folder fails. In tracking this back through the source, I think the issue is that PHP is calling the external utime() function. For my build (I'm a novice so please bear with me), I see that ... HAVE_UTIME TSRM_WIN32 are both set, but VIRTUAL_DIR is not. This is a repeat of bug#35980, but as that bug is closed and the example code below doesn't work, I assume this is a new bug. So, in TSRM/tsrm_virtual_cwd.h, the call that is being made is ... #ifdef VIRTUAL_DIR ... #if HAVE_UTIME #define VCWD_UTIME(path, time) virtual_utime(path, time TSRMLS_CC) #endif ... #else ... #if HAVE_UTIME #define VCWD_UTIME(path, time) utime(path, time) #endif ... #endif utime(path, time) I think this is the external call and as such will fail. I think that is why the virtual version exists (which in turn calls win32_utime) Reproduce code: --------------- <?php $s_Directory = 'C:\\Test'; $dt_DOB = strtotime('2008-10-19 18:43'); if (file_exists($s_Directory) && !rmdir($s_Directory)) { die("Failed to delete $s_Directory"); } echo "Create $s_Directory", PHP_EOL; if (!mkdir($s_Directory)) { die("Failed to create $s_Directory"); } else { echo "Created $s_Directory", PHP_EOL; } echo "Touch $s_Directory : ", date('r', $dt_DOB), PHP_EOL; if (!touch($s_Directory, $dt_DOB)) { die("Failed to touch $s_Directory"); } else { echo "Touched $s_Directory", PHP_EOL; } Expected result: ---------------- Create C:\Test Created C:\Test Touch C:\Test : Sun, 19 Oct 2008 18:43:00 +0100 Touched C:\Test Actual result: -------------- Create C:\Test Created C:\Test Touch C:\Test : Sun, 19 Oct 2008 18:43:00 +0100 Warning: touch(): Utime failed: Permission denied in Z:\touchdir.php on line 22 Failed to touch C:\Test ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/?id=49047&edit=1