]> granicus.if.org Git - php/commitdiff
Fixed bug #43182 (file_put_contents() LOCK_EX does not work properly on
authorIlia Alshanetsky <iliaa@php.net>
Mon, 12 Nov 2007 18:47:46 +0000 (18:47 +0000)
committerIlia Alshanetsky <iliaa@php.net>
Mon, 12 Nov 2007 18:47:46 +0000 (18:47 +0000)
file

NEWS
ext/standard/file.c
main/streams/plain_wrapper.c

diff --git a/NEWS b/NEWS
index f50599b55f412b34da64ededf0a9cfe9e93b5b45..98ae56cd99172f75c82075728802421279e30c9b 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -3,6 +3,8 @@ PHP                                                                        NEWS
 ?? ??? 2008, PHP 5.2.6
 - Fixed bug #43216 (stream_is_local() returns false on "file://"). (Dmitry)
 - Fixed bug #43201 (Crash on using unitialized vals and __get/__set). (Dmitry)
+- Fixed bug #43182 (file_put_contents() LOCK_EX does not work properly on file 
+  truncation). (Ilia)
 - Fixed bug #43175 (__destruct() throwing an exception with __call() causes
   segfault). (Dmitry)
 - Fixed bug #42937 (__call() method not invoked when methods are called on
index c54ce62313d7e7ae591664a72589b7dfcadd04a9..605367c40563b6c994c619a4b35ea43ecf033720 100644 (file)
@@ -592,6 +592,7 @@ PHP_FUNCTION(file_put_contents)
        zval *zcontext = NULL;
        php_stream_context *context = NULL;
        php_stream *srcstream = NULL;
+       char mode[3] = "wb";
        
        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sz/|lr!", &filename, &filename_len, 
                                &data, &flags, &zcontext) == FAILURE) {
@@ -604,8 +605,14 @@ PHP_FUNCTION(file_put_contents)
 
        context = php_stream_context_from_zval(zcontext, flags & PHP_FILE_NO_DEFAULT_CONTEXT);
 
-       stream = php_stream_open_wrapper_ex(filename, (flags & PHP_FILE_APPEND) ? "ab" : "wb", 
-                       ((flags & PHP_FILE_USE_INCLUDE_PATH) ? USE_PATH : 0) | ENFORCE_SAFE_MODE | REPORT_ERRORS, NULL, context);
+       if (flags & PHP_FILE_APPEND) {
+               mode[0] = 'a';
+       } else if (flags & LOCK_EX) {
+               mode[0] = 'c';
+       }
+       mode[2] = '\0';
+
+       stream = php_stream_open_wrapper_ex(filename, mode, ((flags & PHP_FILE_USE_INCLUDE_PATH) ? USE_PATH : 0) | ENFORCE_SAFE_MODE | REPORT_ERRORS, NULL, context);
        if (stream == NULL) {
                RETURN_FALSE;
        }
@@ -615,6 +622,10 @@ PHP_FUNCTION(file_put_contents)
                RETURN_FALSE;
        }
 
+       if (mode[0] = 'c') {
+               php_stream_truncate_set_size(stream, 0);
+       }
+
        switch (Z_TYPE_P(data)) {
                case IS_RESOURCE:
                        numbytes = php_stream_copy_to_stream(srcstream, stream, PHP_STREAM_COPY_ALL);
index f50db8adc39140b9470f7c009708465561a33595..f921f0124e26088b14eab9e4267b875425a55d08 100644 (file)
@@ -63,6 +63,9 @@ PHPAPI int php_stream_parse_fopen_modes(const char *mode, int *open_flags)
                case 'x':
                        flags = O_CREAT|O_EXCL;
                        break;
+               case 'c':
+                       flags = O_CREAT;
+                       break;
                default:
                        /* unknown mode */
                        return FAILURE;