summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Zend/zend_virtual_cwd.c20
-rw-r--r--ext/standard/tests/file/fopen_unlink.phpt34
-rw-r--r--ext/standard/tests/file/unlink_variation2-win32.phpt43
-rw-r--r--ext/standard/tests/file/unlink_variation2.phpt6
-rw-r--r--win32/ftok.c2
-rw-r--r--win32/ioutil.c5
-rw-r--r--win32/ioutil.h2
7 files changed, 54 insertions, 58 deletions
diff --git a/Zend/zend_virtual_cwd.c b/Zend/zend_virtual_cwd.c
index 132b68f39c..32c71a6149 100644
--- a/Zend/zend_virtual_cwd.c
+++ b/Zend/zend_virtual_cwd.c
@@ -187,8 +187,8 @@ CWD_API ssize_t php_sys_readlink(const char *link, char *target, size_t target_l
}
hFile = CreateFileW(linkw, // file to open
- GENERIC_READ, // open for reading
- FILE_SHARE_READ, // share for reading
+ 0, // query possible attributes
+ PHP_WIN32_IOUTIL_DEFAULT_SHARE_MODE,
NULL, // default security
OPEN_EXISTING, // existing file only
FILE_FLAG_BACKUP_SEMANTICS, // normal file
@@ -299,7 +299,13 @@ CWD_API int php_sys_stat_ex(const char *path, zend_stat_t *buf, int lstat) /* {{
REPARSE_DATA_BUFFER * pbuffer;
DWORD retlength = 0;
- hLink = CreateFileW(pathw, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_FLAG_OPEN_REPARSE_POINT|FILE_FLAG_BACKUP_SEMANTICS, NULL);
+ hLink = CreateFileW(pathw,
+ FILE_READ_ATTRIBUTES,
+ PHP_WIN32_IOUTIL_DEFAULT_SHARE_MODE,
+ NULL,
+ OPEN_EXISTING,
+ FILE_FLAG_OPEN_REPARSE_POINT|FILE_FLAG_BACKUP_SEMANTICS,
+ NULL);
if(hLink == INVALID_HANDLE_VALUE) {
free(pathw);
return -1;
@@ -879,7 +885,13 @@ static size_t tsrm_realpath_r(char *path, size_t start, size_t len, int *ll, tim
return (size_t)-1;
}
- hLink = CreateFileW(pathw, 0, 0, NULL, OPEN_EXISTING, FILE_FLAG_OPEN_REPARSE_POINT|FILE_FLAG_BACKUP_SEMANTICS, NULL);
+ hLink = CreateFileW(pathw,
+ 0,
+ PHP_WIN32_IOUTIL_DEFAULT_SHARE_MODE,
+ NULL,
+ OPEN_EXISTING,
+ FILE_FLAG_OPEN_REPARSE_POINT|FILE_FLAG_BACKUP_SEMANTICS,
+ NULL);
if(hLink == INVALID_HANDLE_VALUE) {
free_alloca(tmp, use_heap);
FREE_PATHW()
diff --git a/ext/standard/tests/file/fopen_unlink.phpt b/ext/standard/tests/file/fopen_unlink.phpt
new file mode 100644
index 0000000000..c069ea1b94
--- /dev/null
+++ b/ext/standard/tests/file/fopen_unlink.phpt
@@ -0,0 +1,34 @@
+--TEST--
+Test fopen() function : check fopen()ed descriptor is usable after the fs object is removed
+--FILE--
+<?php
+
+var_dump(
+ $p = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'tututu',
+ $f = fopen($p, 'w+'),
+ unlink($p),
+ file_exists($p),
+ fwrite($f, 'hello'),
+ fseek($f, 0),
+ fread($f, 16),
+ fwrite($f, 'world'),
+ fseek($f, 0),
+ fread($f, 16),
+ fclose($f)
+);
+
+?>
+===DONE===
+--EXPECTF--
+string(%d) "%stututu"
+resource(%s) of type (Unknown)
+bool(true)
+bool(false)
+int(5)
+int(0)
+string(5) "hello"
+int(5)
+int(0)
+string(10) "helloworld"
+bool(true)
+===DONE===
diff --git a/ext/standard/tests/file/unlink_variation2-win32.phpt b/ext/standard/tests/file/unlink_variation2-win32.phpt
deleted file mode 100644
index af7b381547..0000000000
--- a/ext/standard/tests/file/unlink_variation2-win32.phpt
+++ /dev/null
@@ -1,43 +0,0 @@
---TEST--
-Test unlink() function : usage variations - unlink file in use
---SKIPIF--
-<?php
-if (substr(PHP_OS, 0, 3) != 'WIN') {
- die('skip only on Windows');
-}
-?>
---FILE--
-<?php
-/* Prototype : bool unlink ( string $filename [, resource $context] );
- Description : Deletes filename
-*/
-
-/* Try to unlink file when file handle is still in use */
-
-$file_path = dirname(__FILE__);
-
-echo "*** Testing unlink() on a file when file handle is open ***\n";
-// temp file name used here
-$filename = "$file_path/unlink_variation2-win32.tmp";
-
-// create file
-$fp = fopen($filename, "w");
-// try unlink() on $filename
-var_dump( unlink($filename) ); // expected: false as file handle is still open
-// now close file handle
-fclose($fp);
-
-// now unlink file
-var_dump( unlink($filename) ); // expected: true
-var_dump( file_exists($filename) ); // confirm file is deleted
-
-echo "Done\n";
-?>
---EXPECTF--
-*** Testing unlink() on a file when file handle is open ***
-
-Warning: unlink(%s): %s in %s on line %d
-bool(false)
-bool(true)
-bool(false)
-Done
diff --git a/ext/standard/tests/file/unlink_variation2.phpt b/ext/standard/tests/file/unlink_variation2.phpt
index 071a65780c..0068dbfe17 100644
--- a/ext/standard/tests/file/unlink_variation2.phpt
+++ b/ext/standard/tests/file/unlink_variation2.phpt
@@ -1,11 +1,5 @@
--TEST--
Test unlink() function : usage variations - unlink file in use
---SKIPIF--
-<?php
-if (substr(PHP_OS, 0, 3) == 'WIN') {
- die('skip only on Linux');
-}
-?>
--FILE--
<?php
/* Prototype : bool unlink ( string $filename [, resource $context] );
diff --git a/win32/ftok.c b/win32/ftok.c
index b88ed009c8..67e95e92ee 100644
--- a/win32/ftok.c
+++ b/win32/ftok.c
@@ -41,7 +41,7 @@ ftok(const char *pathname, int proj_id)
return (key_t)-1;
}
- if ((fh = CreateFileW(pathw, GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0)) == INVALID_HANDLE_VALUE) {
+ if ((fh = CreateFileW(pathw, FILE_GENERIC_READ, PHP_WIN32_IOUTIL_DEFAULT_SHARE_MODE, 0, OPEN_EXISTING, 0, 0)) == INVALID_HANDLE_VALUE) {
PHP_WIN32_IOUTIL_CLEANUP_W()
return (key_t)-1;
}
diff --git a/win32/ioutil.c b/win32/ioutil.c
index cb5ff363b4..68346a19bb 100644
--- a/win32/ioutil.c
+++ b/win32/ioutil.c
@@ -111,10 +111,7 @@ PW32IO BOOL php_win32_ioutil_posix_to_open_opts(int flags, mode_t mode, php_iout
* UNIX semantics. In particular, this ensures that the file can
* be deleted even whilst it's open.
*/
- /* opts->share = FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE; */
- /* XXX No UINX behavior Good to know it's doable.
- Not being done as this means a behavior change. Should be evaluated properly. */
- opts->share = FILE_SHARE_READ | FILE_SHARE_WRITE;
+ opts->share = PHP_WIN32_IOUTIL_DEFAULT_SHARE_MODE;
switch (flags & (_O_CREAT | _O_EXCL | _O_TRUNC)) {
case 0:
diff --git a/win32/ioutil.h b/win32/ioutil.h
index c470fdbb1c..71737f697b 100644
--- a/win32/ioutil.h
+++ b/win32/ioutil.h
@@ -121,6 +121,8 @@ typedef enum {
#define PHP_WIN32_IOUTIL_IS_UNC(pathw, path_lenw) (path_lenw >= 2 && PHP_WIN32_IOUTIL_IS_SLASHW(pathw[0]) && PHP_WIN32_IOUTIL_IS_SLASHW(pathw[1]) \
|| path_lenw >= PHP_WIN32_IOUTIL_UNC_PATH_PREFIX_LENW && 0 == wcsncmp((pathw), PHP_WIN32_IOUTIL_UNC_PATH_PREFIXW, PHP_WIN32_IOUTIL_UNC_PATH_PREFIX_LENW))
+#define PHP_WIN32_IOUTIL_DEFAULT_SHARE_MODE (FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE)
+
#define PHP_WIN32_IOUTIL_INIT_W(path) \
wchar_t *pathw = php_win32_ioutil_any_to_w(path); \