mirror of
https://github.com/bdnugget/php-src.git
synced 2026-11-09 18:20:50 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8b1ed68034 | ||
|
|
57101a3dd7 | ||
|
|
0c2649011d | ||
|
|
c526fa2d7b | ||
|
|
4488c43757 | ||
|
|
1250c4ee43 | ||
|
|
3c06794e93 | ||
|
|
8e48895f48 | ||
|
|
2ebd1c4e86 | ||
|
|
fac39fa36d | ||
|
|
d4f7e8cedc | ||
|
|
1395b874f4 | ||
|
|
a1fdfa700b | ||
|
|
8effbd1cb0 | ||
|
|
d74c61c133 | ||
|
|
0a36d417e8 | ||
|
|
6700198d64 | ||
|
|
a04fac84e7 | ||
|
|
4e98e65d53 | ||
|
|
9c6b926dae | ||
|
|
600402d986 | ||
|
|
4f236635e7 | ||
|
|
340a06778c | ||
|
|
7f4784c1c9 | ||
|
|
da3a807f22 | ||
|
|
26d417d758 | ||
|
|
454d297564 | ||
|
|
61e385a358 | ||
|
|
7a8ffcec7d | ||
|
|
332a367538 | ||
|
|
29fa4d203a | ||
|
|
59b2a899ca | ||
|
|
0826a54836 | ||
|
|
f421ebc056 | ||
|
|
25f5a1b2e1 | ||
|
|
032905b5a0 | ||
|
|
eebcfeb68e | ||
|
|
ba6714a200 | ||
|
|
0a181ca27a | ||
|
|
de9734a5bb | ||
|
|
9688071679 | ||
|
|
304190c49d | ||
|
|
50f476591f | ||
|
|
e0996decc3 | ||
|
|
39d8fc1edc | ||
|
|
443478109b | ||
|
|
206fd35a98 | ||
|
|
b95b553489 | ||
|
|
dd227f61df | ||
|
|
75cb678206 | ||
|
|
d7ae64627f | ||
|
|
6800f0a3c2 | ||
|
|
5832be768c | ||
|
|
498eb8e052 | ||
|
|
733b514326 | ||
|
|
688e56d0ac | ||
|
|
90be86fc91 | ||
|
|
838951c2d6 | ||
|
|
4dca1140cf | ||
|
|
bc7ea73da5 | ||
|
|
713b82131b | ||
|
|
538f95b1b7 | ||
|
|
c483b59124 | ||
|
|
2a1ed81ffc | ||
|
|
06bfada99b | ||
|
|
97cfdcd73b | ||
|
|
bccca0b53a | ||
|
|
465cfc499b | ||
|
|
4dce2f83f5 | ||
|
|
4be867e910 | ||
|
|
7e494d9225 | ||
|
|
34e39ebaf5 | ||
|
|
d80118dc16 | ||
|
|
c17434429d | ||
|
|
faf1567212 | ||
|
|
fddd0ac552 | ||
|
|
a08847ab39 | ||
|
|
c7fadd2328 | ||
|
|
38ebb55c7c | ||
|
|
82622d7583 | ||
|
|
c2ff964de0 | ||
|
|
4adc08a403 | ||
|
|
7dbe27222c | ||
|
|
5e4ee3d0bd | ||
|
|
eb1d1fe373 | ||
|
|
465aa1d38f | ||
|
|
b03438ba3a | ||
|
|
5ecc078a17 | ||
|
|
eae69fcf71 | ||
|
|
f448b0e6dd | ||
|
|
50254de0a2 | ||
|
|
282355efd5 | ||
|
|
6493b516f9 | ||
|
|
c93b461ad7 | ||
|
|
3306baca50 | ||
|
|
fc4cd598a2 | ||
|
|
703bbf5210 | ||
|
|
eaf9421df6 | ||
|
|
3b377b51a2 | ||
|
|
7931956805 | ||
|
|
f901bec494 | ||
|
|
3880b8785b | ||
|
|
5787f91c55 | ||
|
|
0f8312342f | ||
|
|
8462a3de1a | ||
|
|
8fc0bdfb0a | ||
|
|
797edd6211 | ||
|
|
ae23852e41 | ||
|
|
1c16749eaa | ||
|
|
e0e167e581 | ||
|
|
187ba4353a | ||
|
|
4f478af16d | ||
|
|
303a4ae44a | ||
|
|
90b24401d6 | ||
|
|
51e2015af3 | ||
|
|
957cb13a49 | ||
|
|
37c9728615 | ||
|
|
71297a254b | ||
|
|
75a4f484f0 | ||
|
|
5875bf754e | ||
|
|
2c508c4d40 | ||
|
|
2c182a77f7 | ||
|
|
e857936518 | ||
|
|
1ee6aad248 | ||
|
|
8813f2e0c3 | ||
|
|
988c3f9659 | ||
|
|
18071aaa08 | ||
|
|
ae0585c98e | ||
|
|
fb683030bf | ||
|
|
a480bf8093 | ||
|
|
ddea5c0816 | ||
|
|
f06efce387 | ||
|
|
8309c04464 | ||
|
|
44ef32ff2c | ||
|
|
766f827e26 | ||
|
|
aaea81de7c | ||
|
|
3ec37a74a2 | ||
|
|
78b0a85de6 | ||
|
|
b7fa5268e4 | ||
|
|
8162c3d1fd | ||
|
|
67bb06cc9b | ||
|
|
729cd8bacd | ||
|
|
3f282e57ec | ||
|
|
81396ea890 | ||
|
|
79cf2c56d3 | ||
|
|
b418fe266d | ||
|
|
963e50c8c4 | ||
|
|
1d2bbce532 | ||
|
|
073b6ea818 | ||
|
|
6dcd640f35 | ||
|
|
d7c98ca1ac | ||
|
|
ab98944195 | ||
|
|
ed4f90f0c7 | ||
|
|
6dd85f83f7 | ||
|
|
85ffe8dcdc | ||
|
|
553a0c52b1 | ||
|
|
84b6152842 | ||
|
|
cbdd21a22d | ||
|
|
8c6db654e7 |
No files matched your search
@@ -11,9 +11,7 @@ end
|
||||
|
||||
define ____executor_globals
|
||||
if basic_functions_module.zts
|
||||
if !$tsrm_ls
|
||||
set $tsrm_ls = ts_resource_ex(0, 0)
|
||||
end
|
||||
set $tsrm_ls = _tsrm_ls_cache
|
||||
set $eg = ((zend_executor_globals*) (*((void ***) $tsrm_ls))[executor_globals_id-1])
|
||||
set $cg = ((zend_compiler_globals*) (*((void ***) $tsrm_ls))[compiler_globals_id-1])
|
||||
set $eg_ptr = $eg
|
||||
|
||||
@@ -1,6 +1,99 @@
|
||||
PHP NEWS
|
||||
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||
?? ??? 2021, PHP 8.0.3
|
||||
29 Apr 2021, PHP 8.0.5
|
||||
|
||||
- Core:
|
||||
. Fixed bug #75776 (Flushing streams with compression filter is broken). (cmb)
|
||||
. Fixed bug #80811 (Function exec without $output but with $restult_code
|
||||
parameter crashes). (Nikita)
|
||||
. Fixed bug #80814 (threaded mod_php won't load on FreeBSD: No space
|
||||
available for static Thread Local Storage). (Dmitry)
|
||||
. Changed PowerPC CPU registers used by Zend VM to work around GCC bug.
|
||||
Old registers (r28/r29) might be clobbered by _restgpr routine used for
|
||||
return from C function compiled with -Os. (Dmitry)
|
||||
|
||||
- Dba:
|
||||
. Fixed bug #80817 (dba_popen() may cause segfault during RSHUTDOWN). (cmb)
|
||||
|
||||
- DOM:
|
||||
. Fixed bug #66783 (UAF when appending DOMDocument to element). (cmb)
|
||||
|
||||
- FFI:
|
||||
. Fixed bug #80847 (CData structs with fields of type struct can't be passed
|
||||
as C function argument). (Nickolas Daniel da Silva, Dmitry)
|
||||
|
||||
- FPM:
|
||||
. Fixed bug #80024 (Duplication of info about inherited socket after pool
|
||||
removing). (Jakub Zelenka)
|
||||
|
||||
- FTP:
|
||||
. Fixed bug #80880 (SSL_read on shutdown, ftp/proc_open). (cmb, Jakub
|
||||
Zelenka)
|
||||
|
||||
- IMAP:
|
||||
. Fixed bug #80800 (imap_open() fails when the flags parameter includes
|
||||
CL_EXPUNGE). (girgias)
|
||||
. Fixed bug #80710 (imap_mail_compose() header injection). (cmb, Stas)
|
||||
|
||||
- Intl:
|
||||
. Fixed bug #80763 (msgfmt_format() does not accept DateTime references).
|
||||
(cmb)
|
||||
|
||||
- LibXML:
|
||||
. Fixed bug #73533 (Invalid memory access in php_libxml_xmlCheckUTF8). (cmb)
|
||||
. Fixed bug #51903 (simplexml_load_file() doesn't use HTTP headers). (cmb)
|
||||
|
||||
- MySQLnd:
|
||||
. Fixed bug #80837 (Calling stmt_store_result after fetch doesn't throw an
|
||||
error). (Kamil Tekiela)
|
||||
|
||||
- Opcache:
|
||||
. Fixed bug #80839 (PHP problem with JIT). (Dmitry)
|
||||
. Fixed bug #80861 (erronous array key overflow in 2D array with JIT).
|
||||
(Dmitry)
|
||||
. Fixed bug #80786 (PHP crash using JIT). (Nikita)
|
||||
. Fixed bug #80782 (DASM_S_RANGE_VREG on PHP_INT_MIN-1). (Dmitry)
|
||||
|
||||
- Pcntl:
|
||||
. Fixed bug #79812 (Potential integer overflow in pcntl_exec()). (cmb)
|
||||
|
||||
- PCRE:
|
||||
. Fixed bug #80866 (preg_split ignores limit flag when pattern with \K has
|
||||
0-width fullstring match). (Kamil Tekiela)
|
||||
|
||||
- PDO_ODBC:
|
||||
. Fixed bug #80783 (PDO ODBC truncates BLOB records at every 256th byte).
|
||||
(cmb)
|
||||
|
||||
- PDO_pgsql:
|
||||
. Fixed bug #80892 (PDO::PARAM_INT is treated the same as PDO::PARAM_STR).
|
||||
(Matteo)
|
||||
|
||||
- Session:
|
||||
. Fixed bug #80889 (Cannot set save handler when save_handler is invalid).
|
||||
(cmb)
|
||||
. Fixed bug #80774 (session_name() problem with backslash). (cmb)
|
||||
|
||||
- SOAP:
|
||||
. Fixed bug #69668 (SOAP special XML characters in namespace URIs not
|
||||
encoded). (cmb)
|
||||
|
||||
- Standard:
|
||||
. Fixed bug #80915 (Taking a reference to $_SERVER hides its values from
|
||||
phpinfo()). (Rowan Tommins)
|
||||
. Fixed bug #80914 ('getdir' accidentally defined as an alias of 'dir').
|
||||
(Rowan Tommins)
|
||||
. Fixed bug #80771 (phpinfo(INFO_CREDITS) displays nothing in CLI). (cmb)
|
||||
. Fixed bug #78719 (http wrapper silently ignores long Location headers).
|
||||
(cmb)
|
||||
. Fixed bug #80838 (HTTP wrapper waits for HTTP 1 response after HTTP 101).
|
||||
(manuelm)
|
||||
|
||||
- Zip:
|
||||
. Fixed bug #80825 (ZipArchive::isCompressionMethodSupported does not exist).
|
||||
(cmb)
|
||||
|
||||
18 Feb 2021, PHP 8.0.3
|
||||
|
||||
- Core:
|
||||
. Fixed #80706 (mail(): Headers after Bcc headers may be ignored). (cmb)
|
||||
@@ -598,4 +691,3 @@ PHP NEWS
|
||||
. Fixed bug #71417 (fread() does not report zlib.inflate errors). (cmb)
|
||||
. Fixed bug #78792 (zlib.output_compression disabled by Content-Type: image/).
|
||||
(cmb)
|
||||
|
||||
+2
-2
@@ -729,13 +729,13 @@ TSRM_API size_t tsrm_get_ls_cache_tcb_offset(void)
|
||||
#if defined(__APPLE__) && defined(__x86_64__)
|
||||
// TODO: Implement support for fast JIT ZTS code ???
|
||||
return 0;
|
||||
#elif defined(__x86_64__) && defined(__GNUC__)
|
||||
#elif defined(__x86_64__) && defined(__GNUC__) && !defined(__FreeBSD__)
|
||||
size_t ret;
|
||||
|
||||
asm ("movq _tsrm_ls_cache@gottpoff(%%rip),%0"
|
||||
: "=r" (ret));
|
||||
return ret;
|
||||
#elif defined(__i386__) && defined(__GNUC__)
|
||||
#elif defined(__i386__) && defined(__GNUC__) && !defined(__FreeBSD__)
|
||||
size_t ret;
|
||||
|
||||
asm ("leal _tsrm_ls_cache@ntpoff,%0"
|
||||
|
||||
+1
-1
@@ -147,7 +147,7 @@ TSRM_API const char *tsrm_api_name(void);
|
||||
# define __has_attribute(x) 0
|
||||
#endif
|
||||
|
||||
#if !__has_attribute(tls_model)
|
||||
#if !__has_attribute(tls_model) || defined(__FreeBSD__)
|
||||
# define TSRM_TLS_MODEL_ATTR
|
||||
#elif __PIC__
|
||||
# define TSRM_TLS_MODEL_ATTR __attribute__((tls_model("initial-exec")))
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
--TEST--
|
||||
HT iterator should be destroyed if array becomes empty during array_splice
|
||||
--FILE--
|
||||
<?php
|
||||
$a=[4];
|
||||
$i = 0;
|
||||
foreach ($a as &$r) {
|
||||
var_dump($r);
|
||||
$a = array_splice($a, 0);
|
||||
if (++$i == 2) break;
|
||||
}
|
||||
?>
|
||||
--EXPECT--
|
||||
int(4)
|
||||
int(4)
|
||||
@@ -8,4 +8,4 @@ class A1 { }
|
||||
|
||||
?>
|
||||
--EXPECTF--
|
||||
Fatal error: Attribute::__construct(): Argument #1 ($flags) must must be of type int, string given in %s
|
||||
Fatal error: Attribute::__construct(): Argument #1 ($flags) must be of type int, string given in %s
|
||||
@@ -0,0 +1,31 @@
|
||||
--TEST--
|
||||
Bug #80781: Error handler that throws ErrorException infinite loop
|
||||
--FILE--
|
||||
<?php
|
||||
|
||||
function handle(int $severity, string $message, string $file, int $line): bool {
|
||||
if((error_reporting() & $severity) !== 0) {
|
||||
throw new \ErrorException($message, 0, $severity, $file, $line);
|
||||
}
|
||||
|
||||
return true; // stfu operator
|
||||
}
|
||||
|
||||
set_error_handler('handle');
|
||||
|
||||
function getPlugin(string $plugin) : bool{
|
||||
return false;
|
||||
}
|
||||
|
||||
$data = [];
|
||||
$array = [];
|
||||
if (isset($array[$data]) or getPlugin($data)) {
|
||||
|
||||
}
|
||||
|
||||
?>
|
||||
--EXPECTF--
|
||||
Fatal error: Uncaught TypeError: Illegal offset type in isset or empty in %s:%d
|
||||
Stack trace:
|
||||
#0 {main}
|
||||
thrown in %s on line %d
|
||||
@@ -0,0 +1,19 @@
|
||||
--TEST--
|
||||
Bug #80811: Function exec without $output but with $restult_code parameter crashes
|
||||
--FILE--
|
||||
<?php
|
||||
|
||||
echo 'Executing with all params:' . PHP_EOL;
|
||||
exec('echo Something', output: $output, result_code: $resultCode);
|
||||
var_dump($resultCode);
|
||||
|
||||
echo 'Executing without output param:' . PHP_EOL;
|
||||
exec('echo Something', result_code: $resultCode);
|
||||
var_dump($resultCode);
|
||||
|
||||
?>
|
||||
--EXPECT--
|
||||
Executing with all params:
|
||||
int(0)
|
||||
Executing without output param:
|
||||
int(0)
|
||||
@@ -0,0 +1,30 @@
|
||||
--TEST--
|
||||
Dynamic static call of non-static method
|
||||
--FILE--
|
||||
<?php
|
||||
class Foo {
|
||||
function test1() {
|
||||
$method = ['Foo', 'bar'];
|
||||
$method();
|
||||
}
|
||||
function test2() {
|
||||
$method = 'Foo::bar';
|
||||
$method();
|
||||
}
|
||||
function __call($name, $args) {}
|
||||
}
|
||||
$x = new Foo;
|
||||
try {
|
||||
$x->test1();
|
||||
} catch (Error $e) {
|
||||
echo $e->getMessage(), "\n";
|
||||
}
|
||||
try {
|
||||
$x->test2();
|
||||
} catch (Error $e) {
|
||||
echo $e->getMessage(), "\n";
|
||||
}
|
||||
?>
|
||||
--EXPECT--
|
||||
Non-static method Foo::bar() cannot be called statically
|
||||
Non-static method Foo::bar() cannot be called statically
|
||||
+1
-1
@@ -20,7 +20,7 @@
|
||||
#ifndef ZEND_H
|
||||
#define ZEND_H
|
||||
|
||||
#define ZEND_VERSION "4.0.3-dev"
|
||||
#define ZEND_VERSION "4.0.5"
|
||||
|
||||
#define ZEND_ENGINE_3
|
||||
|
||||
|
||||
+1
-1
@@ -1099,7 +1099,7 @@ static zend_always_inline void zend_mm_free_pages_ex(zend_mm_heap *heap, zend_mm
|
||||
/* this setting may be not accurate */
|
||||
chunk->free_tail = page_num;
|
||||
}
|
||||
if (free_chunk && chunk->free_pages == ZEND_MM_PAGES - ZEND_MM_FIRST_PAGE) {
|
||||
if (free_chunk && chunk != heap->main_chunk && chunk->free_pages == ZEND_MM_PAGES - ZEND_MM_FIRST_PAGE) {
|
||||
zend_mm_delete_chunk(heap, chunk);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -42,7 +42,7 @@ void validate_attribute(zend_attribute *attr, uint32_t target, zend_class_entry
|
||||
|
||||
if (Z_TYPE(flags) != IS_LONG) {
|
||||
zend_error_noreturn(E_ERROR,
|
||||
"Attribute::__construct(): Argument #1 ($flags) must must be of type int, %s given",
|
||||
"Attribute::__construct(): Argument #1 ($flags) must be of type int, %s given",
|
||||
zend_zval_type_name(&flags)
|
||||
);
|
||||
}
|
||||
|
||||
+15
-4
@@ -54,11 +54,11 @@
|
||||
# define ZEND_VM_FP_GLOBAL_REG "%r14"
|
||||
# define ZEND_VM_IP_GLOBAL_REG "%r15"
|
||||
# elif defined(__GNUC__) && ZEND_GCC_VERSION >= 4008 && defined(__powerpc64__)
|
||||
# define ZEND_VM_FP_GLOBAL_REG "r28"
|
||||
# define ZEND_VM_IP_GLOBAL_REG "r29"
|
||||
# define ZEND_VM_FP_GLOBAL_REG "r14"
|
||||
# define ZEND_VM_IP_GLOBAL_REG "r15"
|
||||
# elif defined(__IBMC__) && ZEND_GCC_VERSION >= 4002 && defined(__powerpc64__)
|
||||
# define ZEND_VM_FP_GLOBAL_REG "r28"
|
||||
# define ZEND_VM_IP_GLOBAL_REG "r29"
|
||||
# define ZEND_VM_FP_GLOBAL_REG "r14"
|
||||
# define ZEND_VM_IP_GLOBAL_REG "r15"
|
||||
# elif defined(__GNUC__) && ZEND_GCC_VERSION >= 4008 && defined(__aarch64__)
|
||||
# define ZEND_VM_FP_GLOBAL_REG "x27"
|
||||
# define ZEND_VM_IP_GLOBAL_REG "x28"
|
||||
@@ -4005,6 +4005,10 @@ static zend_never_inline zend_execute_data *zend_init_dynamic_call_string(zend_s
|
||||
|
||||
if (UNEXPECTED(!(fbc->common.fn_flags & ZEND_ACC_STATIC))) {
|
||||
zend_non_static_method_call(fbc);
|
||||
if (fbc->common.fn_flags & ZEND_ACC_CALL_VIA_TRAMPOLINE) {
|
||||
zend_string_release_ex(fbc->common.function_name, 0);
|
||||
zend_free_trampoline(fbc);
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
|
||||
@@ -4129,6 +4133,10 @@ static zend_never_inline zend_execute_data *zend_init_dynamic_call_array(zend_ar
|
||||
}
|
||||
if (!(fbc->common.fn_flags & ZEND_ACC_STATIC)) {
|
||||
zend_non_static_method_call(fbc);
|
||||
if (fbc->common.fn_flags & ZEND_ACC_CALL_VIA_TRAMPOLINE) {
|
||||
zend_string_release_ex(fbc->common.function_name, 0);
|
||||
zend_free_trampoline(fbc);
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
object_or_called_scope = called_scope;
|
||||
@@ -4571,6 +4579,9 @@ ZEND_API zend_result ZEND_FASTCALL zend_handle_undef_args(zend_execute_data *cal
|
||||
}
|
||||
|
||||
ZVAL_COPY_VALUE(arg, &default_value);
|
||||
if (ZEND_ARG_SEND_MODE(arg_info) & ZEND_SEND_BY_REF) {
|
||||
ZVAL_NEW_REF(arg, arg);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -1655,10 +1655,10 @@ ZEND_API void ZEND_FASTCALL zend_array_destroy(HashTable *ht)
|
||||
} else if (EXPECTED(HT_FLAGS(ht) & HASH_FLAG_UNINITIALIZED)) {
|
||||
goto free_ht;
|
||||
}
|
||||
zend_hash_iterators_remove(ht);
|
||||
SET_INCONSISTENT(HT_DESTROYED);
|
||||
efree(HT_GET_DATA_ADDR(ht));
|
||||
free_ht:
|
||||
zend_hash_iterators_remove(ht);
|
||||
FREE_HASHTABLE(ht);
|
||||
}
|
||||
|
||||
|
||||
+2
-2
@@ -17,7 +17,7 @@ dnl Basic autoconf initialization, generation of config.nice.
|
||||
dnl ----------------------------------------------------------------------------
|
||||
|
||||
AC_PREREQ([2.68])
|
||||
AC_INIT([PHP],[8.0.3-dev],[https://bugs.php.net],[php],[https://www.php.net])
|
||||
AC_INIT([PHP],[8.0.5],[https://bugs.php.net],[php],[https://www.php.net])
|
||||
AC_CONFIG_SRCDIR([main/php_version.h])
|
||||
AC_CONFIG_AUX_DIR([build])
|
||||
AC_PRESERVE_HELP_ORDER
|
||||
@@ -524,7 +524,7 @@ dnl Fix for these systems is already included in GCC 7, but not on GCC 6.
|
||||
dnl
|
||||
dnl At least some versions of FreeBSD seem to have buggy ifunc support, see
|
||||
dnl bug #77284. Conservatively don't use ifuncs on FreeBSD.
|
||||
AS_CASE([$host_alias], [*-*-*android*|*-*-*uclibc*|*-*-*musl*|*freebsd*], [true], [
|
||||
AS_CASE([$host_alias], [*-*-*android*|*-*-*uclibc*|*-*-*musl*|*freebsd*|*openbsd*], [true], [
|
||||
AX_GCC_FUNC_ATTRIBUTE([ifunc])
|
||||
AX_GCC_FUNC_ATTRIBUTE([target])
|
||||
])
|
||||
|
||||
+10
-3
@@ -39,6 +39,7 @@ typedef struct _php_bz2_filter_data {
|
||||
enum strm_status status; /* Decompress option */
|
||||
unsigned int small_footprint : 1; /* Decompress option */
|
||||
unsigned int expect_concatenated : 1; /* Decompress option */
|
||||
unsigned int is_flushed : 1; /* only for compression */
|
||||
|
||||
int persistent;
|
||||
} php_bz2_filter_data;
|
||||
@@ -227,6 +228,8 @@ static php_stream_filter_status_t php_bz2_compress_filter(
|
||||
bucket = php_stream_bucket_make_writeable(buckets_in->head);
|
||||
|
||||
while (bin < bucket->buflen) {
|
||||
int flush_mode;
|
||||
|
||||
desired = bucket->buflen - bin;
|
||||
if (desired > data->inbuf_len) {
|
||||
desired = data->inbuf_len;
|
||||
@@ -234,7 +237,9 @@ static php_stream_filter_status_t php_bz2_compress_filter(
|
||||
memcpy(data->strm.next_in, bucket->buf + bin, desired);
|
||||
data->strm.avail_in = desired;
|
||||
|
||||
status = BZ2_bzCompress(&(data->strm), flags & PSFS_FLAG_FLUSH_CLOSE ? BZ_FINISH : (flags & PSFS_FLAG_FLUSH_INC ? BZ_FLUSH : BZ_RUN));
|
||||
flush_mode = flags & PSFS_FLAG_FLUSH_CLOSE ? BZ_FINISH : (flags & PSFS_FLAG_FLUSH_INC ? BZ_FLUSH : BZ_RUN);
|
||||
data->is_flushed = flush_mode != BZ_RUN;
|
||||
status = BZ2_bzCompress(&(data->strm), flush_mode);
|
||||
if (status != BZ_RUN_OK && status != BZ_FLUSH_OK && status != BZ_FINISH_OK) {
|
||||
/* Something bad happened */
|
||||
php_stream_bucket_delref(bucket);
|
||||
@@ -260,11 +265,12 @@ static php_stream_filter_status_t php_bz2_compress_filter(
|
||||
php_stream_bucket_delref(bucket);
|
||||
}
|
||||
|
||||
if (flags & PSFS_FLAG_FLUSH_CLOSE) {
|
||||
if (flags & PSFS_FLAG_FLUSH_CLOSE || ((flags & PSFS_FLAG_FLUSH_INC) && !data->is_flushed)) {
|
||||
/* Spit it out! */
|
||||
status = BZ_FINISH_OK;
|
||||
while (status == BZ_FINISH_OK) {
|
||||
status = BZ2_bzCompress(&(data->strm), BZ_FINISH);
|
||||
status = BZ2_bzCompress(&(data->strm), (flags & PSFS_FLAG_FLUSH_CLOSE ? BZ_FINISH : BZ_FLUSH));
|
||||
data->is_flushed = 1;
|
||||
if (data->strm.avail_out < data->outbuf_len) {
|
||||
size_t bucketlen = data->outbuf_len - data->strm.avail_out;
|
||||
|
||||
@@ -380,6 +386,7 @@ static php_stream_filter *php_bz2_filter_create(const char *filtername, zval *fi
|
||||
}
|
||||
|
||||
status = BZ2_bzCompressInit(&(data->strm), blockSize100k, 0, workFactor);
|
||||
data->is_flushed = 1;
|
||||
fops = &php_bz2_compress_ops;
|
||||
} else {
|
||||
status = BZ_DATA_ERROR;
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
--TEST--
|
||||
Bug #75776 (Flushing streams with compression filter is broken)
|
||||
--SKIPIF--
|
||||
<?php
|
||||
if (!extension_loaded('bz2')) die('skip bz2 extension not available');
|
||||
?>
|
||||
--FILE--
|
||||
<?php
|
||||
$text = str_repeat('0123456789abcdef', 1000);
|
||||
|
||||
$temp = fopen('php://temp', 'r+');
|
||||
stream_filter_append($temp, 'bzip2.compress', STREAM_FILTER_WRITE);
|
||||
fwrite($temp, $text);
|
||||
|
||||
rewind($temp);
|
||||
|
||||
var_dump(bin2hex(stream_get_contents($temp)));
|
||||
var_dump(ftell($temp));
|
||||
|
||||
fclose($temp);
|
||||
?>
|
||||
--EXPECT--
|
||||
string(144) "425a68343141592653599fe7bbbf0001f389007fe03f002000902980026826aa80003ea9061520c6a41954833a9069520d6a41b54837a9071520e6a41d5483ba9079520f6a41f548"
|
||||
int(72)
|
||||
+2
-2
@@ -863,9 +863,9 @@ restart:
|
||||
zend_bool close_both;
|
||||
|
||||
close_both = (info->fp != info->lock.fp);
|
||||
php_stream_close(info->lock.fp);
|
||||
php_stream_free(info->lock.fp, persistent ? PHP_STREAM_FREE_CLOSE_PERSISTENT : PHP_STREAM_FREE_CLOSE);
|
||||
if (close_both) {
|
||||
php_stream_close(info->fp);
|
||||
php_stream_free(info->fp, persistent ? PHP_STREAM_FREE_CLOSE_PERSISTENT : PHP_STREAM_FREE_CLOSE);
|
||||
}
|
||||
info->fp = NULL;
|
||||
info->lock.fp = NULL;
|
||||
|
||||
+7
-3
@@ -1243,9 +1243,13 @@ int dom_hierarchy(xmlNodePtr parent, xmlNodePtr child)
|
||||
{
|
||||
xmlNodePtr nodep;
|
||||
|
||||
if (parent == NULL || child == NULL || child->doc != parent->doc) {
|
||||
return SUCCESS;
|
||||
}
|
||||
if (parent == NULL || child == NULL || child->doc != parent->doc) {
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
if (child->type == XML_DOCUMENT_NODE) {
|
||||
return FAILURE;
|
||||
}
|
||||
|
||||
nodep = parent;
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@ require_once __DIR__ .'/skipif.inc';
|
||||
?>
|
||||
--FILE--
|
||||
<?php
|
||||
$filename = __DIR__."/tmp_savehtmlfile".time().".html";
|
||||
$filename = __DIR__."/DOMDocument_saveHTMLFile_basic.html";
|
||||
$doc = new DOMDocument('1.0');
|
||||
$root = $doc->createElement('html');
|
||||
$root = $doc->appendChild($root);
|
||||
|
||||
@@ -9,7 +9,7 @@ require_once __DIR__ .'/skipif.inc';
|
||||
?>
|
||||
--FILE--
|
||||
<?php
|
||||
$filename = __DIR__."/tmp_savehtmlfile".time().".html";
|
||||
$filename = __DIR__."/DOMDocument_saveHTMLFile_formatOutput.html";
|
||||
$doc = new DOMDocument('1.0');
|
||||
$doc->formatOutput = true;
|
||||
$root = $doc->createElement('html');
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
--TEST--
|
||||
Bug #66783 (UAF when appending DOMDocument to element)
|
||||
--SKIPIF--
|
||||
<?php
|
||||
if (!extension_loaded('dom')) die('skip dom extension not available');
|
||||
?>
|
||||
--FILE--
|
||||
<?php
|
||||
$doc = new DomDocument;
|
||||
$doc->loadXML('<root></root>');
|
||||
$e = $doc->createElement('e');
|
||||
try {
|
||||
$e->appendChild($doc);
|
||||
} catch (DOMException $ex) {
|
||||
echo $ex->getMessage(), PHP_EOL;
|
||||
}
|
||||
?>
|
||||
--EXPECTF--
|
||||
Hierarchy Request Error
|
||||
@@ -1,5 +1,7 @@
|
||||
--TEST--
|
||||
Bug #79852: count(DOMNodeList) doesn't match count(IteratorIterator(DOMNodeList))
|
||||
--SKIPIF--
|
||||
<?php require_once('skipif.inc'); ?>
|
||||
--FILE--
|
||||
<?php
|
||||
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
--TEST--
|
||||
dom: DOMChildNode::remove does not work on character data
|
||||
--SKIPIF--
|
||||
<?php require_once('skipif.inc'); ?>
|
||||
--FILE--
|
||||
<?php
|
||||
|
||||
|
||||
+53
-34
@@ -293,57 +293,85 @@ static int zend_ffi_is_compatible_type(zend_ffi_type *dst_type, zend_ffi_type *s
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
static ffi_type *zend_ffi_make_fake_struct_type(zend_ffi_type *type) /* {{{ */
|
||||
static ffi_type* zend_ffi_face_struct_add_fields(ffi_type* t, zend_ffi_type *type, int *i, size_t size)
|
||||
{
|
||||
ffi_type *t = emalloc(sizeof(ffi_type) + sizeof(ffi_type*) * (zend_hash_num_elements(&type->record.fields) + 1));
|
||||
int i;
|
||||
zend_ffi_field *field;
|
||||
|
||||
t->size = type->size;
|
||||
t->alignment = type->align;
|
||||
t->type = FFI_TYPE_STRUCT;
|
||||
t->elements = (ffi_type**)(t + 1);
|
||||
i = 0;
|
||||
ZEND_HASH_FOREACH_PTR(&type->record.fields, field) {
|
||||
switch (ZEND_FFI_TYPE(field->type)->kind) {
|
||||
case ZEND_FFI_TYPE_FLOAT:
|
||||
t->elements[i] = &ffi_type_float;
|
||||
t->elements[(*i)++] = &ffi_type_float;
|
||||
break;
|
||||
case ZEND_FFI_TYPE_DOUBLE:
|
||||
t->elements[i] = &ffi_type_double;
|
||||
t->elements[(*i)++] = &ffi_type_double;
|
||||
break;
|
||||
#ifdef HAVE_LONG_DOUBLE
|
||||
case ZEND_FFI_TYPE_LONGDOUBLE:
|
||||
t->elements[i] = &ffi_type_longdouble;
|
||||
t->elements[(*i)++] = &ffi_type_longdouble;
|
||||
break;
|
||||
#endif
|
||||
case ZEND_FFI_TYPE_SINT8:
|
||||
case ZEND_FFI_TYPE_UINT8:
|
||||
case ZEND_FFI_TYPE_BOOL:
|
||||
case ZEND_FFI_TYPE_CHAR:
|
||||
t->elements[i] = &ffi_type_uint8;
|
||||
t->elements[(*i)++] = &ffi_type_uint8;
|
||||
break;
|
||||
case ZEND_FFI_TYPE_SINT16:
|
||||
case ZEND_FFI_TYPE_UINT16:
|
||||
t->elements[i] = &ffi_type_uint16;
|
||||
t->elements[(*i)++] = &ffi_type_uint16;
|
||||
break;
|
||||
case ZEND_FFI_TYPE_SINT32:
|
||||
case ZEND_FFI_TYPE_UINT32:
|
||||
t->elements[i] = &ffi_type_uint32;
|
||||
t->elements[(*i)++] = &ffi_type_uint32;
|
||||
break;
|
||||
case ZEND_FFI_TYPE_SINT64:
|
||||
case ZEND_FFI_TYPE_UINT64:
|
||||
t->elements[i] = &ffi_type_uint64;
|
||||
t->elements[(*i)++] = &ffi_type_uint64;
|
||||
break;
|
||||
case ZEND_FFI_TYPE_POINTER:
|
||||
t->elements[i] = &ffi_type_pointer;
|
||||
t->elements[(*i)++] = &ffi_type_pointer;
|
||||
break;
|
||||
case ZEND_FFI_TYPE_STRUCT: {
|
||||
zend_ffi_type *field_type = ZEND_FFI_TYPE(field->type);
|
||||
/* for unions we use only the first field */
|
||||
int num_fields = !(field_type->attr & ZEND_FFI_ATTR_UNION) ?
|
||||
zend_hash_num_elements(&field_type->record.fields) : 1;
|
||||
|
||||
if (num_fields > 1) {
|
||||
size += sizeof(ffi_type*) * (num_fields - 1);
|
||||
t = erealloc(t, size);
|
||||
t->elements = (ffi_type**)(t + 1);
|
||||
}
|
||||
t = zend_ffi_face_struct_add_fields(t, field_type, i, size);
|
||||
break;
|
||||
default:
|
||||
efree(t);
|
||||
return NULL;
|
||||
}
|
||||
i++;
|
||||
default:
|
||||
t->elements[(*i)++] = &ffi_type_void;
|
||||
break;
|
||||
}
|
||||
if (type->attr & ZEND_FFI_ATTR_UNION) {
|
||||
/* for unions we use only the first field */
|
||||
break;
|
||||
}
|
||||
} ZEND_HASH_FOREACH_END();
|
||||
return t;
|
||||
}
|
||||
|
||||
static ffi_type *zend_ffi_make_fake_struct_type(zend_ffi_type *type) /* {{{ */
|
||||
{
|
||||
/* for unions we use only the first field */
|
||||
int num_fields = !(type->attr & ZEND_FFI_ATTR_UNION) ?
|
||||
zend_hash_num_elements(&type->record.fields) : 1;
|
||||
size_t size = sizeof(ffi_type) + sizeof(ffi_type*) * (num_fields + 1);
|
||||
ffi_type *t = emalloc(size);
|
||||
int i;
|
||||
|
||||
t->size = type->size;
|
||||
t->alignment = type->align;
|
||||
t->type = FFI_TYPE_STRUCT;
|
||||
t->elements = (ffi_type**)(t + 1);
|
||||
i = 0;
|
||||
t = zend_ffi_face_struct_add_fields(t, type, &i, size);
|
||||
t->elements[i] = NULL;
|
||||
return t;
|
||||
}
|
||||
@@ -391,11 +419,7 @@ again:
|
||||
kind = type->enumeration.kind;
|
||||
goto again;
|
||||
case ZEND_FFI_TYPE_STRUCT:
|
||||
if (!(type->attr & ZEND_FFI_ATTR_UNION)) {
|
||||
ffi_type *t = zend_ffi_make_fake_struct_type(type);
|
||||
return t;
|
||||
}
|
||||
break;
|
||||
return zend_ffi_make_fake_struct_type(type);
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -2534,18 +2558,13 @@ again:
|
||||
kind = type->enumeration.kind;
|
||||
goto again;
|
||||
case ZEND_FFI_TYPE_STRUCT:
|
||||
if (!(type->attr & ZEND_FFI_ATTR_UNION)
|
||||
&& Z_TYPE_P(arg) == IS_OBJECT && Z_OBJCE_P(arg) == zend_ffi_cdata_ce) {
|
||||
if (Z_TYPE_P(arg) == IS_OBJECT && Z_OBJCE_P(arg) == zend_ffi_cdata_ce) {
|
||||
zend_ffi_cdata *cdata = (zend_ffi_cdata*)Z_OBJ_P(arg);
|
||||
|
||||
if (zend_ffi_is_compatible_type(type, ZEND_FFI_TYPE(cdata->type))) {
|
||||
/* Create a fake structure type */
|
||||
ffi_type *t = zend_ffi_make_fake_struct_type(type);
|
||||
if (t) {
|
||||
*pass_type = t;
|
||||
arg_values[n] = cdata->ptr;
|
||||
break;
|
||||
}
|
||||
*pass_type = zend_ffi_make_fake_struct_type(type);;
|
||||
arg_values[n] = cdata->ptr;
|
||||
break;
|
||||
}
|
||||
}
|
||||
zend_ffi_pass_incompatible(arg, type, n, execute_data);
|
||||
|
||||
@@ -0,0 +1,68 @@
|
||||
--TEST--
|
||||
Bug #80847 (Nested structs)
|
||||
--SKIPIF--
|
||||
<?php
|
||||
if (!extension_loaded('ffi')) die('skip ffi extension not available');
|
||||
if (!extension_loaded('zend-test')) die('skip zend-test extension not available');
|
||||
if (PHP_OS_FAMILY == 'Windows' && ((1 << 31) > 0)) die('xfail libffi doesn\'t properly support passing big strctures by value on Windows/64');
|
||||
?>
|
||||
--FILE--
|
||||
<?php
|
||||
require_once('utils.inc');
|
||||
$header = <<<HEADER
|
||||
typedef struct bug80847_01 {
|
||||
uint64_t b;
|
||||
double c;
|
||||
} bug80847_01;
|
||||
|
||||
typedef struct bug80847_02 {
|
||||
bug80847_01 a;
|
||||
} bug80847_02;
|
||||
|
||||
bug80847_02 ffi_bug80847(bug80847_02 s);
|
||||
HEADER;
|
||||
|
||||
if (PHP_OS_FAMILY !== 'Windows') {
|
||||
$ffi = FFI::cdef($header);
|
||||
} else {
|
||||
try {
|
||||
$ffi = FFI::cdef($header, 'php_zend_test.dll');
|
||||
} catch (FFI\Exception $ex) {
|
||||
$ffi = FFI::cdef($header, ffi_get_php_dll_name());
|
||||
}
|
||||
}
|
||||
$x = $ffi->new('bug80847_02');
|
||||
$x->a->b = 42;
|
||||
$x->a->c = 42.5;
|
||||
var_dump($x);
|
||||
$y = $ffi->ffi_bug80847($x);
|
||||
var_dump($x, $y);
|
||||
?>
|
||||
--EXPECTF--
|
||||
object(FFI\CData:struct bug80847_02)#%d (1) {
|
||||
["a"]=>
|
||||
object(FFI\CData:struct bug80847_01)#%d (2) {
|
||||
["b"]=>
|
||||
int(42)
|
||||
["c"]=>
|
||||
float(42.5)
|
||||
}
|
||||
}
|
||||
object(FFI\CData:struct bug80847_02)#%d (1) {
|
||||
["a"]=>
|
||||
object(FFI\CData:struct bug80847_01)#%d (2) {
|
||||
["b"]=>
|
||||
int(42)
|
||||
["c"]=>
|
||||
float(42.5)
|
||||
}
|
||||
}
|
||||
object(FFI\CData:struct bug80847_02)#%d (1) {
|
||||
["a"]=>
|
||||
object(FFI\CData:struct bug80847_01)#%d (2) {
|
||||
["b"]=>
|
||||
int(52)
|
||||
["c"]=>
|
||||
float(32.5)
|
||||
}
|
||||
}
|
||||
@@ -1886,6 +1886,12 @@ static void ftp_ssl_shutdown(ftpbuf_t *ftp, php_socket_t fd, SSL *ssl_handle) {
|
||||
/* SSL wants a write. Really odd. Let's bail out. */
|
||||
done = 1;
|
||||
break;
|
||||
case SSL_ERROR_SYSCALL:
|
||||
/* most likely the peer closed the connection without
|
||||
sending a close_notify shutdown alert;
|
||||
bail out to avoid raising a spurious warning */
|
||||
done = 1;
|
||||
break;
|
||||
default:
|
||||
if ((sslerror = ERR_get_error())) {
|
||||
ERR_error_string_n(sslerror, buf, sizeof(buf));
|
||||
|
||||
+1
-1
@@ -2601,7 +2601,7 @@ PHP_FUNCTION(imageinterlace)
|
||||
gdImageInterlace(im, INT);
|
||||
}
|
||||
|
||||
RETURN_LONG(gdImageGetInterlaced(im));
|
||||
RETURN_BOOL(gdImageGetInterlaced(im));
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
|
||||
+2
-2
@@ -177,9 +177,9 @@ function imagefill(GdImage $image, int $x, int $y, int $color): bool {}
|
||||
|
||||
function imagecolorstotal(GdImage $image): int {}
|
||||
|
||||
function imagecolortransparent(GdImage $image, ?int $color = null): ?int {}
|
||||
function imagecolortransparent(GdImage $image, ?int $color = null): int {}
|
||||
|
||||
function imageinterlace(GdImage $image, ?bool $enable = null): ?int {}
|
||||
function imageinterlace(GdImage $image, ?bool $enable = null): bool {}
|
||||
|
||||
function imagepolygon(GdImage $image, array $points, int $num_points_or_color, ?int $color = null): bool {}
|
||||
|
||||
|
||||
+3
-3
@@ -1,5 +1,5 @@
|
||||
/* This is a generated file, edit the .stub.php file instead.
|
||||
* Stub hash: 63898b501cc3ae38585fe0c6f70a9f7865fbee4d */
|
||||
* Stub hash: 012a149dba5332fcb73544771b881fc7e6d53925 */
|
||||
|
||||
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_gd_info, 0, 0, IS_ARRAY, 0)
|
||||
ZEND_END_ARG_INFO()
|
||||
@@ -358,12 +358,12 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imagecolorstotal, 0, 1, IS_LONG,
|
||||
ZEND_ARG_OBJ_INFO(0, image, GdImage, 0)
|
||||
ZEND_END_ARG_INFO()
|
||||
|
||||
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imagecolortransparent, 0, 1, IS_LONG, 1)
|
||||
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imagecolortransparent, 0, 1, IS_LONG, 0)
|
||||
ZEND_ARG_OBJ_INFO(0, image, GdImage, 0)
|
||||
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, color, IS_LONG, 1, "null")
|
||||
ZEND_END_ARG_INFO()
|
||||
|
||||
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imageinterlace, 0, 1, IS_LONG, 1)
|
||||
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imageinterlace, 0, 1, _IS_BOOL, 0)
|
||||
ZEND_ARG_OBJ_INFO(0, image, GdImage, 0)
|
||||
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, enable, _IS_BOOL, 1, "null")
|
||||
ZEND_END_ARG_INFO()
|
||||
|
||||
@@ -8,14 +8,14 @@ if (!extension_loaded('gd')) die('skip gd extension not available');
|
||||
<?php
|
||||
$im = imagecreatetruecolor(10, 10);
|
||||
imagefilledrectangle($im, 0, 0, 9, 9, imagecolorallocate($im, 255, 255, 255));
|
||||
imageinterlace($im, 1);
|
||||
imageinterlace($im, true);
|
||||
imagegif($im, __DIR__ . 'bug77700.gif');
|
||||
|
||||
$im = imagecreatefromgif(__DIR__ . 'bug77700.gif');
|
||||
var_dump(imageinterlace($im));
|
||||
?>
|
||||
--EXPECT--
|
||||
int(1)
|
||||
bool(true)
|
||||
--CLEAN--
|
||||
<?php
|
||||
unlink(__DIR__ . 'bug77700.gif');
|
||||
|
||||
@@ -14,4 +14,4 @@ $image = imagecreatetruecolor(100, 100);
|
||||
var_dump(imageinterlace($image));
|
||||
?>
|
||||
--EXPECT--
|
||||
int(0)
|
||||
bool(false)
|
||||
@@ -12,9 +12,9 @@ if (!extension_loaded("gd")) die("skip GD not present");
|
||||
|
||||
$image = imagecreatetruecolor(100, 100);
|
||||
|
||||
var_dump(imageinterlace($image, 1));
|
||||
var_dump(imageinterlace($image, true));
|
||||
var_dump(imageinterlace($image));
|
||||
?>
|
||||
--EXPECT--
|
||||
int(1)
|
||||
int(1)
|
||||
bool(true)
|
||||
bool(true)
|
||||
@@ -13,12 +13,12 @@ if (!extension_loaded("gd")) die("skip GD not present");
|
||||
$image = imagecreatetruecolor(100, 100);
|
||||
|
||||
//setting the interlace bit to on
|
||||
imageinterlace($image, 1);
|
||||
imageinterlace($image, true);
|
||||
|
||||
//setting de interlace bit to off
|
||||
var_dump(imageinterlace($image, 0));
|
||||
var_dump(imageinterlace($image, false));
|
||||
var_dump(imageinterlace($image));
|
||||
?>
|
||||
--EXPECT--
|
||||
int(0)
|
||||
int(0)
|
||||
bool(false)
|
||||
bool(false)
|
||||
+66
-2
@@ -735,7 +735,11 @@ PHP_FUNCTION(imap_open)
|
||||
RETURN_THROWS();
|
||||
}
|
||||
|
||||
if (flags && ((flags & ~(OP_READONLY | OP_ANONYMOUS | OP_HALFOPEN | CL_EXPUNGE | OP_DEBUG | OP_SHORTCACHE
|
||||
/* Check for PHP_EXPUNGE and not CL_EXPUNGE as the user land facing CL_EXPUNGE constant is defined
|
||||
* to something different to prevent clashes between CL_EXPUNGE and an OP_* constant allowing setting
|
||||
* the CL_EXPUNGE flag which will expunge when the mailbox is closed (be that manually, or via the
|
||||
* IMAPConnection object being destroyed naturally at the end of the PHP script */
|
||||
if (flags && ((flags & ~(OP_READONLY | OP_ANONYMOUS | OP_HALFOPEN | PHP_EXPUNGE | OP_DEBUG | OP_SHORTCACHE
|
||||
| OP_SILENT | OP_PROTOTYPE | OP_SECURE)) != 0)) {
|
||||
zend_argument_value_error(4, "must be a bitmask of the OP_* constants, and CL_EXPUNGE");
|
||||
RETURN_THROWS();
|
||||
@@ -858,7 +862,11 @@ PHP_FUNCTION(imap_reopen)
|
||||
}
|
||||
|
||||
/* TODO Verify these are the only options available as they are pulled from the php.net documentation */
|
||||
if (options && ((options & ~(OP_READONLY | OP_ANONYMOUS | OP_HALFOPEN | OP_EXPUNGE | CL_EXPUNGE)) != 0)) {
|
||||
/* Check for PHP_EXPUNGE and not CL_EXPUNGE as the user land facing CL_EXPUNGE constant is defined
|
||||
* to something different to prevent clashes between CL_EXPUNGE and an OP_* constant allowing setting
|
||||
* the CL_EXPUNGE flag which will expunge when the mailbox is closed (be that manually, or via the
|
||||
* IMAPConnection object being destroyed naturally at the end of the PHP script */
|
||||
if (options && ((options & ~(OP_READONLY | OP_ANONYMOUS | OP_HALFOPEN | OP_EXPUNGE | PHP_EXPUNGE)) != 0)) {
|
||||
zend_argument_value_error(3, "must be a bitmask of OP_READONLY, OP_ANONYMOUS, OP_HALFOPEN, "
|
||||
"OP_EXPUNGE, and CL_EXPUNGE");
|
||||
RETURN_THROWS();
|
||||
@@ -3055,6 +3063,23 @@ PHP_FUNCTION(imap_fetch_overview)
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
static zend_bool header_injection(zend_string *str, zend_bool adrlist)
|
||||
{
|
||||
char *p = ZSTR_VAL(str);
|
||||
|
||||
while ((p = strpbrk(p, "\r\n")) != NULL) {
|
||||
if (!(p[0] == '\r' && p[1] == '\n')
|
||||
/* adrlists do not support folding, but swallow trailing line breaks */
|
||||
&& !((adrlist && p[1] == '\0')
|
||||
/* other headers support folding */
|
||||
|| !adrlist && (p[1] == ' ' || p[1] == '\t'))) {
|
||||
return 1;
|
||||
}
|
||||
p++;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* {{{ Create a MIME message based on given envelope and body sections */
|
||||
PHP_FUNCTION(imap_mail_compose)
|
||||
{
|
||||
@@ -3078,6 +3103,13 @@ PHP_FUNCTION(imap_mail_compose)
|
||||
zend_argument_value_error(2, "cannot be empty");
|
||||
}
|
||||
|
||||
#define CHECK_HEADER_INJECTION(zstr, adrlist, header) \
|
||||
if (header_injection(zstr, adrlist)) { \
|
||||
php_error_docref(NULL, E_WARNING, "header injection attempt in " header); \
|
||||
RETVAL_FALSE; \
|
||||
goto done; \
|
||||
}
|
||||
|
||||
#define PHP_RFC822_PARSE_ADRLIST(target, value) \
|
||||
str_copy = estrndup(Z_STRVAL_P(value), Z_STRLEN_P(value)); \
|
||||
rfc822_parse_adrlist(target, str_copy, "NO HOST"); \
|
||||
@@ -3086,46 +3118,57 @@ PHP_FUNCTION(imap_mail_compose)
|
||||
env = mail_newenvelope();
|
||||
if ((pvalue = zend_hash_str_find(envelope, "remail", sizeof("remail") - 1)) != NULL) {
|
||||
convert_to_string_ex(pvalue);
|
||||
CHECK_HEADER_INJECTION(Z_STR_P(pvalue), 0, "remail");
|
||||
env->remail = cpystr(Z_STRVAL_P(pvalue));
|
||||
}
|
||||
if ((pvalue = zend_hash_str_find(envelope, "return_path", sizeof("return_path") - 1)) != NULL) {
|
||||
convert_to_string_ex(pvalue);
|
||||
CHECK_HEADER_INJECTION(Z_STR_P(pvalue), 1, "return_path");
|
||||
PHP_RFC822_PARSE_ADRLIST(&env->return_path, pvalue);
|
||||
}
|
||||
if ((pvalue = zend_hash_str_find(envelope, "date", sizeof("date") - 1)) != NULL) {
|
||||
convert_to_string_ex(pvalue);
|
||||
CHECK_HEADER_INJECTION(Z_STR_P(pvalue), 0, "date");
|
||||
env->date = (unsigned char*)cpystr(Z_STRVAL_P(pvalue));
|
||||
}
|
||||
if ((pvalue = zend_hash_str_find(envelope, "from", sizeof("from") - 1)) != NULL) {
|
||||
convert_to_string_ex(pvalue);
|
||||
CHECK_HEADER_INJECTION(Z_STR_P(pvalue), 1, "from");
|
||||
PHP_RFC822_PARSE_ADRLIST(&env->from, pvalue);
|
||||
}
|
||||
if ((pvalue = zend_hash_str_find(envelope, "reply_to", sizeof("reply_to") - 1)) != NULL) {
|
||||
convert_to_string_ex(pvalue);
|
||||
CHECK_HEADER_INJECTION(Z_STR_P(pvalue), 1, "reply_to");
|
||||
PHP_RFC822_PARSE_ADRLIST(&env->reply_to, pvalue);
|
||||
}
|
||||
if ((pvalue = zend_hash_str_find(envelope, "in_reply_to", sizeof("in_reply_to") - 1)) != NULL) {
|
||||
convert_to_string_ex(pvalue);
|
||||
CHECK_HEADER_INJECTION(Z_STR_P(pvalue), 0, "in_reply_to");
|
||||
env->in_reply_to = cpystr(Z_STRVAL_P(pvalue));
|
||||
}
|
||||
if ((pvalue = zend_hash_str_find(envelope, "subject", sizeof("subject") - 1)) != NULL) {
|
||||
convert_to_string_ex(pvalue);
|
||||
CHECK_HEADER_INJECTION(Z_STR_P(pvalue), 0, "subject");
|
||||
env->subject = cpystr(Z_STRVAL_P(pvalue));
|
||||
}
|
||||
if ((pvalue = zend_hash_str_find(envelope, "to", sizeof("to") - 1)) != NULL) {
|
||||
convert_to_string_ex(pvalue);
|
||||
CHECK_HEADER_INJECTION(Z_STR_P(pvalue), 1, "to");
|
||||
PHP_RFC822_PARSE_ADRLIST(&env->to, pvalue);
|
||||
}
|
||||
if ((pvalue = zend_hash_str_find(envelope, "cc", sizeof("cc") - 1)) != NULL) {
|
||||
convert_to_string_ex(pvalue);
|
||||
CHECK_HEADER_INJECTION(Z_STR_P(pvalue), 1, "cc");
|
||||
PHP_RFC822_PARSE_ADRLIST(&env->cc, pvalue);
|
||||
}
|
||||
if ((pvalue = zend_hash_str_find(envelope, "bcc", sizeof("bcc") - 1)) != NULL) {
|
||||
convert_to_string_ex(pvalue);
|
||||
CHECK_HEADER_INJECTION(Z_STR_P(pvalue), 1, "bcc");
|
||||
PHP_RFC822_PARSE_ADRLIST(&env->bcc, pvalue);
|
||||
}
|
||||
if ((pvalue = zend_hash_str_find(envelope, "message_id", sizeof("message_id") - 1)) != NULL) {
|
||||
convert_to_string_ex(pvalue);
|
||||
CHECK_HEADER_INJECTION(Z_STR_P(pvalue), 0, "message_id");
|
||||
env->message_id=cpystr(Z_STRVAL_P(pvalue));
|
||||
}
|
||||
|
||||
@@ -3136,6 +3179,7 @@ PHP_FUNCTION(imap_mail_compose)
|
||||
ZEND_HASH_FOREACH_VAL(Z_ARRVAL_P(pvalue), env_data) {
|
||||
custom_headers_param = mail_newbody_parameter();
|
||||
convert_to_string_ex(env_data);
|
||||
CHECK_HEADER_INJECTION(Z_STR_P(env_data), 0, "custom_headers");
|
||||
custom_headers_param->value = (char *) fs_get(Z_STRLEN_P(env_data) + 1);
|
||||
custom_headers_param->attribute = NULL;
|
||||
memcpy(custom_headers_param->value, Z_STRVAL_P(env_data), Z_STRLEN_P(env_data) + 1);
|
||||
@@ -3178,6 +3222,7 @@ PHP_FUNCTION(imap_mail_compose)
|
||||
}
|
||||
if ((pvalue = zend_hash_str_find(Z_ARRVAL_P(data), "charset", sizeof("charset") - 1)) != NULL) {
|
||||
convert_to_string_ex(pvalue);
|
||||
CHECK_HEADER_INJECTION(Z_STR_P(pvalue), 0, "body charset");
|
||||
tmp_param = mail_newbody_parameter();
|
||||
tmp_param->value = cpystr(Z_STRVAL_P(pvalue));
|
||||
tmp_param->attribute = cpystr("CHARSET");
|
||||
@@ -3190,9 +3235,11 @@ PHP_FUNCTION(imap_mail_compose)
|
||||
SEPARATE_ARRAY(pvalue);
|
||||
ZEND_HASH_FOREACH_STR_KEY_VAL(Z_ARRVAL_P(pvalue), key, disp_data) {
|
||||
if (key == NULL) continue;
|
||||
CHECK_HEADER_INJECTION(key, 0, "body disposition key");
|
||||
disp_param = mail_newbody_parameter();
|
||||
disp_param->attribute = cpystr(ZSTR_VAL(key));
|
||||
convert_to_string_ex(disp_data);
|
||||
CHECK_HEADER_INJECTION(Z_STR_P(disp_data), 0, "body disposition value");
|
||||
disp_param->value = (char *) fs_get(Z_STRLEN_P(disp_data) + 1);
|
||||
memcpy(disp_param->value, Z_STRVAL_P(disp_data), Z_STRLEN_P(disp_data) + 1);
|
||||
disp_param->next = tmp_param;
|
||||
@@ -3203,18 +3250,22 @@ PHP_FUNCTION(imap_mail_compose)
|
||||
}
|
||||
if ((pvalue = zend_hash_str_find(Z_ARRVAL_P(data), "subtype", sizeof("subtype") - 1)) != NULL) {
|
||||
convert_to_string_ex(pvalue);
|
||||
CHECK_HEADER_INJECTION(Z_STR_P(pvalue), 0, "body subtype");
|
||||
bod->subtype = cpystr(Z_STRVAL_P(pvalue));
|
||||
}
|
||||
if ((pvalue = zend_hash_str_find(Z_ARRVAL_P(data), "id", sizeof("id") - 1)) != NULL) {
|
||||
convert_to_string_ex(pvalue);
|
||||
CHECK_HEADER_INJECTION(Z_STR_P(pvalue), 0, "body id");
|
||||
bod->id = cpystr(Z_STRVAL_P(pvalue));
|
||||
}
|
||||
if ((pvalue = zend_hash_str_find(Z_ARRVAL_P(data), "description", sizeof("description") - 1)) != NULL) {
|
||||
convert_to_string_ex(pvalue);
|
||||
CHECK_HEADER_INJECTION(Z_STR_P(pvalue), 0, "body description");
|
||||
bod->description = cpystr(Z_STRVAL_P(pvalue));
|
||||
}
|
||||
if ((pvalue = zend_hash_str_find(Z_ARRVAL_P(data), "disposition.type", sizeof("disposition.type") - 1)) != NULL) {
|
||||
convert_to_string_ex(pvalue);
|
||||
CHECK_HEADER_INJECTION(Z_STR_P(pvalue), 0, "body disposition.type");
|
||||
bod->disposition.type = (char *) fs_get(Z_STRLEN_P(pvalue) + 1);
|
||||
memcpy(bod->disposition.type, Z_STRVAL_P(pvalue), Z_STRLEN_P(pvalue)+1);
|
||||
}
|
||||
@@ -3224,9 +3275,11 @@ PHP_FUNCTION(imap_mail_compose)
|
||||
SEPARATE_ARRAY(pvalue);
|
||||
ZEND_HASH_FOREACH_STR_KEY_VAL(Z_ARRVAL_P(pvalue), key, disp_data) {
|
||||
if (key == NULL) continue;
|
||||
CHECK_HEADER_INJECTION(key, 0, "body type.parameters key");
|
||||
disp_param = mail_newbody_parameter();
|
||||
disp_param->attribute = cpystr(ZSTR_VAL(key));
|
||||
convert_to_string_ex(disp_data);
|
||||
CHECK_HEADER_INJECTION(Z_STR_P(disp_data), 0, "body type.parameters value");
|
||||
disp_param->value = (char *) fs_get(Z_STRLEN_P(disp_data) + 1);
|
||||
memcpy(disp_param->value, Z_STRVAL_P(disp_data), Z_STRLEN_P(disp_data) + 1);
|
||||
disp_param->next = tmp_param;
|
||||
@@ -3257,6 +3310,7 @@ PHP_FUNCTION(imap_mail_compose)
|
||||
}
|
||||
if ((pvalue = zend_hash_str_find(Z_ARRVAL_P(data), "md5", sizeof("md5") - 1)) != NULL) {
|
||||
convert_to_string_ex(pvalue);
|
||||
CHECK_HEADER_INJECTION(Z_STR_P(pvalue), 0, "body md5");
|
||||
bod->md5 = cpystr(Z_STRVAL_P(pvalue));
|
||||
}
|
||||
} else if (Z_TYPE_P(data) == IS_ARRAY && topbod->type == TYPEMULTIPART) {
|
||||
@@ -3289,6 +3343,7 @@ PHP_FUNCTION(imap_mail_compose)
|
||||
}
|
||||
if ((pvalue = zend_hash_str_find(Z_ARRVAL_P(data), "charset", sizeof("charset") - 1)) != NULL) {
|
||||
convert_to_string_ex(pvalue);
|
||||
CHECK_HEADER_INJECTION(Z_STR_P(pvalue), 0, "body charset");
|
||||
tmp_param = mail_newbody_parameter();
|
||||
tmp_param->value = (char *) fs_get(Z_STRLEN_P(pvalue) + 1);
|
||||
memcpy(tmp_param->value, Z_STRVAL_P(pvalue), Z_STRLEN_P(pvalue) + 1);
|
||||
@@ -3302,9 +3357,11 @@ PHP_FUNCTION(imap_mail_compose)
|
||||
SEPARATE_ARRAY(pvalue);
|
||||
ZEND_HASH_FOREACH_STR_KEY_VAL(Z_ARRVAL_P(pvalue), key, disp_data) {
|
||||
if (key == NULL) continue;
|
||||
CHECK_HEADER_INJECTION(key, 0, "body type.parameters key");
|
||||
disp_param = mail_newbody_parameter();
|
||||
disp_param->attribute = cpystr(ZSTR_VAL(key));
|
||||
convert_to_string_ex(disp_data);
|
||||
CHECK_HEADER_INJECTION(Z_STR_P(disp_data), 0, "body type.parameters value");
|
||||
disp_param->value = (char *)fs_get(Z_STRLEN_P(disp_data) + 1);
|
||||
memcpy(disp_param->value, Z_STRVAL_P(disp_data), Z_STRLEN_P(disp_data) + 1);
|
||||
disp_param->next = tmp_param;
|
||||
@@ -3315,18 +3372,22 @@ PHP_FUNCTION(imap_mail_compose)
|
||||
}
|
||||
if ((pvalue = zend_hash_str_find(Z_ARRVAL_P(data), "subtype", sizeof("subtype") - 1)) != NULL) {
|
||||
convert_to_string_ex(pvalue);
|
||||
CHECK_HEADER_INJECTION(Z_STR_P(pvalue), 0, "body subtype");
|
||||
bod->subtype = cpystr(Z_STRVAL_P(pvalue));
|
||||
}
|
||||
if ((pvalue = zend_hash_str_find(Z_ARRVAL_P(data), "id", sizeof("id") - 1)) != NULL) {
|
||||
convert_to_string_ex(pvalue);
|
||||
CHECK_HEADER_INJECTION(Z_STR_P(pvalue), 0, "body id");
|
||||
bod->id = cpystr(Z_STRVAL_P(pvalue));
|
||||
}
|
||||
if ((pvalue = zend_hash_str_find(Z_ARRVAL_P(data), "description", sizeof("description") - 1)) != NULL) {
|
||||
convert_to_string_ex(pvalue);
|
||||
CHECK_HEADER_INJECTION(Z_STR_P(pvalue), 0, "body description");
|
||||
bod->description = cpystr(Z_STRVAL_P(pvalue));
|
||||
}
|
||||
if ((pvalue = zend_hash_str_find(Z_ARRVAL_P(data), "disposition.type", sizeof("disposition.type") - 1)) != NULL) {
|
||||
convert_to_string_ex(pvalue);
|
||||
CHECK_HEADER_INJECTION(Z_STR_P(pvalue), 0, "body disposition.type");
|
||||
bod->disposition.type = (char *) fs_get(Z_STRLEN_P(pvalue) + 1);
|
||||
memcpy(bod->disposition.type, Z_STRVAL_P(pvalue), Z_STRLEN_P(pvalue)+1);
|
||||
}
|
||||
@@ -3336,9 +3397,11 @@ PHP_FUNCTION(imap_mail_compose)
|
||||
SEPARATE_ARRAY(pvalue);
|
||||
ZEND_HASH_FOREACH_STR_KEY_VAL(Z_ARRVAL_P(pvalue), key, disp_data) {
|
||||
if (key == NULL) continue;
|
||||
CHECK_HEADER_INJECTION(key, 0, "body disposition key");
|
||||
disp_param = mail_newbody_parameter();
|
||||
disp_param->attribute = cpystr(ZSTR_VAL(key));
|
||||
convert_to_string_ex(disp_data);
|
||||
CHECK_HEADER_INJECTION(Z_STR_P(disp_data), 0, "body disposition value");
|
||||
disp_param->value = (char *) fs_get(Z_STRLEN_P(disp_data) + 1);
|
||||
memcpy(disp_param->value, Z_STRVAL_P(disp_data), Z_STRLEN_P(disp_data) + 1);
|
||||
disp_param->next = tmp_param;
|
||||
@@ -3369,6 +3432,7 @@ PHP_FUNCTION(imap_mail_compose)
|
||||
}
|
||||
if ((pvalue = zend_hash_str_find(Z_ARRVAL_P(data), "md5", sizeof("md5") - 1)) != NULL) {
|
||||
convert_to_string_ex(pvalue);
|
||||
CHECK_HEADER_INJECTION(Z_STR_P(pvalue), 0, "body md5");
|
||||
bod->md5 = cpystr(Z_STRVAL_P(pvalue));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
--TEST--
|
||||
Bug #80710 (imap_mail_compose() header injection) - MIME Splitting Attack
|
||||
--SKIPIF--
|
||||
<?php
|
||||
if (!extension_loaded("imap")) die("skip imap extension not available");
|
||||
?>
|
||||
--FILE--
|
||||
<?php
|
||||
$envelope["from"]= "joe@example.com\n From : X-INJECTED";
|
||||
$envelope["to"] = "foo@example.com\nFrom: X-INJECTED";
|
||||
$envelope["cc"] = "bar@example.com\nFrom: X-INJECTED";
|
||||
$envelope["subject"] = "bar@example.com\n\n From : X-INJECTED";
|
||||
$envelope["x-remail"] = "bar@example.com\nFrom: X-INJECTED";
|
||||
$envelope["something"] = "bar@example.com\nFrom: X-INJECTED";
|
||||
|
||||
$part1["type"] = TYPEMULTIPART;
|
||||
$part1["subtype"] = "mixed";
|
||||
|
||||
$part2["type"] = TYPEAPPLICATION;
|
||||
$part2["encoding"] = ENCBINARY;
|
||||
$part2["subtype"] = "octet-stream\nContent-Type: X-INJECTED";
|
||||
$part2["description"] = "some file\nContent-Type: X-INJECTED";
|
||||
$part2["contents.data"] = "ABC\nContent-Type: X-INJECTED";
|
||||
|
||||
$part3["type"] = TYPETEXT;
|
||||
$part3["subtype"] = "plain";
|
||||
$part3["description"] = "description3";
|
||||
$part3["contents.data"] = "contents.data3\n\n\n\t";
|
||||
|
||||
$body[1] = $part1;
|
||||
$body[2] = $part2;
|
||||
$body[3] = $part3;
|
||||
|
||||
echo imap_mail_compose($envelope, $body);
|
||||
?>
|
||||
--EXPECTF--
|
||||
Warning: imap_mail_compose(): header injection attempt in from in %s on line %d
|
||||
@@ -0,0 +1,37 @@
|
||||
--TEST--
|
||||
Bug #80710 (imap_mail_compose() header injection) - Remail
|
||||
--SKIPIF--
|
||||
<?php
|
||||
if (!extension_loaded("imap")) die("skip imap extension not available");
|
||||
?>
|
||||
--FILE--
|
||||
<?php
|
||||
$envelope["from"]= "joe@example.com\n From : X-INJECTED";
|
||||
$envelope["to"] = "foo@example.com\nFrom: X-INJECTED";
|
||||
$envelope["cc"] = "bar@example.com\nFrom: X-INJECTED";
|
||||
$envelope["subject"] = "bar@example.com\n\n From : X-INJECTED";
|
||||
$envelope["remail"] = "X-INJECTED-REMAIL: X-INJECTED\nFrom: X-INJECTED-REMAIL-FROM"; //<--- Injected as first hdr
|
||||
$envelope["something"] = "bar@example.com\nFrom: X-INJECTED";
|
||||
|
||||
$part1["type"] = TYPEMULTIPART;
|
||||
$part1["subtype"] = "mixed";
|
||||
|
||||
$part2["type"] = TYPEAPPLICATION;
|
||||
$part2["encoding"] = ENCBINARY;
|
||||
$part2["subtype"] = "octet-stream\nContent-Type: X-INJECTED";
|
||||
$part2["description"] = "some file\nContent-Type: X-INJECTED";
|
||||
$part2["contents.data"] = "ABC\nContent-Type: X-INJECTED";
|
||||
|
||||
$part3["type"] = TYPETEXT;
|
||||
$part3["subtype"] = "plain";
|
||||
$part3["description"] = "description3";
|
||||
$part3["contents.data"] = "contents.data3\n\n\n\t";
|
||||
|
||||
$body[1] = $part1;
|
||||
$body[2] = $part2;
|
||||
$body[3] = $part3;
|
||||
|
||||
echo imap_mail_compose($envelope, $body);
|
||||
?>
|
||||
--EXPECTF--
|
||||
Warning: imap_mail_compose(): header injection attempt in remail in %s on line %d
|
||||
@@ -0,0 +1,21 @@
|
||||
--TEST--
|
||||
Bug #80800: imap_open() fails when the flags parameter includes CL_EXPUNGE
|
||||
--SKIPIF--
|
||||
<?php
|
||||
require_once(__DIR__.'/setup/skipif.inc');
|
||||
?>
|
||||
--FILE--
|
||||
<?php
|
||||
|
||||
require_once __DIR__.'/setup/imap_include.inc';
|
||||
|
||||
$mail_box = imap_open(IMAP_DEFAULT_MAILBOX, IMAP_MAILBOX_USERNAME, IMAP_MAILBOX_PASSWORD, flags: CL_EXPUNGE);
|
||||
var_dump(imap_reopen($mail_box, IMAP_DEFAULT_MAILBOX, flags: CL_EXPUNGE));
|
||||
imap_close($mail_box);
|
||||
|
||||
echo 'Connected without any issues', "\n";
|
||||
|
||||
?>
|
||||
--EXPECT--
|
||||
bool(true)
|
||||
Connected without any issues
|
||||
@@ -0,0 +1,43 @@
|
||||
--TEST--
|
||||
Test imap_open() using the CL_EXPUNGE flag
|
||||
--SKIPIF--
|
||||
<?php
|
||||
require_once(__DIR__.'/setup/skipif.inc');
|
||||
?>
|
||||
--FILE--
|
||||
<?php
|
||||
|
||||
// include file for required variables in imap_open()
|
||||
require_once(__DIR__.'/setup/imap_include.inc');
|
||||
|
||||
// set up temp mailbox with 3 messages
|
||||
$stream_id = setup_test_mailbox('imapopenwithclexpunge', 3, $mailbox, flags: CL_EXPUNGE);
|
||||
|
||||
// mark messages in inbox for deletion
|
||||
for ($i = 1; $i < 4; $i++) {
|
||||
imap_delete($stream_id, $i);
|
||||
}
|
||||
|
||||
echo "\n-- Call to imap_close() --\n";
|
||||
var_dump( imap_close($stream_id) );
|
||||
|
||||
// check that CL_EXPUNGE in previous imap_open() call worked
|
||||
$stream_id = imap_open($mailbox, IMAP_MAILBOX_USERNAME, IMAP_MAILBOX_PASSWORD);
|
||||
echo "There are now " . imap_num_msg($stream_id) . " msgs in mailbox '$mailbox'\n";
|
||||
|
||||
// Close connection
|
||||
var_dump( imap_close($stream_id) );
|
||||
?>
|
||||
--CLEAN--
|
||||
<?php
|
||||
$mailbox_suffix = 'imapopenwithclexpunge';
|
||||
require_once(__DIR__.'/setup/clean.inc');
|
||||
?>
|
||||
--EXPECTF--
|
||||
Create a temporary mailbox and add 3 msgs
|
||||
New mailbox created
|
||||
|
||||
-- Call to imap_close() --
|
||||
bool(true)
|
||||
There are now 0 msgs in mailbox '%sINBOX.phpttestimapopenwithclexpunge'
|
||||
bool(true)
|
||||
@@ -0,0 +1,48 @@
|
||||
--TEST--
|
||||
Test imap_reopen() using the CL_EXPUNGE flag
|
||||
--SKIPIF--
|
||||
<?php
|
||||
require_once(__DIR__.'/setup/skipif.inc');
|
||||
?>
|
||||
--FILE--
|
||||
<?php
|
||||
|
||||
// include file for required variables in imap_open()
|
||||
require_once(__DIR__.'/setup/imap_include.inc');
|
||||
|
||||
$mailbox_suffix = 'imapreopenwithclexpunge';
|
||||
|
||||
// set up temp mailbox with 3 messages
|
||||
$stream_id = setup_test_mailbox($mailbox_suffix , 3, $mailbox);
|
||||
|
||||
var_dump(imap_reopen($stream_id, IMAP_DEFAULT_MAILBOX . '.' . IMAP_MAILBOX_PHPT_PREFIX . $mailbox_suffix, flags: CL_EXPUNGE));
|
||||
|
||||
// mark messages in inbox for deletion
|
||||
for ($i = 1; $i < 4; $i++) {
|
||||
imap_delete($stream_id, $i);
|
||||
}
|
||||
|
||||
echo "\n-- Call to imap_close() --\n";
|
||||
var_dump( imap_close($stream_id) );
|
||||
|
||||
// check that CL_EXPUNGE in previous imap_reopen() call worked
|
||||
$stream_id = imap_open($mailbox, IMAP_MAILBOX_USERNAME, IMAP_MAILBOX_PASSWORD);
|
||||
echo "There are now " . imap_num_msg($stream_id) . " msgs in mailbox '$mailbox'\n";
|
||||
|
||||
// Close connection
|
||||
var_dump( imap_close($stream_id) );
|
||||
?>
|
||||
--CLEAN--
|
||||
<?php
|
||||
$mailbox_suffix = 'imapreopenwithclexpunge';
|
||||
require_once(__DIR__.'/setup/clean.inc');
|
||||
?>
|
||||
--EXPECTF--
|
||||
Create a temporary mailbox and add 3 msgs
|
||||
New mailbox created
|
||||
bool(true)
|
||||
|
||||
-- Call to imap_close() --
|
||||
bool(true)
|
||||
There are now 0 msgs in mailbox '%sINBOX.phpttestimapreopenwithclexpunge'
|
||||
bool(true)
|
||||
@@ -63,12 +63,19 @@ function displayOverviewFields($resp, array $fields = MANDATORY_OVERVIEW_FIELDS)
|
||||
* @param int message_count number of test msgs to be written to new mailbox
|
||||
* @param null $new_mailbox
|
||||
* @param bool $simpleMessages
|
||||
* @param int $flags OP_* (or CL_EXPUNGE) flags to pass to imap_open() sub-call
|
||||
* @return resource IMAP stream to new mailbox
|
||||
* @throws Exception
|
||||
*/
|
||||
function setup_test_mailbox(string $mailbox_suffix, int $message_count, &$new_mailbox = null, bool $simpleMessages = true){
|
||||
function setup_test_mailbox(
|
||||
string $mailbox_suffix,
|
||||
int $message_count,
|
||||
&$new_mailbox = null,
|
||||
bool $simpleMessages = true,
|
||||
int $flags = 0,
|
||||
){
|
||||
// open a stream to default mailbox
|
||||
$imap_stream = imap_open(IMAP_DEFAULT_MAILBOX, IMAP_MAILBOX_USERNAME, IMAP_MAILBOX_PASSWORD);
|
||||
$imap_stream = imap_open(IMAP_DEFAULT_MAILBOX, IMAP_MAILBOX_USERNAME, IMAP_MAILBOX_PASSWORD, flags: $flags);
|
||||
|
||||
if ($imap_stream === false) {
|
||||
throw new Exception("Cannot connect to IMAP server " . IMAP_SERVER . ": " . imap_last_error());
|
||||
|
||||
@@ -173,6 +173,7 @@ U_CFUNC double intl_zval_to_millis(zval *z, intl_error *err, const char *func)
|
||||
return ZEND_NAN;
|
||||
}
|
||||
|
||||
try_again:
|
||||
switch (Z_TYPE_P(z)) {
|
||||
case IS_STRING:
|
||||
type = is_numeric_string(Z_STRVAL_P(z), Z_STRLEN_P(z), &lv, &rv, 0);
|
||||
@@ -225,6 +226,9 @@ U_CFUNC double intl_zval_to_millis(zval *z, intl_error *err, const char *func)
|
||||
efree(message);
|
||||
}
|
||||
break;
|
||||
case IS_REFERENCE:
|
||||
z = Z_REFVAL_P(z);
|
||||
goto try_again;
|
||||
default:
|
||||
spprintf(&message, 0, "%s: invalid PHP type for date", func);
|
||||
intl_errors_set(err, U_ILLEGAL_ARGUMENT_ERROR,
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
--TEST--
|
||||
Bug #80763 (msgfmt_format() does not accept DateTime references)
|
||||
--SKIPIF--
|
||||
<?php
|
||||
if (!extension_loaded('intl')) die('skip intl extension not available');
|
||||
?>
|
||||
--FILE--
|
||||
<?php
|
||||
$today = new DateTime('2021-02-17 12:00:00');
|
||||
$formatter = new \MessageFormatter('en_US', 'Today is {today, date, full}.');
|
||||
$params = ['today' => $today];
|
||||
array_walk($params, fn() => 1);
|
||||
var_dump($formatter->format($params));
|
||||
?>
|
||||
--EXPECT--
|
||||
string(38) "Today is Wednesday, February 17, 2021."
|
||||
@@ -1602,11 +1602,15 @@ cleanup_parallel:
|
||||
|
||||
if (!base_dn_str) {
|
||||
zend_argument_type_error(2, "must be of type string when argument #1 ($ldap) is a resource");
|
||||
ret = 0;
|
||||
goto cleanup;
|
||||
}
|
||||
ldap_base_dn = zend_string_copy(base_dn_str);
|
||||
|
||||
if (!filter_str) {
|
||||
zend_argument_type_error(3, "must be of type string when argument #1 ($ldap) is a resource");
|
||||
ret = 0;
|
||||
goto cleanup;
|
||||
}
|
||||
ldap_filter = zend_string_copy(filter_str);
|
||||
|
||||
|
||||
@@ -70,10 +70,10 @@ function ldap_first_entry($ldap, $result) {}
|
||||
|
||||
/**
|
||||
* @param resource $ldap
|
||||
* @param resource $result
|
||||
* @param resource $entry
|
||||
* @return resource|false
|
||||
*/
|
||||
function ldap_next_entry($ldap, $result) {}
|
||||
function ldap_next_entry($ldap, $entry) {}
|
||||
|
||||
/**
|
||||
* @param resource $ldap
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* This is a generated file, edit the .stub.php file instead.
|
||||
* Stub hash: 9d6315aeee2e3a1be51c05b65a960ed433bbe4ec */
|
||||
* Stub hash: 9e097927708f5f1d0a2ed8267422e6095e8583b0 */
|
||||
|
||||
#if defined(HAVE_ORALDAP)
|
||||
ZEND_BEGIN_ARG_INFO_EX(arginfo_ldap_connect, 0, 0, 0)
|
||||
@@ -78,7 +78,10 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_ldap_first_entry, 0, 0, 2)
|
||||
ZEND_ARG_INFO(0, result)
|
||||
ZEND_END_ARG_INFO()
|
||||
|
||||
#define arginfo_ldap_next_entry arginfo_ldap_first_entry
|
||||
ZEND_BEGIN_ARG_INFO_EX(arginfo_ldap_next_entry, 0, 0, 2)
|
||||
ZEND_ARG_INFO(0, ldap)
|
||||
ZEND_ARG_INFO(0, entry)
|
||||
ZEND_END_ARG_INFO()
|
||||
|
||||
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_ldap_get_entries, 0, 2, MAY_BE_ARRAY|MAY_BE_FALSE)
|
||||
ZEND_ARG_INFO(0, ldap)
|
||||
|
||||
@@ -39,6 +39,18 @@ try {
|
||||
echo $exception->getMessage() . "\n";
|
||||
}
|
||||
|
||||
try {
|
||||
ldap_search($link, [], []);
|
||||
} catch (TypeError $exception) {
|
||||
echo $exception->getMessage() . "\n";
|
||||
}
|
||||
|
||||
try {
|
||||
ldap_search($link, "", []);
|
||||
} catch (TypeError $exception) {
|
||||
echo $exception->getMessage() . "\n";
|
||||
}
|
||||
|
||||
?>
|
||||
--EXPECTF--
|
||||
Warning: ldap_search(): Search: No such object in %s on line %d
|
||||
@@ -49,3 +61,5 @@ bool(false)
|
||||
ldap_search(): Argument #1 ($ldap) cannot be empty
|
||||
ldap_search(): Argument #2 ($base) must have the same number of elements as the links array
|
||||
ldap_search(): Argument #3 ($filter) must have the same number of elements as the links array
|
||||
ldap_search(): Argument #2 ($base) must be of type string when argument #1 ($ldap) is a resource
|
||||
ldap_search(): Argument #3 ($filter) must be of type string when argument #1 ($ldap) is a resource
|
||||
+49
-1
@@ -361,6 +361,54 @@ php_libxml_input_buffer_create_filename(const char *URI, xmlCharEncoding enc)
|
||||
return(NULL);
|
||||
}
|
||||
|
||||
/* Check if there's been an external transport protocol with an encoding information */
|
||||
if (enc == XML_CHAR_ENCODING_NONE) {
|
||||
php_stream *s = (php_stream *) context;
|
||||
|
||||
if (Z_TYPE(s->wrapperdata) == IS_ARRAY) {
|
||||
zval *header;
|
||||
|
||||
ZEND_HASH_FOREACH_VAL_IND(Z_ARRVAL(s->wrapperdata), header) {
|
||||
const char buf[] = "Content-Type:";
|
||||
if (Z_TYPE_P(header) == IS_STRING &&
|
||||
!zend_binary_strncasecmp(Z_STRVAL_P(header), Z_STRLEN_P(header), buf, sizeof(buf)-1, sizeof(buf)-1)) {
|
||||
char *needle = estrdup("charset=");
|
||||
char *haystack = estrndup(Z_STRVAL_P(header), Z_STRLEN_P(header));
|
||||
char *encoding = php_stristr(haystack, needle, Z_STRLEN_P(header), sizeof("charset=")-1);
|
||||
|
||||
if (encoding) {
|
||||
char *end;
|
||||
|
||||
encoding += sizeof("charset=")-1;
|
||||
if (*encoding == '"') {
|
||||
encoding++;
|
||||
}
|
||||
end = strchr(encoding, ';');
|
||||
if (end == NULL) {
|
||||
end = encoding + strlen(encoding);
|
||||
}
|
||||
end--; /* end == encoding-1 isn't a buffer underrun */
|
||||
while (*end == ' ' || *end == '\t') {
|
||||
end--;
|
||||
}
|
||||
if (*end == '"') {
|
||||
end--;
|
||||
}
|
||||
if (encoding >= end) continue;
|
||||
*(end+1) = '\0';
|
||||
enc = xmlParseCharEncoding(encoding);
|
||||
if (enc <= XML_CHAR_ENCODING_NONE) {
|
||||
enc = XML_CHAR_ENCODING_NONE;
|
||||
}
|
||||
}
|
||||
efree(haystack);
|
||||
efree(needle);
|
||||
break; /* found content-type */
|
||||
}
|
||||
} ZEND_HASH_FOREACH_END();
|
||||
}
|
||||
}
|
||||
|
||||
/* Allocate the Input buffer front-end. */
|
||||
ret = xmlAllocParserInputBuffer(enc);
|
||||
if (ret != NULL) {
|
||||
@@ -1110,7 +1158,7 @@ PHP_FUNCTION(libxml_set_external_entity_loader)
|
||||
/* {{{ Common functions shared by extensions */
|
||||
int php_libxml_xmlCheckUTF8(const unsigned char *s)
|
||||
{
|
||||
int i;
|
||||
size_t i;
|
||||
unsigned char c;
|
||||
|
||||
for (i = 0; (c = s[i++]);) {
|
||||
|
||||
@@ -0,0 +1,38 @@
|
||||
--TEST--
|
||||
Bug #51903 (simplexml_load_file() doesn't use HTTP headers)
|
||||
--SKIPIF--
|
||||
<?php
|
||||
if (!extension_loaded('simplexml')) die('skip simplexml extension not available');
|
||||
if (@!include "./ext/standard/tests/http/server.inc") die('skip server.inc not available');
|
||||
http_server_skipif();
|
||||
?>
|
||||
--FILE--
|
||||
<?php
|
||||
require "./ext/standard/tests/http/server.inc";
|
||||
$responses = [
|
||||
"data://text/plain,HTTP/1.1 200 OK\r\n"
|
||||
. "Content-Type: text/xml; charset=ISO-8859-1\r\n\r\n"
|
||||
. "<?xml version=\"1.0\"?>\n"
|
||||
. "<root>\xE4\xF6\xFC</root>\n",
|
||||
"data://text/plain,HTTP/1.1 200 OK\r\n"
|
||||
. "Content-Type: text/xml; charset=ISO-8859-1; foo=bar\r\n\r\n"
|
||||
. "<?xml version=\"1.0\"?>\n"
|
||||
. "<root>\xE4\xF6\xFC</root>\n",
|
||||
"data://text/plain,HTTP/1.1 200 OK\r\n"
|
||||
. "Content-Type: text/xml; charset=\"ISO-8859-1\" ; foo=bar\r\n\r\n"
|
||||
. "<?xml version=\"1.0\"?>\n"
|
||||
. "<root>\xE4\xF6\xFC</root>\n",
|
||||
];
|
||||
['pid' => $pid, 'uri' => $uri] = http_server($responses);
|
||||
|
||||
for ($i = 0; $i < count($responses); $i++) {
|
||||
$sxe = simplexml_load_file($uri);
|
||||
echo "$sxe\n";
|
||||
}
|
||||
|
||||
http_server_kill($pid);
|
||||
?>
|
||||
--EXPECT--
|
||||
äöü
|
||||
äöü
|
||||
äöü
|
||||
@@ -0,0 +1,38 @@
|
||||
--TEST--
|
||||
Bug #80837 Calling stmt_store_result after fetch doesn't throw an error
|
||||
--SKIPIF--
|
||||
<?php
|
||||
require_once 'skipif.inc';
|
||||
require_once 'skipifconnectfailure.inc';
|
||||
if (!defined('MYSQLI_STORE_RESULT_COPY_DATA')) die('skip requires mysqlnd');
|
||||
?>
|
||||
--FILE--
|
||||
<?php
|
||||
require_once "connect.inc";
|
||||
|
||||
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
|
||||
$mysqli = new my_mysqli($host, $user, $passwd, $db, $port, $socket);
|
||||
|
||||
$mysqli->query('DROP TABLE IF EXISTS test');
|
||||
$mysqli->query('CREATE TABLE test (b int)');
|
||||
$mysqli->query('INSERT INTO test VALUES (1),(2),(3)');
|
||||
|
||||
$statement = $mysqli->prepare("SELECT b FROM test");
|
||||
$statement->execute();
|
||||
$statement->bind_result($name);
|
||||
$statement->fetch();
|
||||
try {
|
||||
$statement->store_result();
|
||||
} catch (mysqli_sql_exception $e) {
|
||||
echo $e->getMessage();
|
||||
}
|
||||
|
||||
$mysqli->close();
|
||||
|
||||
?>
|
||||
--CLEAN--
|
||||
<?php
|
||||
require_once "clean_table.inc";
|
||||
?>
|
||||
--EXPECTF--
|
||||
Commands out of sync; you can't run this command now
|
||||
@@ -101,8 +101,8 @@ max_execution_time=240
|
||||
require_once('table.inc');
|
||||
|
||||
if (!$link = my_mysqli_connect($host, 'pamtest', 'pamtest', $db, $port, $socket)) {
|
||||
printf("[001] Cannot connect to the server using host=%s, user=%s, passwd=***, dbname=%s, port=%s, socket=%s\n",
|
||||
$host, $user, $db, $port, $socket);
|
||||
printf("[001] Cannot connect to the server using host=%s, user=pamtest, passwd=pamtest dbname=%s, port=%s, socket=%s\n",
|
||||
$host, $db, $port, $socket);
|
||||
} else {
|
||||
|
||||
if (!$res = $link->query("SELECT id FROM test WHERE id = 1"))
|
||||
|
||||
@@ -89,7 +89,7 @@ MYSQLND_METHOD(mysqlnd_stmt, store_result)(MYSQLND_STMT * const s)
|
||||
|
||||
/* Nothing to store for UPSERT/LOAD DATA*/
|
||||
if (!mysqlnd_stmt_check_state(stmt)) {
|
||||
SET_CLIENT_ERROR(conn->error_info, CR_COMMANDS_OUT_OF_SYNC, UNKNOWN_SQLSTATE, mysqlnd_out_of_sync);
|
||||
SET_CLIENT_ERROR(stmt->error_info, CR_COMMANDS_OUT_OF_SYNC, UNKNOWN_SQLSTATE, mysqlnd_out_of_sync);
|
||||
DBG_RETURN(NULL);
|
||||
}
|
||||
|
||||
|
||||
@@ -373,6 +373,10 @@ static zend_bool try_remove_var_def(context *ctx, int free_var, int use_chain, z
|
||||
return 0;
|
||||
}
|
||||
|
||||
static zend_always_inline zend_bool may_be_refcounted(uint32_t type) {
|
||||
return (type & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF)) != 0;
|
||||
}
|
||||
|
||||
/* Returns whether the instruction has been DCEd */
|
||||
static zend_bool dce_instr(context *ctx, zend_op *opline, zend_ssa_op *ssa_op) {
|
||||
zend_ssa *ssa = ctx->ssa;
|
||||
@@ -384,17 +388,15 @@ static zend_bool dce_instr(context *ctx, zend_op *opline, zend_ssa_op *ssa_op) {
|
||||
}
|
||||
|
||||
/* We mark FREEs as dead, but they're only really dead if the destroyed var is dead */
|
||||
if (opline->opcode == ZEND_FREE
|
||||
&& (ssa->var_info[ssa_op->op1_use].type & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF))
|
||||
if (opline->opcode == ZEND_FREE && may_be_refcounted(ssa->var_info[ssa_op->op1_use].type)
|
||||
&& !is_var_dead(ctx, ssa_op->op1_use)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if ((opline->op1_type & (IS_VAR|IS_TMP_VAR))&& !is_var_dead(ctx, ssa_op->op1_use)) {
|
||||
if (!try_remove_var_def(ctx, ssa_op->op1_use, ssa_op->op1_use_chain, opline)) {
|
||||
if (ssa->var_info[ssa_op->op1_use].type & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF)
|
||||
&& opline->opcode != ZEND_CASE
|
||||
&& opline->opcode != ZEND_CASE_STRICT) {
|
||||
if (may_be_refcounted(ssa->var_info[ssa_op->op1_use].type)
|
||||
&& opline->opcode != ZEND_CASE && opline->opcode != ZEND_CASE_STRICT) {
|
||||
free_var = ssa_op->op1_use;
|
||||
free_var_type = opline->op1_type;
|
||||
}
|
||||
@@ -402,7 +404,7 @@ static zend_bool dce_instr(context *ctx, zend_op *opline, zend_ssa_op *ssa_op) {
|
||||
}
|
||||
if ((opline->op2_type & (IS_VAR|IS_TMP_VAR)) && !is_var_dead(ctx, ssa_op->op2_use)) {
|
||||
if (!try_remove_var_def(ctx, ssa_op->op2_use, ssa_op->op2_use_chain, opline)) {
|
||||
if (ssa->var_info[ssa_op->op2_use].type & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF)) {
|
||||
if (may_be_refcounted(ssa->var_info[ssa_op->op2_use].type)) {
|
||||
if (free_var >= 0) {
|
||||
// TODO: We can't free two vars. Keep instruction alive.
|
||||
zend_bitset_excl(ctx->instr_dead, opline - ctx->op_array->opcodes);
|
||||
@@ -509,6 +511,17 @@ int dce_optimize_op_array(zend_op_array *op_array, zend_ssa *ssa, zend_bool reor
|
||||
ctx.phi_dead = alloca(sizeof(zend_ulong) * ctx.phi_worklist_len);
|
||||
memset(ctx.phi_dead, 0xff, sizeof(zend_ulong) * ctx.phi_worklist_len);
|
||||
|
||||
/* Mark non-CV phis as live. Even if the result is unused, we generally cannot remove one
|
||||
* of the producing instructions, as it combines producing the result with control flow.
|
||||
* This can be made more precise if there are any cases where this is not the case. */
|
||||
FOREACH_PHI(phi) {
|
||||
if (phi->var >= op_array->last_var
|
||||
&& may_be_refcounted(ssa->var_info[phi->ssa_var].type)) {
|
||||
zend_bitset_excl(ctx.phi_dead, phi->ssa_var);
|
||||
add_phi_sources_to_worklists(&ctx, phi, 0);
|
||||
}
|
||||
} FOREACH_PHI_END();
|
||||
|
||||
/* Mark reacable instruction without side effects as dead */
|
||||
int b = ssa->cfg.blocks_count;
|
||||
while (b > 0) {
|
||||
|
||||
@@ -1941,6 +1941,18 @@ static void add_usages(const zend_op_array *op_array, zend_ssa *ssa, zend_bitset
|
||||
if (op->op2_def >= 0) {
|
||||
zend_bitset_incl(worklist, op->op2_def);
|
||||
}
|
||||
} else if (use + 1 < op_array->last
|
||||
&& op_array->opcodes[use + 1].opcode == ZEND_OP_DATA) {
|
||||
op++;
|
||||
if (op->result_def >= 0) {
|
||||
zend_bitset_incl(worklist, op->result_def);
|
||||
}
|
||||
if (op->op1_def >= 0) {
|
||||
zend_bitset_incl(worklist, op->op1_def);
|
||||
}
|
||||
if (op->op2_def >= 0) {
|
||||
zend_bitset_incl(worklist, op->op2_def);
|
||||
}
|
||||
}
|
||||
use = zend_ssa_next_use(ssa->ops, var, use);
|
||||
} while (use >= 0);
|
||||
@@ -2316,10 +2328,6 @@ static uint32_t zend_fetch_prop_type(const zend_script *script, zend_property_in
|
||||
}
|
||||
if (prop_info && ZEND_TYPE_IS_SET(prop_info->type)) {
|
||||
uint32_t type = zend_convert_type_declaration_mask(ZEND_TYPE_PURE_MASK(prop_info->type));
|
||||
|
||||
if (type & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)) {
|
||||
type |= MAY_BE_RC1 | MAY_BE_RCN;
|
||||
}
|
||||
if (ZEND_TYPE_HAS_CLASS(prop_info->type)) {
|
||||
type |= MAY_BE_OBJECT;
|
||||
if (pce) {
|
||||
@@ -2332,6 +2340,9 @@ static uint32_t zend_fetch_prop_type(const zend_script *script, zend_property_in
|
||||
}
|
||||
}
|
||||
}
|
||||
if (type & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)) {
|
||||
type |= MAY_BE_RC1 | MAY_BE_RCN;
|
||||
}
|
||||
return type;
|
||||
}
|
||||
return MAY_BE_ANY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_OF_REF | MAY_BE_RC1 | MAY_BE_RCN;
|
||||
|
||||
@@ -220,7 +220,7 @@ int main() {
|
||||
]])],[dnl
|
||||
AC_DEFINE(HAVE_SHM_MMAP_ANON, 1, [Define if you have mmap(MAP_ANON) SHM support])
|
||||
have_shm_mmap_anon=yes],[have_shm_mmap_anon=no],[have_shm_mmap_anon=no])
|
||||
AC_MSG_RESULT([$have_shm_mmap_anon=yes])
|
||||
AC_MSG_RESULT([$have_shm_mmap_anon])
|
||||
|
||||
PHP_CHECK_FUNC_LIB(shm_open, rt, root)
|
||||
AC_MSG_CHECKING(for mmap() using shm_open() shared memory support)
|
||||
|
||||
@@ -2933,7 +2933,7 @@ static int zend_jit_setup(void)
|
||||
# elif defined(__GNUC__) && defined(__x86_64__)
|
||||
tsrm_ls_cache_tcb_offset = tsrm_get_ls_cache_tcb_offset();
|
||||
if (tsrm_ls_cache_tcb_offset == 0) {
|
||||
#if defined(__has_attribute) && __has_attribute(tls_model)
|
||||
#if defined(__has_attribute) && __has_attribute(tls_model) && !defined(__FreeBSD__)
|
||||
size_t ret;
|
||||
|
||||
asm ("movq _tsrm_ls_cache@gottpoff(%%rip),%0"
|
||||
@@ -2952,7 +2952,7 @@ static int zend_jit_setup(void)
|
||||
# elif defined(__GNUC__) && defined(__i386__)
|
||||
tsrm_ls_cache_tcb_offset = tsrm_get_ls_cache_tcb_offset();
|
||||
if (tsrm_ls_cache_tcb_offset == 0) {
|
||||
#if 1
|
||||
#if !defined(__FreeBSD__)
|
||||
size_t ret;
|
||||
|
||||
asm ("leal _tsrm_ls_cache@ntpoff,%0\n"
|
||||
@@ -4329,12 +4329,17 @@ static int zend_jit_math_long_long(dasm_State **Dst,
|
||||
}
|
||||
|
||||
do {
|
||||
if ((Z_MODE(op1_addr) == IS_CONST_ZVAL && Z_LVAL_P(Z_ZV(op1_addr)) == 1) ||
|
||||
(Z_MODE(op2_addr) == IS_CONST_ZVAL && Z_LVAL_P(Z_ZV(op2_addr)) == 1)) {
|
||||
if ((sizeof(void*) == 8 || Z_MODE(res_addr) != IS_REG) &&
|
||||
((Z_MODE(op1_addr) == IS_CONST_ZVAL && Z_LVAL_P(Z_ZV(op1_addr)) == 1) ||
|
||||
(Z_MODE(op2_addr) == IS_CONST_ZVAL && Z_LVAL_P(Z_ZV(op2_addr)) == 1))) {
|
||||
if (opcode == ZEND_ADD) {
|
||||
|.if X64
|
||||
| mov64 rax, 0x43e0000000000000
|
||||
| SET_ZVAL_LVAL res_addr, rax
|
||||
if (Z_MODE(res_addr) == IS_REG) {
|
||||
| movd xmm(Z_REG(res_addr)-ZREG_XMM0), rax
|
||||
} else {
|
||||
| SET_ZVAL_LVAL res_addr, rax
|
||||
}
|
||||
|.else
|
||||
| SET_ZVAL_LVAL res_addr, 0
|
||||
| SET_ZVAL_W2 res_addr, 0x41e00000
|
||||
@@ -4343,7 +4348,11 @@ static int zend_jit_math_long_long(dasm_State **Dst,
|
||||
} else if (opcode == ZEND_SUB) {
|
||||
|.if X64
|
||||
| mov64 rax, 0xc3e0000000000000
|
||||
| SET_ZVAL_LVAL res_addr, rax
|
||||
if (Z_MODE(res_addr) == IS_REG) {
|
||||
| movd xmm(Z_REG(res_addr)-ZREG_XMM0), rax
|
||||
} else {
|
||||
| SET_ZVAL_LVAL res_addr, rax
|
||||
}
|
||||
|.else
|
||||
| SET_ZVAL_LVAL res_addr, 0x00200000
|
||||
| SET_ZVAL_W2 res_addr, 0xc1e00000
|
||||
@@ -4428,7 +4437,14 @@ static int zend_jit_math_double_long(dasm_State **Dst,
|
||||
zend_jit_addr res_addr,
|
||||
uint32_t res_use_info)
|
||||
{
|
||||
zend_reg result_reg, tmp_reg;
|
||||
zend_reg result_reg, tmp_reg_gp;
|
||||
|
||||
if (Z_MODE(res_addr) == IS_MEM_ZVAL && Z_REG(res_addr) == ZREG_R0) {
|
||||
/* ASSIGN_DIM_OP */
|
||||
tmp_reg_gp = ZREG_R1;
|
||||
} else {
|
||||
tmp_reg_gp = ZREG_R0;
|
||||
}
|
||||
|
||||
if (zend_is_commutative(opcode)
|
||||
&& (Z_MODE(res_addr) != IS_REG || Z_MODE(op1_addr) != IS_REG || Z_REG(res_addr) != Z_REG(op1_addr))) {
|
||||
@@ -4437,13 +4453,7 @@ static int zend_jit_math_double_long(dasm_State **Dst,
|
||||
} else {
|
||||
result_reg = ZREG_XMM0;
|
||||
}
|
||||
if (Z_MODE(res_addr) == IS_MEM_ZVAL && Z_REG(res_addr) == ZREG_R0) {
|
||||
/* ASSIGN_DIM_OP */
|
||||
tmp_reg = ZREG_R1;
|
||||
} else {
|
||||
tmp_reg = ZREG_R0;
|
||||
}
|
||||
| SSE_GET_ZVAL_LVAL result_reg, op2_addr, tmp_reg
|
||||
| SSE_GET_ZVAL_LVAL result_reg, op2_addr, tmp_reg_gp
|
||||
if (Z_MODE(res_addr) == IS_MEM_ZVAL && Z_REG(res_addr) == ZREG_R0) {
|
||||
/* ASSIGN_DIM_OP */
|
||||
if (CAN_USE_AVX()) {
|
||||
@@ -4485,7 +4495,7 @@ static int zend_jit_math_double_long(dasm_State **Dst,
|
||||
&& Z_LVAL_P(Z_ZV(op2_addr)) == 0) {
|
||||
/* +/- 0 */
|
||||
} else {
|
||||
| SSE_GET_ZVAL_LVAL tmp_reg, op2_addr, ZREG_R0
|
||||
| SSE_GET_ZVAL_LVAL tmp_reg, op2_addr, tmp_reg_gp
|
||||
| AVX_MATH_REG opcode, result_reg, op1_reg, tmp_reg
|
||||
}
|
||||
} else {
|
||||
@@ -4495,7 +4505,7 @@ static int zend_jit_math_double_long(dasm_State **Dst,
|
||||
&& Z_LVAL_P(Z_ZV(op2_addr)) == 0) {
|
||||
/* +/- 0 */
|
||||
} else {
|
||||
| SSE_GET_ZVAL_LVAL tmp_reg, op2_addr, ZREG_R0
|
||||
| SSE_GET_ZVAL_LVAL tmp_reg, op2_addr, tmp_reg_gp
|
||||
| SSE_MATH_REG opcode, result_reg, tmp_reg
|
||||
}
|
||||
}
|
||||
@@ -5211,6 +5221,9 @@ static int zend_jit_concat_helper(dasm_State **Dst,
|
||||
| add r4, 12
|
||||
|.endif
|
||||
}
|
||||
/* concatination with empty string may increase refcount */
|
||||
op1_info |= MAY_BE_RCN;
|
||||
op2_info |= MAY_BE_RCN;
|
||||
| FREE_OP op1_type, op1, op1_info, 0, opline
|
||||
| FREE_OP op2_type, op2, op2_info, 0, opline
|
||||
|5:
|
||||
@@ -5237,6 +5250,9 @@ static int zend_jit_concat_helper(dasm_State **Dst,
|
||||
|.if not(X64)
|
||||
| add r4, 12
|
||||
|.endif
|
||||
/* concatination with empty string may increase refcount */
|
||||
op1_info |= MAY_BE_RCN;
|
||||
op2_info |= MAY_BE_RCN;
|
||||
| FREE_OP op1_type, op1, op1_info, 0, opline
|
||||
| FREE_OP op2_type, op2, op2_info, 0, opline
|
||||
if (may_throw) {
|
||||
@@ -15495,7 +15511,7 @@ static zend_regset zend_jit_get_scratch_regset(const zend_op *opline, const zend
|
||||
op2_info = OP2_INFO();
|
||||
if (opline->op1_type == IS_CV
|
||||
&& !(op2_info & MAY_BE_UNDEF)
|
||||
&& !(op1_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_RESOURCE|MAY_BE_REF))) {
|
||||
&& !(op1_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF))) {
|
||||
if ((op2_info & (MAY_BE_ANY|MAY_BE_REF)) == MAY_BE_DOUBLE) {
|
||||
regset = ZEND_REGSET(ZREG_XMM0);
|
||||
} else if ((op2_info & (MAY_BE_ANY|MAY_BE_REF)) == MAY_BE_LONG) {
|
||||
|
||||
@@ -44,6 +44,9 @@ static int create_segments(size_t requested_size, zend_shared_segment ***shared_
|
||||
#ifdef PROT_MPROTECT
|
||||
flags |= PROT_MPROTECT(PROT_EXEC);
|
||||
#endif
|
||||
#ifdef PROT_MAX
|
||||
flags |= PROT_MAX(PROT_READ | PROT_WRITE | PROT_EXEC);
|
||||
#endif
|
||||
#ifdef MAP_HUGETLB
|
||||
size_t huge_page_size = 2 * 1024 * 1024;
|
||||
|
||||
|
||||
@@ -81,7 +81,7 @@ void zend_shared_alloc_create_lock(void)
|
||||
{
|
||||
memory_mutex = CreateMutex(NULL, FALSE, create_name_with_username(ACCEL_MUTEX_NAME));
|
||||
if (!memory_mutex) {
|
||||
zend_accel_error(ACCEL_LOG_FATAL, "Cannot create mutex");
|
||||
zend_accel_error(ACCEL_LOG_FATAL, "Cannot create mutex (error %u)", GetLastError());
|
||||
return;
|
||||
}
|
||||
ReleaseMutex(memory_mutex);
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
--TEST--
|
||||
Bug #80782 (DASM_S_RANGE_VREG on PHP_INT_MIN-1)
|
||||
--INI--
|
||||
opcache.enable=1
|
||||
opcache.enable_cli=1
|
||||
opcache.file_update_protection=0
|
||||
opcache.jit=tracing
|
||||
opcache.jit_buffer_size=1M
|
||||
opcache.protect_memory=1
|
||||
--SKIPIF--
|
||||
<?php require_once('skipif.inc'); ?>
|
||||
--FILE--
|
||||
<?php
|
||||
define('LONG_MIN', PHP_INT_MIN);
|
||||
var_dump(LONG_MIN-1);
|
||||
?>
|
||||
--EXPECTF--
|
||||
float(%s)
|
||||
@@ -0,0 +1,25 @@
|
||||
--TEST--
|
||||
Bug #80786: PHP crash using JIT
|
||||
--INI--
|
||||
opcache.enable=1
|
||||
opcache.enable_cli=1
|
||||
opcache.jit_buffer_size=1M
|
||||
opcache.jit=function
|
||||
--FILE--
|
||||
<?php
|
||||
|
||||
$a = new Test();
|
||||
$a->TestFunc();
|
||||
var_dump($a->value);
|
||||
|
||||
class Test{
|
||||
public $value = 11.3;
|
||||
|
||||
public function TestFunc() {
|
||||
$this->value -= 10;
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
--EXPECT--
|
||||
float(1.3000000000000007)
|
||||
@@ -0,0 +1,49 @@
|
||||
--TEST--
|
||||
Bug #80802: zend_jit_fetch_indirect_var assert failure with tracing JIT
|
||||
--INI--
|
||||
opcache.enable=1
|
||||
opcache.enable_cli=1
|
||||
opcache.jit_buffer_size=1M
|
||||
opcache.jit=tracing
|
||||
--SKIPIF--
|
||||
<?php require_once('skipif.inc'); ?>
|
||||
--FILE--
|
||||
<?php
|
||||
abstract class AsyncTask{
|
||||
private static $threadLocalStorage = null;
|
||||
|
||||
protected function storeLocal(string $key, $complexData) : void{
|
||||
if(self::$threadLocalStorage === null){
|
||||
self::$threadLocalStorage = new \ArrayObject();
|
||||
}
|
||||
self::$threadLocalStorage[spl_object_id($this)][$key] = $complexData;
|
||||
}
|
||||
|
||||
final public function __destruct(){
|
||||
$this->reallyDestruct();
|
||||
if(self::$threadLocalStorage !== null and isset(self::$threadLocalStorage[$h = spl_object_id($this)])){
|
||||
unset(self::$threadLocalStorage[$h]);
|
||||
if(self::$threadLocalStorage->count() === 0){
|
||||
self::$threadLocalStorage = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected function reallyDestruct() : void{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
class Task extends AsyncTask{
|
||||
public function __construct(){
|
||||
$this->storeLocal("thing1", new stdClass);
|
||||
}
|
||||
}
|
||||
|
||||
for($i = 0; $i < 10000; ++$i){
|
||||
new Task;
|
||||
}
|
||||
echo "OK\n";
|
||||
?>
|
||||
--EXPECT--
|
||||
OK
|
||||
@@ -0,0 +1,37 @@
|
||||
--TEST--
|
||||
Bug #80839: PHP problem with JIT
|
||||
--INI--
|
||||
opcache.enable=1
|
||||
opcache.enable_cli=1
|
||||
opcache.jit_buffer_size=1M
|
||||
opcache.jit=function
|
||||
--SKIPIF--
|
||||
<?php require_once('skipif.inc'); ?>
|
||||
--FILE--
|
||||
<?php
|
||||
$a = null; // the problem only occurs when set to NULL
|
||||
test($a, 'y');
|
||||
|
||||
function test($str, $pad) {
|
||||
$x = $str . str_repeat($pad, 15); // $x now contains "yyyyyyyyyyyyyyy"
|
||||
var_dump($x);
|
||||
|
||||
$gft = new gft();
|
||||
$gft->info(33);
|
||||
|
||||
// $x has been changed ????
|
||||
// $x contains what was echoed in the function 'info'
|
||||
var_dump($x);
|
||||
}
|
||||
class gft {
|
||||
private $strVal = 'abcd ';
|
||||
public function info($info, $prefix = ' Info:') {
|
||||
echo $this->strVal.$prefix.serialize($info).'aaaa';
|
||||
echo "\n";
|
||||
}
|
||||
}
|
||||
?>
|
||||
--EXPECT--
|
||||
string(15) "yyyyyyyyyyyyyyy"
|
||||
abcd Info:i:33;aaaa
|
||||
string(15) "yyyyyyyyyyyyyyy"
|
||||
@@ -0,0 +1,111 @@
|
||||
--TEST--
|
||||
Bug #80839: PHP problem with JIT
|
||||
--INI--
|
||||
opcache.enable=1
|
||||
opcache.enable_cli=1
|
||||
opcache.jit_buffer_size=1M
|
||||
opcache.jit=tracing
|
||||
--SKIPIF--
|
||||
<?php require_once('skipif.inc'); ?>
|
||||
--FILE--
|
||||
<?php
|
||||
declare(strict_types=1);
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
class Node
|
||||
{
|
||||
public $column = null;
|
||||
public $left = null;
|
||||
public $right = null;
|
||||
public $up = null;
|
||||
public $down = null;
|
||||
|
||||
public static function joinLR(Node $a, Node $b): void
|
||||
{
|
||||
$a->right = $b;
|
||||
$b->left = $a;
|
||||
}
|
||||
|
||||
public static function joinDU(Node $a, Node $b): void
|
||||
{
|
||||
$a->up = $b;
|
||||
$b->down = $a;
|
||||
}
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
class Column extends Node
|
||||
{
|
||||
public function __construct()
|
||||
{
|
||||
$this->column = $this;
|
||||
$this->up = $this;
|
||||
$this->down = $this;
|
||||
}
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
class Matrix
|
||||
{
|
||||
public $head = null;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$this->head = new Node();
|
||||
Node::joinLR($this->head, $this->head);
|
||||
}
|
||||
|
||||
// $from is array[][] of bool
|
||||
public static function fromArray(array $from): Matrix
|
||||
{
|
||||
$m = new Matrix();
|
||||
$rowCount = count($from);
|
||||
if ($rowCount == 0) {
|
||||
return $m;
|
||||
}
|
||||
$columnCount = count($from[0]);
|
||||
if ($columnCount == 0) {
|
||||
return $m;
|
||||
}
|
||||
// we generate 2D double linked circular list of nodes from the input 2D bool array
|
||||
// might be not relevant for the bug
|
||||
$c = new Column();
|
||||
Node::joinLR($m->head, $c);
|
||||
for ($j = 1; $j < $columnCount; $j++) {
|
||||
$nextCol = new Column();
|
||||
Node::joinLR($c, $nextCol);
|
||||
$c = $c->right;
|
||||
}
|
||||
Node::joinLR($c, $m->head);
|
||||
$c = $m->head->right;
|
||||
error_log("These are the array bounds: $rowCount * $columnCount");
|
||||
for ($j = 0; $j < $columnCount; $j++) {
|
||||
$prev = $c;
|
||||
for ($i = 0; $i < $rowCount; $i++) {
|
||||
// next line generates the warnings despite $i and $j is within bounds
|
||||
if ($from[$i][$j]) {
|
||||
$node = new Node();
|
||||
$node->column = $c;
|
||||
Node::joinDU($node, $prev);
|
||||
Node::joinLR($node, $node);
|
||||
$prev = $node;
|
||||
// ... code to generate $m excluded
|
||||
}
|
||||
}
|
||||
Node::joinDU($c, $prev);
|
||||
$c = $c->right;
|
||||
}
|
||||
return $m;
|
||||
}
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
// simple driver code - fills up a 2D bool matrix and calls the static matrix constructing function above
|
||||
for ($y = 0; $y < 10; $y++) {
|
||||
for ($x = 0; $x < 10; $x++) {
|
||||
$a[$y][$x] = true;
|
||||
}
|
||||
}
|
||||
$m = Matrix::fromArray($a);
|
||||
--EXPECT--
|
||||
These are the array bounds: 10 * 10
|
||||
@@ -0,0 +1,17 @@
|
||||
--TEST--
|
||||
Incorrect DCE of FREE of COALESCE
|
||||
--FILE--
|
||||
<?php
|
||||
|
||||
function test(?string $str) {
|
||||
$str ?? $str = '';
|
||||
return strlen($str);
|
||||
}
|
||||
|
||||
$foo = 'foo';
|
||||
$foo .= 'bar';
|
||||
var_dump(test($foo));
|
||||
|
||||
?>
|
||||
--EXPECT--
|
||||
int(6)
|
||||
@@ -3,14 +3,51 @@ Bug #62890 (default_socket_timeout=-1 causes connection to timeout)
|
||||
--SKIPIF--
|
||||
<?php
|
||||
if (!extension_loaded('openssl')) die('skip openssl extension not available');
|
||||
if (getenv('SKIP_ONLINE_TESTS')) die('skip online test');
|
||||
if (!function_exists("proc_open")) die("skip no proc_open");
|
||||
?>
|
||||
--INI--
|
||||
default_socket_timeout=-1
|
||||
--FILE--
|
||||
<?php
|
||||
$clientCtx = stream_context_create(['ssl' => ['verify_peer' => false]]);
|
||||
var_dump((bool) file_get_contents('https://www.php.net', false, $clientCtx));
|
||||
$certFile = __DIR__ . DIRECTORY_SEPARATOR . 'bug62890.pem.tmp';
|
||||
|
||||
$serverCode = <<<'CODE'
|
||||
$flags = STREAM_SERVER_BIND|STREAM_SERVER_LISTEN;
|
||||
$ctx = stream_context_create(['ssl' => [
|
||||
'local_cert' => '%s',
|
||||
'security_level' => 1,
|
||||
]]);
|
||||
|
||||
$server = stream_socket_server('tls://127.0.0.1:64321', $errno, $errstr, $flags, $ctx);
|
||||
phpt_notify();
|
||||
@stream_socket_accept($server, 3);
|
||||
CODE;
|
||||
$serverCode = sprintf($serverCode, $certFile);
|
||||
|
||||
$clientCode = <<<'CODE'
|
||||
$flags = STREAM_CLIENT_CONNECT;
|
||||
$ctx = stream_context_create(['ssl' => [
|
||||
'verify_peer' => false,
|
||||
'verify_peer_name' => false,
|
||||
'security_level' => 1,
|
||||
]]);
|
||||
|
||||
phpt_wait();
|
||||
|
||||
$client = stream_socket_client("tls://127.0.0.1:64321", $errno, $errstr, 3, $flags, $ctx);
|
||||
var_dump($client);
|
||||
CODE;
|
||||
|
||||
include 'CertificateGenerator.inc';
|
||||
$certificateGenerator = new CertificateGenerator();
|
||||
$certificateGenerator->saveNewCertAsFileWithKey('bug62890', $certFile);
|
||||
|
||||
include 'ServerClientTestCase.inc';
|
||||
ServerClientTestCase::getInstance()->run($clientCode, $serverCode);
|
||||
?>
|
||||
--EXPECT--
|
||||
bool(true)
|
||||
--CLEAN--
|
||||
<?php
|
||||
@unlink(__DIR__ . DIRECTORY_SEPARATOR . 'bug62890.pem.tmp');
|
||||
?>
|
||||
--EXPECTF--
|
||||
resource(%d) of type (stream)
|
||||
@@ -3,7 +3,8 @@ Bug #80747: Providing RSA key size < 512 generates key that crash PHP
|
||||
--FILE--
|
||||
--SKIPIF--
|
||||
<?php
|
||||
if (!extension_loaded("openssl")) die("skip");
|
||||
if (!extension_loaded("openssl")) die("skip openssl not loaded");
|
||||
if (OPENSSL_VERSION_NUMBER < 0x10100000) die("skip OpenSSL >= v1.1.0 required");
|
||||
?>
|
||||
--FILE--
|
||||
<?php
|
||||
|
||||
+3
-2
@@ -785,7 +785,7 @@ PHP_FUNCTION(pcntl_exec)
|
||||
int envc = 0, envi = 0;
|
||||
char **argv = NULL, **envp = NULL;
|
||||
char **current_arg, **pair;
|
||||
int pair_length;
|
||||
size_t pair_length;
|
||||
zend_string *key;
|
||||
char *path;
|
||||
size_t path_len;
|
||||
@@ -845,8 +845,9 @@ PHP_FUNCTION(pcntl_exec)
|
||||
}
|
||||
|
||||
/* Length of element + equal sign + length of key + null */
|
||||
ZEND_ASSERT(Z_STRLEN_P(element) < SIZE_MAX && ZSTR_LEN(key) < SIZE_MAX);
|
||||
*pair = safe_emalloc(Z_STRLEN_P(element) + 1, sizeof(char), ZSTR_LEN(key) + 1);
|
||||
pair_length = Z_STRLEN_P(element) + ZSTR_LEN(key) + 2;
|
||||
*pair = emalloc(pair_length);
|
||||
strlcpy(*pair, ZSTR_VAL(key), ZSTR_LEN(key) + 1);
|
||||
strlcat(*pair, "=", pair_length);
|
||||
strlcat(*pair, Z_STRVAL_P(element), pair_length);
|
||||
|
||||
@@ -9,6 +9,9 @@ pcntl: SIG_BLOCK, SIG_UNBLOCK, SIG_SETMASK
|
||||
--FILE--
|
||||
<?php
|
||||
|
||||
// Clear mask
|
||||
pcntl_sigprocmask(SIG_SETMASK, array(), $prev);
|
||||
|
||||
pcntl_sigprocmask(SIG_BLOCK, array(SIGCHLD,SIGTERM), $old);
|
||||
var_dump(count($old));
|
||||
pcntl_sigprocmask(SIG_BLOCK, array(SIGINT), $old);
|
||||
@@ -19,7 +22,9 @@ pcntl_sigprocmask(SIG_SETMASK, array(SIGINT), $old);
|
||||
var_dump(count($old));
|
||||
pcntl_sigprocmask(SIG_SETMASK, array(), $old);
|
||||
var_dump(count($old));
|
||||
pcntl_sigprocmask(SIG_SETMASK, array(), $old);
|
||||
|
||||
// Restore previous mask
|
||||
pcntl_sigprocmask(SIG_SETMASK, $prev, $old);
|
||||
var_dump(count($old));
|
||||
|
||||
?>
|
||||
|
||||
+5
-1
@@ -790,8 +790,8 @@ PHPAPI pcre_cache_entry* pcre_get_compiled_regex_cache_ex(zend_string *regex, in
|
||||
zend_hash_add_ptr(&char_tables, _k, (void *)tables);
|
||||
zend_string_release(_k);
|
||||
}
|
||||
pcre2_set_character_tables(cctx, tables);
|
||||
}
|
||||
pcre2_set_character_tables(cctx, tables);
|
||||
|
||||
/* Compile pattern and display a warning if compilation failed. */
|
||||
re = pcre2_compile((PCRE2_SPTR)pattern, pattern_len, coptions, &errnumber, &erroffset, cctx);
|
||||
@@ -2640,6 +2640,10 @@ matched:
|
||||
the match again at the same point. If this fails (picked up above) we
|
||||
advance to the next character. */
|
||||
if (start_offset == offsets[0]) {
|
||||
/* Get next piece if no limit or limit not yet reached and something matched*/
|
||||
if (limit_val != -1 && limit_val <= 1) {
|
||||
break;
|
||||
}
|
||||
count = pcre2_match(pce->re, (PCRE2_SPTR)subject, ZSTR_LEN(subject_str), start_offset,
|
||||
PCRE2_NO_UTF_CHECK | PCRE2_NOTEMPTY_ATSTART | PCRE2_ANCHORED, match_data, mctx);
|
||||
if (count >= 0) {
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
--TEST--
|
||||
Bug #80866 preg_split ignores limit flag when pattern with \K has 0-width fullstring match
|
||||
--FILE--
|
||||
<?php
|
||||
var_export(preg_split('~.{3}\K~', 'abcdefghijklm', 3));
|
||||
?>
|
||||
--EXPECT--
|
||||
array (
|
||||
0 => 'abc',
|
||||
1 => 'def',
|
||||
2 => 'ghijklm',
|
||||
)
|
||||
@@ -0,0 +1,18 @@
|
||||
--TEST--
|
||||
Changing LC_CTYPE back to C
|
||||
--SKIPIF--
|
||||
<?php
|
||||
if (!setlocale(LC_CTYPE, "de_DE", "de-DE")) die("skip requires de_DE locale");
|
||||
?>
|
||||
--FILE--
|
||||
<?php
|
||||
var_dump(setlocale(LC_CTYPE, "de_DE", "de-DE") !== false);
|
||||
var_dump(preg_match('/\w/', "\xe4"));
|
||||
var_dump(setlocale(LC_CTYPE, "C") !== false);
|
||||
var_dump(preg_match('/\w/', "\xe4"));
|
||||
?>
|
||||
--EXPECT--
|
||||
bool(true)
|
||||
int(1)
|
||||
bool(true)
|
||||
int(0)
|
||||
+1
-1
@@ -1462,7 +1462,7 @@ static void dbh_free(pdo_dbh_t *dbh, zend_bool free_persistent)
|
||||
static void pdo_dbh_free_storage(zend_object *std)
|
||||
{
|
||||
pdo_dbh_t *dbh = php_pdo_dbh_fetch_inner(std);
|
||||
if (dbh->in_txn && dbh->methods && dbh->methods->rollback) {
|
||||
if (dbh->driver_data && dbh->methods && dbh->methods->rollback && pdo_is_in_transaction(dbh)) {
|
||||
dbh->methods->rollback(dbh);
|
||||
dbh->in_txn = 0;
|
||||
}
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
class PDOStatement implements IteratorAggregate
|
||||
{
|
||||
/** @return bool */
|
||||
public function bindColumn(string|int $column, mixed &$var, int $type = 0, int $maxLength = 0, mixed $driverOptions = null) {}
|
||||
public function bindColumn(string|int $column, mixed &$var, int $type = PDO::PARAM_STR, int $maxLength = 0, mixed $driverOptions = null) {}
|
||||
|
||||
/** @return bool */
|
||||
public function bindParam(string|int $param, mixed &$var, int $type = PDO::PARAM_STR, int $maxLength = 0, mixed $driverOptions = null) {}
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
/* This is a generated file, edit the .stub.php file instead.
|
||||
* Stub hash: 9d890849a08b43cb35e2cd8468aeaabfc0a7f218 */
|
||||
* Stub hash: 764dfcd532d90de147f5e4b17e8a56e1545e289c */
|
||||
|
||||
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_PDOStatement_bindColumn, 0, 0, 2)
|
||||
ZEND_ARG_TYPE_MASK(0, column, MAY_BE_STRING|MAY_BE_LONG, NULL)
|
||||
ZEND_ARG_TYPE_INFO(1, var, IS_MIXED, 0)
|
||||
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, type, IS_LONG, 0, "0")
|
||||
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, type, IS_LONG, 0, "PDO::PARAM_STR")
|
||||
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, maxLength, IS_LONG, 0, "0")
|
||||
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, driverOptions, IS_MIXED, 0, "null")
|
||||
ZEND_END_ARG_INFO()
|
||||
|
||||
+10
-10
@@ -41,7 +41,7 @@ static int pdo_odbc_fetch_error_func(pdo_dbh_t *dbh, pdo_stmt_t *stmt, zval *inf
|
||||
|
||||
message = strpprintf(0, "%s (%s[%ld] at %s:%d)",
|
||||
einfo->last_err_msg,
|
||||
einfo->what, einfo->last_error,
|
||||
einfo->what, (long) einfo->last_error,
|
||||
einfo->file, einfo->line);
|
||||
|
||||
add_next_index_long(info, einfo->last_error);
|
||||
@@ -85,8 +85,8 @@ void pdo_odbc_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt, PDO_ODBC_HSTMT statement,
|
||||
eh = H->env;
|
||||
}
|
||||
|
||||
rc = SQLGetDiagRec(htype, eh, recno++, einfo->last_state, &einfo->last_error,
|
||||
einfo->last_err_msg, sizeof(einfo->last_err_msg)-1, &errmsgsize);
|
||||
rc = SQLGetDiagRec(htype, eh, recno++, (SQLCHAR *) einfo->last_state, &einfo->last_error,
|
||||
(SQLCHAR *) einfo->last_err_msg, sizeof(einfo->last_err_msg)-1, &errmsgsize);
|
||||
|
||||
if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {
|
||||
errmsgsize = 0;
|
||||
@@ -110,8 +110,8 @@ void pdo_odbc_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt, PDO_ODBC_HSTMT statement,
|
||||
* diagnostic records (which can be generated by PRINT statements
|
||||
* in the query, for instance). */
|
||||
while (rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO) {
|
||||
char discard_state[6];
|
||||
char discard_buf[1024];
|
||||
SQLCHAR discard_state[6];
|
||||
SQLCHAR discard_buf[1024];
|
||||
SQLINTEGER code;
|
||||
rc = SQLGetDiagRec(htype, eh, recno++, discard_state, &code,
|
||||
discard_buf, sizeof(discard_buf)-1, &errmsgsize);
|
||||
@@ -192,7 +192,7 @@ static int odbc_handle_preparer(pdo_dbh_t *dbh, const char *sql, size_t sql_len,
|
||||
}
|
||||
}
|
||||
|
||||
rc = SQLPrepare(S->stmt, (char*)sql, SQL_NTS);
|
||||
rc = SQLPrepare(S->stmt, (SQLCHAR *) sql, SQL_NTS);
|
||||
if (nsql) {
|
||||
efree(nsql);
|
||||
}
|
||||
@@ -230,7 +230,7 @@ static zend_long odbc_handle_doer(pdo_dbh_t *dbh, const char *sql, size_t sql_le
|
||||
return -1;
|
||||
}
|
||||
|
||||
rc = SQLExecDirect(stmt, (char *)sql, sql_len);
|
||||
rc = SQLExecDirect(stmt, (SQLCHAR *) sql, sql_len);
|
||||
|
||||
if (rc == SQL_NO_DATA) {
|
||||
/* If SQLExecDirect executes a searched update or delete statement that
|
||||
@@ -438,7 +438,7 @@ static int pdo_odbc_handle_factory(pdo_dbh_t *dbh, zval *driver_options) /* {{{
|
||||
}
|
||||
|
||||
if (strchr(dbh->data_source, ';')) {
|
||||
char dsnbuf[1024];
|
||||
SQLCHAR dsnbuf[1024];
|
||||
SQLSMALLINT dsnbuflen;
|
||||
|
||||
use_direct = 1;
|
||||
@@ -452,11 +452,11 @@ static int pdo_odbc_handle_factory(pdo_dbh_t *dbh, zval *driver_options) /* {{{
|
||||
dbh->data_source = dsn;
|
||||
}
|
||||
|
||||
rc = SQLDriverConnect(H->dbc, NULL, (char*)dbh->data_source, strlen(dbh->data_source),
|
||||
rc = SQLDriverConnect(H->dbc, NULL, (SQLCHAR *) dbh->data_source, strlen(dbh->data_source),
|
||||
dsnbuf, sizeof(dsnbuf)-1, &dsnbuflen, SQL_DRIVER_NOPROMPT);
|
||||
}
|
||||
if (!use_direct) {
|
||||
rc = SQLConnect(H->dbc, (char*)dbh->data_source, SQL_NTS, dbh->username, SQL_NTS, dbh->password, SQL_NTS);
|
||||
rc = SQLConnect(H->dbc, (SQLCHAR *) dbh->data_source, SQL_NTS, (SQLCHAR *) dbh->username, SQL_NTS, (SQLCHAR *) dbh->password, SQL_NTS);
|
||||
}
|
||||
|
||||
if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {
|
||||
|
||||
@@ -567,7 +567,7 @@ static int odbc_stmt_describe(pdo_stmt_t *stmt, int colno)
|
||||
SQLULEN colsize;
|
||||
SQLLEN displaysize = 0;
|
||||
|
||||
rc = SQLDescribeCol(S->stmt, colno+1, S->cols[colno].colname,
|
||||
rc = SQLDescribeCol(S->stmt, colno+1, (SQLCHAR *) S->cols[colno].colname,
|
||||
sizeof(S->cols[colno].colname)-1, &colnamelen,
|
||||
&S->cols[colno].coltype, &colsize, NULL, NULL);
|
||||
|
||||
@@ -650,6 +650,7 @@ static int odbc_stmt_get_col(pdo_stmt_t *stmt, int colno, char **ptr, zend_ulong
|
||||
|
||||
/* if it is a column containing "long" data, perform late binding now */
|
||||
if (C->is_long) {
|
||||
SQLLEN orig_fetched_len = SQL_NULL_DATA;
|
||||
zend_ulong used = 0;
|
||||
char *buf;
|
||||
RETCODE rc;
|
||||
@@ -660,18 +661,20 @@ static int odbc_stmt_get_col(pdo_stmt_t *stmt, int colno, char **ptr, zend_ulong
|
||||
|
||||
rc = SQLGetData(S->stmt, colno+1, C->is_unicode ? SQL_C_BINARY : SQL_C_CHAR, C->data,
|
||||
256, &C->fetched_len);
|
||||
orig_fetched_len = C->fetched_len;
|
||||
|
||||
if (rc == SQL_SUCCESS) {
|
||||
if (rc == SQL_SUCCESS && C->fetched_len < 256) {
|
||||
/* all the data fit into our little buffer;
|
||||
* jump down to the generic bound data case */
|
||||
goto in_data;
|
||||
}
|
||||
|
||||
if (rc == SQL_SUCCESS_WITH_INFO) {
|
||||
if (rc == SQL_SUCCESS_WITH_INFO || rc == SQL_SUCCESS) {
|
||||
/* this is a 'long column'
|
||||
|
||||
read the column in 255 byte blocks until the end of the column is reached, reassembling those blocks
|
||||
in order into the output buffer
|
||||
in order into the output buffer; 255 bytes are an optimistic assumption, since the driver may assert
|
||||
more or less NUL bytes at the end; we cater to that later, if actual length information is available
|
||||
|
||||
this loop has to work whether or not SQLGetData() provides the total column length.
|
||||
calling SQLDescribeCol() or other, specifically to get the column length, then doing a single read
|
||||
@@ -685,10 +688,17 @@ static int odbc_stmt_get_col(pdo_stmt_t *stmt, int colno, char **ptr, zend_ulong
|
||||
do {
|
||||
C->fetched_len = 0;
|
||||
/* read block. 256 bytes => 255 bytes are actually read, the last 1 is NULL */
|
||||
rc = SQLGetData(S->stmt, colno+1, SQL_C_CHAR, buf2, 256, &C->fetched_len);
|
||||
rc = SQLGetData(S->stmt, colno+1, C->is_unicode ? SQL_C_BINARY : SQL_C_CHAR, buf2, 256, &C->fetched_len);
|
||||
|
||||
/* adjust `used` in case we have length info from the driver */
|
||||
if (orig_fetched_len >= 0 && C->fetched_len >= 0) {
|
||||
SQLLEN fixed_used = orig_fetched_len - C->fetched_len;
|
||||
ZEND_ASSERT(fixed_used <= used + 1);
|
||||
used = fixed_used;
|
||||
}
|
||||
|
||||
/* resize output buffer and reassemble block */
|
||||
if (rc==SQL_SUCCESS_WITH_INFO) {
|
||||
if (rc==SQL_SUCCESS_WITH_INFO || (rc==SQL_SUCCESS && C->fetched_len > 255)) {
|
||||
/* point 5, in section "Retrieving Data with SQLGetData" in http://msdn.microsoft.com/en-us/library/windows/desktop/ms715441(v=vs.85).aspx
|
||||
states that if SQL_SUCCESS_WITH_INFO, fetched_len will be > 255 (greater than buf2's size)
|
||||
(if a driver fails to follow that and wrote less than 255 bytes to buf2, this will AV or read garbage into buf) */
|
||||
@@ -777,7 +787,7 @@ static int odbc_stmt_set_param(pdo_stmt_t *stmt, zend_long attr, zval *val)
|
||||
switch (attr) {
|
||||
case PDO_ATTR_CURSOR_NAME:
|
||||
convert_to_string(val);
|
||||
rc = SQLSetCursorName(S->stmt, Z_STRVAL_P(val), Z_STRLEN_P(val));
|
||||
rc = SQLSetCursorName(S->stmt, (SQLCHAR *) Z_STRVAL_P(val), Z_STRLEN_P(val));
|
||||
|
||||
if (rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO) {
|
||||
return 1;
|
||||
@@ -806,7 +816,7 @@ static int odbc_stmt_get_attr(pdo_stmt_t *stmt, zend_long attr, zval *val)
|
||||
{
|
||||
char buf[256];
|
||||
SQLSMALLINT len = 0;
|
||||
rc = SQLGetCursorName(S->stmt, buf, sizeof(buf), &len);
|
||||
rc = SQLGetCursorName(S->stmt, (SQLCHAR *) buf, sizeof(buf), &len);
|
||||
|
||||
if (rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO) {
|
||||
ZVAL_STRINGL(val, buf, len);
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
--TEST--
|
||||
Bug #80783 (PDO ODBC truncates BLOB records at every 256th byte)
|
||||
--SKIPIF--
|
||||
<?php
|
||||
if (!extension_loaded('pdo_odbc')) die('skip pdo_odbc extension not available');
|
||||
require 'ext/pdo/tests/pdo_test.inc';
|
||||
PDOTest::skip();
|
||||
?>
|
||||
--FILE--
|
||||
<?php
|
||||
require 'ext/pdo/tests/pdo_test.inc';
|
||||
$db = PDOTest::test_factory(dirname(__FILE__) . '/common.phpt');
|
||||
$db->exec("CREATE TABLE bug80783 (name IMAGE)");
|
||||
|
||||
$string = str_repeat("0123456789", 50);
|
||||
$db->exec("INSERT INTO bug80783 VALUES('$string')");
|
||||
|
||||
$stmt = $db->prepare("SELECT name FROM bug80783");
|
||||
$stmt->bindColumn(1, $data, PDO::PARAM_LOB);
|
||||
$stmt->execute();
|
||||
$stmt->fetch(PDO::FETCH_BOUND);
|
||||
|
||||
var_dump($data === bin2hex($string));
|
||||
?>
|
||||
--CLEAN--
|
||||
<?php
|
||||
require 'ext/pdo/tests/pdo_test.inc';
|
||||
$db = PDOTest::test_factory(dirname(__FILE__) . '/common.phpt');
|
||||
$db->exec("DROP TABLE bug80783");
|
||||
?>
|
||||
--EXPECT--
|
||||
bool(true)
|
||||
@@ -0,0 +1,33 @@
|
||||
--TEST--
|
||||
Bug #80783 (PDO ODBC truncates BLOB records at every 256th byte)
|
||||
--SKIPIF--
|
||||
<?php
|
||||
if (!extension_loaded('pdo_odbc')) die('skip pdo_odbc extension not available');
|
||||
require 'ext/pdo/tests/pdo_test.inc';
|
||||
PDOTest::skip();
|
||||
?>
|
||||
--FILE--
|
||||
<?php
|
||||
require 'ext/pdo/tests/pdo_test.inc';
|
||||
$db = PDOTest::test_factory(dirname(__FILE__) . '/common.phpt');
|
||||
$db->exec("CREATE TABLE bug80783a (name NVARCHAR(MAX))");
|
||||
|
||||
$string = str_repeat("0123456789", 50);
|
||||
$db->exec("INSERT INTO bug80783a VALUES('$string')");
|
||||
|
||||
$stmt = $db->prepare("SELECT name FROM bug80783a");
|
||||
$stmt->setAttribute(PDO::ODBC_ATTR_ASSUME_UTF8, true);
|
||||
$stmt->bindColumn(1, $data, PDO::PARAM_STR);
|
||||
$stmt->execute();
|
||||
$stmt->fetch(PDO::FETCH_BOUND);
|
||||
|
||||
var_dump($data === $string);
|
||||
?>
|
||||
--CLEAN--
|
||||
<?php
|
||||
require 'ext/pdo/tests/pdo_test.inc';
|
||||
$db = PDOTest::test_factory(dirname(__FILE__) . '/common.phpt');
|
||||
$db->exec("DROP TABLE bug80783a");
|
||||
?>
|
||||
--EXPECT--
|
||||
bool(true)
|
||||
@@ -3,6 +3,8 @@ PDO ODBC varying character with max/no length
|
||||
--SKIPIF--
|
||||
<?php
|
||||
if (!extension_loaded('pdo_odbc')) print 'skip not loaded';
|
||||
require 'ext/pdo/tests/pdo_test.inc';
|
||||
PDOTest::skip();
|
||||
?>
|
||||
--FILE--
|
||||
<?php
|
||||
|
||||
@@ -52,6 +52,19 @@
|
||||
#define VARCHARLABEL "varchar"
|
||||
#define VARCHAROID 1043
|
||||
|
||||
#define PG_INT32_MIN (-0x7FFFFFFF-1)
|
||||
#define PG_INT32_MAX (0x7FFFFFFF)
|
||||
|
||||
#if defined(_MSC_VER)
|
||||
# define strtoll(s, f, b) _atoi64(s)
|
||||
#elif !defined(HAVE_STRTOLL)
|
||||
# if defined(HAVE_ATOLL)
|
||||
# define strtoll(s, f, b) atoll(s)
|
||||
# else
|
||||
# define strtoll(s, f, b) strtol(s, f, b)
|
||||
# endif
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
static int pgsql_stmt_dtor(pdo_stmt_t *stmt)
|
||||
@@ -388,7 +401,16 @@ static int pgsql_stmt_param_hook(pdo_stmt_t *stmt, struct pdo_bound_param_data *
|
||||
S->param_formats[param->paramno] = 0;
|
||||
}
|
||||
|
||||
if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_LOB) {
|
||||
if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_INT) {
|
||||
/* we need to check if the number requires bigints */
|
||||
long long val = strtoll(Z_STRVAL_P(parameter), NULL, 10);
|
||||
|
||||
if (val > PG_INT32_MAX || val < PG_INT32_MIN) {
|
||||
S->param_types[param->paramno] = INT8OID;
|
||||
} else {
|
||||
S->param_types[param->paramno] = INT4OID;
|
||||
}
|
||||
} else if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_LOB) {
|
||||
S->param_types[param->paramno] = 0;
|
||||
S->param_formats[param->paramno] = 1;
|
||||
} else {
|
||||
|
||||
@@ -0,0 +1,77 @@
|
||||
--TEST--
|
||||
Bug #80892 PDO::PARAM_INT is treated the same as PDO::PARAM_STR
|
||||
--SKIPIF--
|
||||
<?php
|
||||
if (!extension_loaded('pdo') || !extension_loaded('pdo_pgsql')) die('skip not loaded');
|
||||
require __DIR__ . '/config.inc';
|
||||
require __DIR__ . '/../../../ext/pdo/tests/pdo_test.inc';
|
||||
PDOTest::skip();
|
||||
?>
|
||||
--FILE--
|
||||
<?php
|
||||
require __DIR__ . '/../../../ext/pdo/tests/pdo_test.inc';
|
||||
|
||||
/** @var PDO $db */
|
||||
$db = PDOTest::test_factory(__DIR__ . '/common.phpt');
|
||||
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
|
||||
$db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
|
||||
|
||||
$db->exec("CREATE OR REPLACE FUNCTION bug80892 (x bigint) RETURNS varchar AS $$ SELECT 'bigint' $$ LANGUAGE sql");
|
||||
$db->exec("CREATE OR REPLACE FUNCTION bug80892 (x int) RETURNS varchar AS $$ SELECT 'int' $$ LANGUAGE sql");
|
||||
$db->exec("CREATE OR REPLACE FUNCTION bug80892 (x text) RETURNS varchar AS $$ SELECT 'text' $$ LANGUAGE sql");
|
||||
|
||||
// Sanity check
|
||||
var_dump($db->query("SELECT bug80892(2147483648)")->fetchColumn());
|
||||
var_dump($db->query("SELECT bug80892(1)")->fetchColumn());
|
||||
var_dump($db->query("SELECT bug80892('1')")->fetchColumn());
|
||||
|
||||
// No binding
|
||||
$stmt = $db->prepare("SELECT bug80892(?)");
|
||||
$stmt->execute([1]);
|
||||
var_dump($stmt->fetchColumn());
|
||||
|
||||
// Bind int value as string
|
||||
$stmt = $db->prepare("SELECT bug80892(?)");
|
||||
$stmt->bindValue(1, 1, PDO::PARAM_STR);
|
||||
$stmt->execute();
|
||||
var_dump($stmt->fetchColumn());
|
||||
|
||||
// Bind int value as int
|
||||
$stmt = $db->prepare("SELECT bug80892(?)");
|
||||
$stmt->bindValue(1, 1, PDO::PARAM_INT);
|
||||
$stmt->execute();
|
||||
var_dump($stmt->fetchColumn());
|
||||
|
||||
// Bind string value as int
|
||||
$stmt = $db->prepare("SELECT bug80892(?)");
|
||||
$stmt->bindValue(1, '1', PDO::PARAM_INT);
|
||||
$stmt->execute();
|
||||
var_dump($stmt->fetchColumn());
|
||||
|
||||
// Bind bigint string value as int
|
||||
$stmt = $db->prepare("SELECT bug80892(?)");
|
||||
$stmt->bindValue(1, '2147483648', PDO::PARAM_INT);
|
||||
$stmt->execute();
|
||||
var_dump($stmt->fetchColumn());
|
||||
|
||||
// Bind negative bigint (string on 32bit) as int
|
||||
$stmt = $db->prepare("SELECT bug80892(?)");
|
||||
$stmt->bindValue(1, PHP_INT_SIZE == 4 ? '-33333333333' : -33333333333, PDO::PARAM_INT);
|
||||
$stmt->execute();
|
||||
var_dump($stmt->fetchColumn());
|
||||
|
||||
$db->exec("DROP FUNCTION bug80892 (bigint)");
|
||||
$db->exec("DROP FUNCTION bug80892 (int)");
|
||||
$db->exec("DROP FUNCTION bug80892 (text)");
|
||||
|
||||
?>
|
||||
--EXPECT--
|
||||
string(6) "bigint"
|
||||
string(3) "int"
|
||||
string(4) "text"
|
||||
string(4) "text"
|
||||
string(4) "text"
|
||||
string(3) "int"
|
||||
string(3) "int"
|
||||
string(6) "bigint"
|
||||
string(6) "bigint"
|
||||
+5
-1
@@ -1389,7 +1389,11 @@ static int phar_call_openssl_signverify(int is_sign, php_stream *fp, zend_off_t
|
||||
zend_string *str;
|
||||
|
||||
ZVAL_STRINGL(&openssl, is_sign ? "openssl_sign" : "openssl_verify", is_sign ? sizeof("openssl_sign")-1 : sizeof("openssl_verify")-1);
|
||||
ZVAL_STRINGL(&zp[1], *signature, *signature_len);
|
||||
if (*signature_len) {
|
||||
ZVAL_STRINGL(&zp[1], *signature, *signature_len);
|
||||
} else {
|
||||
ZVAL_EMPTY_STRING(&zp[1]);
|
||||
}
|
||||
ZVAL_STRINGL(&zp[2], key, key_len);
|
||||
php_stream_rewind(fp);
|
||||
str = php_stream_copy_to_mem(fp, (size_t) end, 0);
|
||||
|
||||
+12
-2
@@ -284,22 +284,32 @@ PHP_FUNCTION(posix_setegid)
|
||||
#ifdef HAVE_GETGROUPS
|
||||
PHP_FUNCTION(posix_getgroups)
|
||||
{
|
||||
gid_t gidlist[NGROUPS_MAX];
|
||||
gid_t *gidlist;
|
||||
int result;
|
||||
int i;
|
||||
|
||||
ZEND_PARSE_PARAMETERS_NONE();
|
||||
|
||||
if ((result = getgroups(NGROUPS_MAX, gidlist)) < 0) {
|
||||
/* MacOS may return more than NGROUPS_MAX groups.
|
||||
* Fetch the actual number of groups and create an appropriate allocation. */
|
||||
if ((result = getgroups(0, NULL)) < 0) {
|
||||
POSIX_G(last_error) = errno;
|
||||
RETURN_FALSE;
|
||||
}
|
||||
|
||||
gidlist = emalloc(sizeof(gid_t) * result);
|
||||
if ((result = getgroups(result, gidlist)) < 0) {
|
||||
POSIX_G(last_error) = errno;
|
||||
efree(gidlist);
|
||||
RETURN_FALSE;
|
||||
}
|
||||
|
||||
array_init(return_value);
|
||||
|
||||
for (i=0; i<result; i++) {
|
||||
add_next_index_long(return_value, gidlist[i]);
|
||||
}
|
||||
efree(gidlist);
|
||||
}
|
||||
#endif
|
||||
/* }}} */
|
||||
|
||||
@@ -1533,6 +1533,11 @@ ZEND_METHOD(ReflectionFunction, __construct)
|
||||
}
|
||||
}
|
||||
|
||||
if (intern->ptr) {
|
||||
zval_ptr_dtor(&intern->obj);
|
||||
zval_ptr_dtor(reflection_prop_name(object));
|
||||
}
|
||||
|
||||
ZVAL_STR_COPY(reflection_prop_name(object), fptr->common.function_name);
|
||||
intern->ptr = fptr;
|
||||
intern->ref_type = REF_TYPE_FUNCTION;
|
||||
@@ -2084,6 +2089,10 @@ ZEND_METHOD(ReflectionGenerator, __construct)
|
||||
RETURN_THROWS();
|
||||
}
|
||||
|
||||
if (intern->ce) {
|
||||
zval_ptr_dtor(&intern->obj);
|
||||
}
|
||||
|
||||
intern->ref_type = REF_TYPE_GENERATOR;
|
||||
ZVAL_OBJ_COPY(&intern->obj, Z_OBJ_P(generator));
|
||||
intern->ce = zend_ce_generator;
|
||||
|
||||
+29
-27
@@ -1264,13 +1264,11 @@ static void php_session_remove_cookie(void) {
|
||||
zend_llist_element *next;
|
||||
zend_llist_element *current;
|
||||
char *session_cookie;
|
||||
zend_string *e_session_name;
|
||||
size_t session_cookie_len;
|
||||
size_t len = sizeof("Set-Cookie")-1;
|
||||
|
||||
e_session_name = php_url_encode(PS(session_name), strlen(PS(session_name)));
|
||||
spprintf(&session_cookie, 0, "Set-Cookie: %s=", ZSTR_VAL(e_session_name));
|
||||
zend_string_free(e_session_name);
|
||||
ZEND_ASSERT(strpbrk(PS(session_name), "=,; \t\r\n\013\014") == NULL);
|
||||
spprintf(&session_cookie, 0, "Set-Cookie: %s=", PS(session_name));
|
||||
|
||||
session_cookie_len = strlen(session_cookie);
|
||||
current = l->head;
|
||||
@@ -1302,7 +1300,7 @@ static int php_session_send_cookie(void) /* {{{ */
|
||||
{
|
||||
smart_str ncookie = {0};
|
||||
zend_string *date_fmt = NULL;
|
||||
zend_string *e_session_name, *e_id;
|
||||
zend_string *e_id;
|
||||
|
||||
if (SG(headers_sent)) {
|
||||
const char *output_start_filename = php_output_get_start_filename();
|
||||
@@ -1316,16 +1314,20 @@ static int php_session_send_cookie(void) /* {{{ */
|
||||
return FAILURE;
|
||||
}
|
||||
|
||||
/* URL encode session_name and id because they might be user supplied */
|
||||
e_session_name = php_url_encode(PS(session_name), strlen(PS(session_name)));
|
||||
/* Prevent broken Set-Cookie header, because the session_name might be user supplied */
|
||||
if (strpbrk(PS(session_name), "=,; \t\r\n\013\014") != NULL) { /* man isspace for \013 and \014 */
|
||||
php_error_docref(NULL, E_WARNING, "session.name cannot contain any of the following '=,; \\t\\r\\n\\013\\014'");
|
||||
return FAILURE;
|
||||
}
|
||||
|
||||
/* URL encode id because it might be user supplied */
|
||||
e_id = php_url_encode(ZSTR_VAL(PS(id)), ZSTR_LEN(PS(id)));
|
||||
|
||||
smart_str_appendl(&ncookie, "Set-Cookie: ", sizeof("Set-Cookie: ")-1);
|
||||
smart_str_appendl(&ncookie, ZSTR_VAL(e_session_name), ZSTR_LEN(e_session_name));
|
||||
smart_str_appendl(&ncookie, PS(session_name), strlen(PS(session_name)));
|
||||
smart_str_appendc(&ncookie, '=');
|
||||
smart_str_appendl(&ncookie, ZSTR_VAL(e_id), ZSTR_LEN(e_id));
|
||||
|
||||
zend_string_release_ex(e_session_name, 0);
|
||||
zend_string_release_ex(e_id, 0);
|
||||
|
||||
if (PS(cookie_lifetime) > 0) {
|
||||
@@ -1950,12 +1952,23 @@ static int save_handler_check_session() {
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
static inline void set_user_save_handler_ini(void) {
|
||||
zend_string *ini_name, *ini_val;
|
||||
|
||||
ini_name = zend_string_init("session.save_handler", sizeof("session.save_handler") - 1, 0);
|
||||
ini_val = zend_string_init("user", sizeof("user") - 1, 0);
|
||||
PS(set_handler) = 1;
|
||||
zend_alter_ini_entry(ini_name, ini_val, PHP_INI_USER, PHP_INI_STAGE_RUNTIME);
|
||||
PS(set_handler) = 0;
|
||||
zend_string_release_ex(ini_val, 0);
|
||||
zend_string_release_ex(ini_name, 0);
|
||||
}
|
||||
|
||||
/* {{{ Sets user-level functions */
|
||||
PHP_FUNCTION(session_set_save_handler)
|
||||
{
|
||||
zval *args = NULL;
|
||||
int i, num_args, argc = ZEND_NUM_ARGS();
|
||||
zend_string *ini_name, *ini_val;
|
||||
|
||||
if (argc > 0 && argc <= 2) {
|
||||
zval *obj = NULL;
|
||||
@@ -2049,14 +2062,8 @@ PHP_FUNCTION(session_set_save_handler)
|
||||
remove_user_shutdown_function("session_shutdown", sizeof("session_shutdown") - 1);
|
||||
}
|
||||
|
||||
if (PS(mod) && PS(session_status) != php_session_active && PS(mod) != &ps_mod_user) {
|
||||
ini_name = zend_string_init("session.save_handler", sizeof("session.save_handler") - 1, 0);
|
||||
ini_val = zend_string_init("user", sizeof("user") - 1, 0);
|
||||
PS(set_handler) = 1;
|
||||
zend_alter_ini_entry(ini_name, ini_val, PHP_INI_USER, PHP_INI_STAGE_RUNTIME);
|
||||
PS(set_handler) = 0;
|
||||
zend_string_release_ex(ini_val, 0);
|
||||
zend_string_release_ex(ini_name, 0);
|
||||
if (PS(session_status) != php_session_active && (!PS(mod) || PS(mod) != &ps_mod_user)) {
|
||||
set_user_save_handler_ini();
|
||||
}
|
||||
|
||||
RETURN_TRUE;
|
||||
@@ -2088,14 +2095,8 @@ PHP_FUNCTION(session_set_save_handler)
|
||||
/* remove shutdown function */
|
||||
remove_user_shutdown_function("session_shutdown", sizeof("session_shutdown") - 1);
|
||||
|
||||
if (PS(mod) && PS(mod) != &ps_mod_user) {
|
||||
ini_name = zend_string_init("session.save_handler", sizeof("session.save_handler") - 1, 0);
|
||||
ini_val = zend_string_init("user", sizeof("user") - 1, 0);
|
||||
PS(set_handler) = 1;
|
||||
zend_alter_ini_entry(ini_name, ini_val, PHP_INI_USER, PHP_INI_STAGE_RUNTIME);
|
||||
PS(set_handler) = 0;
|
||||
zend_string_release_ex(ini_val, 0);
|
||||
zend_string_release_ex(ini_name, 0);
|
||||
if (!PS(mod) || PS(mod) != &ps_mod_user) {
|
||||
set_user_save_handler_ini();
|
||||
}
|
||||
|
||||
for (i = 0; i < argc; i++) {
|
||||
@@ -2690,7 +2691,8 @@ static int php_rinit_session(zend_bool auto_start) /* {{{ */
|
||||
{
|
||||
php_rinit_session_globals();
|
||||
|
||||
if (PS(mod) == NULL) {
|
||||
PS(mod) = NULL;
|
||||
{
|
||||
char *value;
|
||||
|
||||
value = zend_ini_string("session.save_handler", sizeof("session.save_handler") - 1, 0);
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
--TEST--
|
||||
Bug #80774 (session_name() problem with backslash)
|
||||
--SKIPIF--
|
||||
<?php
|
||||
if (!extension_loaded('session')) die("skip session extension not available");
|
||||
?>
|
||||
--FILE--
|
||||
<?php
|
||||
session_name("foo\\bar");
|
||||
session_id('12345');
|
||||
session_start();
|
||||
?>
|
||||
--EXPECTHEADERS--
|
||||
Set-Cookie: foo\bar=12345; path=/
|
||||
--EXPECT--
|
||||
@@ -0,0 +1,37 @@
|
||||
--TEST--
|
||||
Bug #80889 (Cannot set save handler when save_handler is invalid)
|
||||
--SKIPIF--
|
||||
<?php include('skipif.inc'); ?>
|
||||
--INI--
|
||||
session.save_handler=whatever
|
||||
--FILE--
|
||||
<?php
|
||||
class DummyHandler implements SessionHandlerInterface {
|
||||
public function open($savePath, $sessionName) {
|
||||
return true;
|
||||
}
|
||||
public function close() {
|
||||
return true;
|
||||
}
|
||||
public function read($id) {
|
||||
return '';
|
||||
}
|
||||
public function write($id, $data) {
|
||||
return true;
|
||||
}
|
||||
public function destroy($id) {
|
||||
return true;
|
||||
}
|
||||
public function gc($maxlifetime) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
$initHandler = ini_get('session.save_handler');
|
||||
session_set_save_handler(new DummyHandler());
|
||||
$setHandler = ini_get('session.save_handler');
|
||||
var_dump($initHandler, $setHandler);
|
||||
?>
|
||||
--EXPECT--
|
||||
string(8) "whatever"
|
||||
string(4) "user"
|
||||
@@ -0,0 +1,35 @@
|
||||
--TEST--
|
||||
Bug #80889 (Cannot set save handler when save_handler is invalid)
|
||||
--SKIPIF--
|
||||
<?php include('skipif.inc'); ?>
|
||||
--INI--
|
||||
session.save_handler=whatever
|
||||
--FILE--
|
||||
<?php
|
||||
$initHandler = ini_get('session.save_handler');
|
||||
session_set_save_handler(
|
||||
function ($savePath, $sessionName) {
|
||||
return true;
|
||||
},
|
||||
function () {
|
||||
return true;
|
||||
},
|
||||
function ($id) {
|
||||
return '';
|
||||
},
|
||||
function ($id, $data) {
|
||||
return true;
|
||||
},
|
||||
function ($id) {
|
||||
return true;
|
||||
},
|
||||
function ($maxlifetime) {
|
||||
return true;
|
||||
}
|
||||
);
|
||||
$setHandler = ini_get('session.save_handler');
|
||||
var_dump($initHandler, $setHandler);
|
||||
?>
|
||||
--EXPECT--
|
||||
string(8) "whatever"
|
||||
string(4) "user"
|
||||
@@ -42,6 +42,8 @@ string(9) "PHPSESSID"
|
||||
bool(true)
|
||||
string(9) "PHPSESSID"
|
||||
string(9) "PHPSESSID"
|
||||
|
||||
Warning: session_start(): session.name cannot contain any of the following '=,; \t\r\n\013\014' in %s on line %d
|
||||
bool(true)
|
||||
string(1) " "
|
||||
bool(true)
|
||||
@@ -49,6 +51,8 @@ string(1) " "
|
||||
|
||||
Warning: session_name(): session.name "" cannot be numeric or empty in %s on line %d
|
||||
string(1) " "
|
||||
|
||||
Warning: session_start(): session.name cannot contain any of the following '=,; \t\r\n\013\014' in %s on line %d
|
||||
bool(true)
|
||||
string(1) " "
|
||||
bool(true)
|
||||
|
||||
@@ -3379,6 +3379,7 @@ xmlNsPtr encode_add_ns(xmlNodePtr node, const char* ns)
|
||||
} else {
|
||||
smart_str prefix = {0};
|
||||
int num = ++SOAP_GLOBAL(cur_uniq_ns);
|
||||
xmlChar *enc_ns;
|
||||
|
||||
while (1) {
|
||||
smart_str_appendl(&prefix, "ns", 2);
|
||||
@@ -3392,7 +3393,9 @@ xmlNsPtr encode_add_ns(xmlNodePtr node, const char* ns)
|
||||
num = ++SOAP_GLOBAL(cur_uniq_ns);
|
||||
}
|
||||
|
||||
xmlns = xmlNewNs(node->doc->children, BAD_CAST(ns), BAD_CAST(prefix.s ? ZSTR_VAL(prefix.s) : ""));
|
||||
enc_ns = xmlEncodeSpecialChars(node->doc, BAD_CAST(ns));
|
||||
xmlns = xmlNewNs(node->doc->children, enc_ns, BAD_CAST(prefix.s ? ZSTR_VAL(prefix.s) : ""));
|
||||
xmlFree(enc_ns);
|
||||
smart_str_free(&prefix);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
--TEST--
|
||||
Bug #69668 (SOAP: special XML characters in namespace URIs not encoded)
|
||||
--SKIPIF--
|
||||
<?php
|
||||
require_once('skipif.inc');
|
||||
?>
|
||||
--FILE--
|
||||
<?php
|
||||
class MySoapClient extends SoapClient {
|
||||
public function __doRequest($request, $location, $action, $version, $one_way = 0) {
|
||||
echo $request, PHP_EOL;
|
||||
return '';
|
||||
}
|
||||
}
|
||||
|
||||
$client = new MySoapClient(__DIR__ . '/bug69668.wsdl', [
|
||||
'trace' => true,
|
||||
'exceptions' => true,
|
||||
'cache_wsdl' => WSDL_CACHE_NONE,
|
||||
]);
|
||||
|
||||
$client->test();
|
||||
?>
|
||||
--EXPECT--
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://localhost/69668.php?a=a&b=b" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><SOAP-ENV:Body><ns1:test/></SOAP-ENV:Body></SOAP-ENV:Envelope>
|
||||
@@ -0,0 +1,35 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://localhost/69668.php?a=a&b=b" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||
xmlns:soap-enc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" name="TestService" targetNamespace="http://localhost/69668.php?a=a&b=b">
|
||||
<types>
|
||||
<xsd:schema targetNamespace="http://localhost/69668.php?a=a&b=b" />
|
||||
</types>
|
||||
<portType name="TestServicePort">
|
||||
<operation name="test">
|
||||
<documentation>test</documentation>
|
||||
<input message="tns:testIn" />
|
||||
<output message="tns:testOut" />
|
||||
</operation>
|
||||
</portType>
|
||||
<binding name="TestServiceBinding" type="tns:TestServicePort">
|
||||
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http" />
|
||||
<operation name="test">
|
||||
<soap:operation soapAction="http://localhost/69668.php?a=a&b=b#test" />
|
||||
<input>
|
||||
<soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://localhost/69668.php?a=a&b=b" />
|
||||
</input>
|
||||
<output>
|
||||
<soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://localhost/69668.php?a=a&b=b" />
|
||||
</output>
|
||||
</operation>
|
||||
</binding>
|
||||
<service name="TestServiceService">
|
||||
<port name="TestServicePort" binding="tns:TestServiceBinding">
|
||||
<soap:address location="http://localhost/69668.php?a=a&b=b" />
|
||||
</port>
|
||||
</service>
|
||||
<message name="testIn" />
|
||||
<message name="testOut">
|
||||
<part name="return" type="xsd:string" />
|
||||
</message>
|
||||
</definitions>
|
||||
+1
-1
@@ -365,7 +365,7 @@ num_index:
|
||||
zend_error(E_WARNING, "Undefined array key " ZEND_LONG_FMT, index);
|
||||
case BP_VAR_W: {
|
||||
zval value;
|
||||
ZVAL_UNDEF(&value);
|
||||
ZVAL_NULL(&value);
|
||||
retval = zend_hash_index_update(ht, index, &value);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -695,13 +695,7 @@ function utf8_decode(string $string): string {}
|
||||
*/
|
||||
function opendir(string $directory, $context = null) {}
|
||||
|
||||
/** @param resource $context */
|
||||
function getdir(string $directory, $context = null): Directory|false {}
|
||||
|
||||
/**
|
||||
* @param resource|null $context
|
||||
* @alias getdir
|
||||
*/
|
||||
/** @param resource|null $context */
|
||||
function dir(string $directory, $context = null): Directory|false {}
|
||||
|
||||
/** @param resource|null $dir_handle */
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* This is a generated file, edit the .stub.php file instead.
|
||||
* Stub hash: 39cd1ddd82efd6b62605218faff8b720d8b97170 */
|
||||
* Stub hash: b1d68b2f2dcc7a078257c65569f2eec284dcd804 */
|
||||
|
||||
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_set_time_limit, 0, 1, _IS_BOOL, 0)
|
||||
ZEND_ARG_TYPE_INFO(0, seconds, IS_LONG, 0)
|
||||
@@ -1094,13 +1094,11 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_opendir, 0, 0, 1)
|
||||
ZEND_ARG_INFO_WITH_DEFAULT_VALUE(0, context, "null")
|
||||
ZEND_END_ARG_INFO()
|
||||
|
||||
ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_getdir, 0, 1, Directory, MAY_BE_FALSE)
|
||||
ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_dir, 0, 1, Directory, MAY_BE_FALSE)
|
||||
ZEND_ARG_TYPE_INFO(0, directory, IS_STRING, 0)
|
||||
ZEND_ARG_INFO_WITH_DEFAULT_VALUE(0, context, "null")
|
||||
ZEND_END_ARG_INFO()
|
||||
|
||||
#define arginfo_dir arginfo_getdir
|
||||
|
||||
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_closedir, 0, 0, IS_VOID, 0)
|
||||
ZEND_ARG_INFO_WITH_DEFAULT_VALUE(0, dir_handle, "null")
|
||||
ZEND_END_ARG_INFO()
|
||||
@@ -2512,7 +2510,7 @@ ZEND_FUNCTION(substr_compare);
|
||||
ZEND_FUNCTION(utf8_encode);
|
||||
ZEND_FUNCTION(utf8_decode);
|
||||
ZEND_FUNCTION(opendir);
|
||||
ZEND_FUNCTION(getdir);
|
||||
ZEND_FUNCTION(dir);
|
||||
ZEND_FUNCTION(closedir);
|
||||
ZEND_FUNCTION(chdir);
|
||||
#if defined(HAVE_CHROOT) && !defined(ZTS) && ENABLE_CHROOT_FUNC
|
||||
@@ -3147,8 +3145,7 @@ static const zend_function_entry ext_functions[] = {
|
||||
ZEND_FE(utf8_encode, arginfo_utf8_encode)
|
||||
ZEND_FE(utf8_decode, arginfo_utf8_decode)
|
||||
ZEND_FE(opendir, arginfo_opendir)
|
||||
ZEND_FE(getdir, arginfo_getdir)
|
||||
ZEND_FALIAS(dir, getdir, arginfo_dir)
|
||||
ZEND_FE(dir, arginfo_dir)
|
||||
ZEND_FE(closedir, arginfo_closedir)
|
||||
ZEND_FE(chdir, arginfo_chdir)
|
||||
#if defined(HAVE_CHROOT) && !defined(ZTS) && ENABLE_CHROOT_FUNC
|
||||
|
||||
@@ -50,8 +50,10 @@ static inline int has_crc32_insn() {
|
||||
# endif
|
||||
}
|
||||
|
||||
# pragma GCC push_options
|
||||
# pragma GCC target ("+nothing+crc")
|
||||
# if defined(__GNUC__) && !defined(__clang__)
|
||||
# pragma GCC push_options
|
||||
# pragma GCC target ("+nothing+crc")
|
||||
# endif
|
||||
static uint32_t crc32_aarch64(uint32_t crc, char *p, size_t nr) {
|
||||
while (nr >= sizeof(uint64_t)) {
|
||||
crc = __crc32d(crc, *(uint64_t *)p);
|
||||
@@ -73,7 +75,9 @@ static uint32_t crc32_aarch64(uint32_t crc, char *p, size_t nr) {
|
||||
}
|
||||
return crc;
|
||||
}
|
||||
# pragma GCC pop_options
|
||||
# if defined(__GNUC__) && !defined(__clang__)
|
||||
# pragma GCC pop_options
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* {{{ Calculate the crc32 polynomial of a string */
|
||||
|
||||
+1
-1
@@ -237,7 +237,7 @@ PHP_FUNCTION(opendir)
|
||||
/* }}} */
|
||||
|
||||
/* {{{ Directory class with properties, handle and class and methods read, rewind and close */
|
||||
PHP_FUNCTION(getdir)
|
||||
PHP_FUNCTION(dir)
|
||||
{
|
||||
_php_do_opendir(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1);
|
||||
}
|
||||
|
||||
@@ -678,7 +678,7 @@ finish:
|
||||
/* status codes of 1xx are "informational", and will be followed by a real response
|
||||
* e.g "100 Continue". RFC 7231 states that unexpected 1xx status MUST be parsed,
|
||||
* and MAY be ignored. As such, we need to skip ahead to the "real" status*/
|
||||
if (response_code >= 100 && response_code < 200) {
|
||||
if (response_code >= 100 && response_code < 200 && response_code != 101) {
|
||||
/* consume lines until we find a line starting 'HTTP/1' */
|
||||
while (
|
||||
!php_stream_eof(stream)
|
||||
@@ -730,24 +730,16 @@ finish:
|
||||
|
||||
/* read past HTTP headers */
|
||||
|
||||
http_header_line = emalloc(HTTP_HEADER_BLOCK_SIZE);
|
||||
|
||||
while (!php_stream_eof(stream)) {
|
||||
size_t http_header_line_length;
|
||||
|
||||
if (php_stream_get_line(stream, http_header_line, HTTP_HEADER_BLOCK_SIZE, &http_header_line_length) && *http_header_line != '\n' && *http_header_line != '\r') {
|
||||
if (http_header_line != NULL) {
|
||||
efree(http_header_line);
|
||||
}
|
||||
if ((http_header_line = php_stream_get_line(stream, NULL, 0, &http_header_line_length)) && *http_header_line != '\n' && *http_header_line != '\r') {
|
||||
char *e = http_header_line + http_header_line_length - 1;
|
||||
char *http_header_value;
|
||||
if (*e != '\n') {
|
||||
do { /* partial header */
|
||||
if (php_stream_get_line(stream, http_header_line, HTTP_HEADER_BLOCK_SIZE, &http_header_line_length) == NULL) {
|
||||
php_stream_wrapper_log_error(wrapper, options, "Failed to read HTTP headers");
|
||||
goto out;
|
||||
}
|
||||
e = http_header_line + http_header_line_length - 1;
|
||||
} while (*e != '\n');
|
||||
continue;
|
||||
}
|
||||
|
||||
while (e >= http_header_line && (*e == '\n' || *e == '\r')) {
|
||||
e--;
|
||||
}
|
||||
|
||||
+2
-2
@@ -173,7 +173,7 @@ static ZEND_COLD void php_print_gpcse_array(char *name, uint32_t name_length)
|
||||
key = zend_string_init(name, name_length, 0);
|
||||
zend_is_auto_global(key);
|
||||
|
||||
if ((data = zend_hash_find(&EG(symbol_table), key)) != NULL && (Z_TYPE_P(data) == IS_ARRAY)) {
|
||||
if ((data = zend_hash_find_deref(&EG(symbol_table), key)) != NULL && (Z_TYPE_P(data) == IS_ARRAY)) {
|
||||
ZEND_HASH_FOREACH_KEY_VAL(Z_ARRVAL_P(data), num_key, string_key, tmp) {
|
||||
if (!sapi_module.phpinfo_as_text) {
|
||||
php_info_print("<tr>");
|
||||
@@ -995,7 +995,7 @@ PHPAPI ZEND_COLD void php_print_info(int flag)
|
||||
}
|
||||
|
||||
|
||||
if ((flag & PHP_INFO_CREDITS) && !sapi_module.phpinfo_as_text) {
|
||||
if (flag & PHP_INFO_CREDITS) {
|
||||
php_info_print_hr();
|
||||
php_print_credits(PHP_CREDITS_ALL & ~PHP_CREDITS_FULLPAGE);
|
||||
}
|
||||
|
||||
+1
-1
@@ -48,7 +48,7 @@
|
||||
#endif /* HAVE_CREDITS_DEFS */
|
||||
|
||||
#define PHP_LOGO_DATA_URI "data:image/png;base64,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
Line truncated
|
||||
#define PHP_EGG_LOGO_DATA_URI "data:image/png;base64,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
Line truncated
|
||||
#define PHP_EGG_LOGO_DATA_URI "data:image/png;base64,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
Line truncated
|
||||
#define ZEND_LOGO_DATA_URI "data:image/png;base64,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
Line truncated
|
||||
|
||||
BEGIN_EXTERN_C()
|
||||
|
||||
Loaded 100 of 124 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user