]> granicus.if.org Git - php/commitdiff
Msan: Unpoison buffer written by file cache
authorNikita Popov <nikita.ppv@gmail.com>
Mon, 1 Jul 2019 09:02:31 +0000 (11:02 +0200)
committerNikita Popov <nikita.ppv@gmail.com>
Mon, 1 Jul 2019 09:14:28 +0000 (11:14 +0200)
It would be great if this were fully initialized, but it's not
really a problem either (as long as we don't care about reproducible
file cache), so ignore this for now.

ext/opcache/zend_file_cache.c

index 31f7e20cd62e269d1cbf1fdeefc22e6f37891762..2c6c16002ead59bfbac6e1f8d2f49150c67466cd 100644 (file)
 # include <sys/file.h>
 #endif
 
+#if __has_feature(memory_sanitizer)
+# include <sanitizer/msan_interface.h>
+#endif
+
 #ifndef ZEND_WIN32
 #define zend_file_cache_unlink unlink
 #define zend_file_cache_open open
@@ -947,6 +951,14 @@ int zend_file_cache_script_store(zend_persistent_script *script, int in_shm)
        info.checksum = zend_adler32(ADLER32_INIT, buf, script->size);
        info.checksum = zend_adler32(info.checksum, (signed char*)ZSTR_VAL((zend_string*)ZCG(mem)), info.str_size);
 
+#if __has_feature(memory_sanitizer)
+       /* The buffer may contain uninitialized regions. However, the uninitialized parts will not be
+        * used when reading the cache. We should probably still try to get things fully initialized
+        * for reproducibility, but for now ignore this issue. */
+       __msan_unpoison(&info, sizeof(info));
+       __msan_unpoison(buf, script->size);
+#endif
+
 #ifdef HAVE_SYS_UIO_H
        vec[0].iov_base = &info;
        vec[0].iov_len = sizeof(info);