summaryrefslogtreecommitdiffstats
path: root/php-upstream.patch
diff options
context:
space:
mode:
Diffstat (limited to 'php-upstream.patch')
-rw-r--r--php-upstream.patch130
1 files changed, 130 insertions, 0 deletions
diff --git a/php-upstream.patch b/php-upstream.patch
new file mode 100644
index 0000000..0f3ebd4
--- /dev/null
+++ b/php-upstream.patch
@@ -0,0 +1,130 @@
+From e31c54d02592caa31d6a59aaefeaa96aab2d7b27 Mon Sep 17 00:00:00 2001
+From: Remi Collet <remi@remirepo.net>
+Date: Fri, 7 Jan 2022 15:04:36 +0100
+Subject: [PATCH] fix GH-7899 Regression in unpack for negative int value
+
+---
+ NEWS | 3 +++
+ ext/standard/pack.c | 11 +++++++++--
+ ext/standard/tests/strings/pack64.phpt | 21 +++++++++++++++++++++
+ 3 files changed, 33 insertions(+), 2 deletions(-)
+
+diff --git a/ext/standard/pack.c b/ext/standard/pack.c
+index 46856874bc2a..8736d291fb24 100644
+--- a/ext/standard/pack.c
++++ b/ext/standard/pack.c
+@@ -62,6 +62,7 @@ typedef ZEND_SET_ALIGNED(1, uint16_t unaligned_uint16_t);
+ typedef ZEND_SET_ALIGNED(1, uint32_t unaligned_uint32_t);
+ typedef ZEND_SET_ALIGNED(1, uint64_t unaligned_uint64_t);
+ typedef ZEND_SET_ALIGNED(1, unsigned int unaligned_uint);
++typedef ZEND_SET_ALIGNED(1, int unaligned_int);
+
+ /* Mapping of byte from char (8bit) to long for machine endian */
+ static int byte_map[1];
+@@ -1043,8 +1044,14 @@ PHP_FUNCTION(unpack)
+
+ case 'i': /* signed integer, machine size, machine endian */
+ case 'I': { /* unsigned integer, machine size, machine endian */
+- unsigned int x = *((unaligned_uint*) &input[inputpos]);
+- zend_long v = (type == 'i') ? (int) x : x;
++ zend_long v;
++ if (type == 'i') {
++ int x = *((unaligned_int*) &input[inputpos]);
++ v = x;
++ } else {
++ unsigned int x = *((unaligned_uint*) &input[inputpos]);
++ v = x;
++ }
+
+ ZVAL_LONG(&val, v);
+ zend_symtable_update(Z_ARRVAL_P(return_value), real_name, &val);
+diff --git a/ext/standard/tests/strings/pack64.phpt b/ext/standard/tests/strings/pack64.phpt
+index 753821f65429..84e69008284d 100644
+--- a/ext/standard/tests/strings/pack64.phpt
++++ b/ext/standard/tests/strings/pack64.phpt
+@@ -31,6 +31,11 @@ print_r(unpack("q", pack("q", 0)));
+ print_r(unpack("q", pack("q", 0x8000000000000002)));
+ print_r(unpack("q", pack("q", -1)));
+ print_r(unpack("q", pack("q", 0x8000000000000000)));
++
++print_r(unpack("i", pack("i", 2147483647))); // Max int32
++print_r(unpack("i", pack("i", -2147483647)));
++print_r(unpack("i", pack("i", -2147483648))); // Min int32
++print_r(unpack("I", pack("I", 4294967295))); // Max uint32
+ ?>
+ --EXPECT--
+ Array
+@@ -113,3 +118,19 @@ Array
+ (
+ [1] => -9223372036854775808
+ )
++Array
++(
++ [1] => 2147483647
++)
++Array
++(
++ [1] => -2147483647
++)
++Array
++(
++ [1] => -2147483648
++)
++Array
++(
++ [1] => 4294967295
++)
+From cdfc4d3596d9f983b7395ee11641cbf37b77b46e Mon Sep 17 00:00:00 2001
+From: Remi Collet <remi@remirepo.net>
+Date: Mon, 17 Jan 2022 10:23:15 +0100
+Subject: [PATCH] Fix GH-7883 don't close not open file handle don't create a
+ stream if file is not open
+
+---
+ NEWS | 1 +
+ Zend/zend_stream.c | 5 ++++-
+ main/php_ini.c | 7 ++++---
+ 3 files changed, 9 insertions(+), 4 deletions(-)
+
+diff --git a/Zend/zend_stream.c b/Zend/zend_stream.c
+index aadc62558e60..ae2c734b09b4 100644
+--- a/Zend/zend_stream.c
++++ b/Zend/zend_stream.c
+@@ -214,7 +214,10 @@ static void zend_file_handle_dtor(zend_file_handle *fh) /* {{{ */
+ {
+ switch (fh->type) {
+ case ZEND_HANDLE_FP:
+- fclose(fh->handle.fp);
++ if (fh->handle.fp) {
++ fclose(fh->handle.fp);
++ fh->handle.fp = NULL;
++ }
+ break;
+ case ZEND_HANDLE_STREAM:
+ if (fh->handle.stream.closer && fh->handle.stream.handle) {
+diff --git a/main/php_ini.c b/main/php_ini.c
+index fd6f36648821..136942896da4 100644
+--- a/main/php_ini.c
++++ b/main/php_ini.c
+@@ -686,8 +686,9 @@ int php_init_config(void)
+ if (VCWD_STAT(ini_file, &sb) == 0) {
+ if (S_ISREG(sb.st_mode)) {
+ zend_file_handle fh;
+- zend_stream_init_fp(&fh, VCWD_FOPEN(ini_file, "r"), ini_file);
+- if (fh.handle.fp) {
++ FILE *file = VCWD_FOPEN(ini_file, "r");
++ if (file) {
++ zend_stream_init_fp(&fh, file, ini_file);
+ if (zend_parse_ini_file(&fh, 1, ZEND_INI_SCANNER_NORMAL, (zend_ini_parser_cb_t) php_ini_parser_cb, &configuration_hash) == SUCCESS) {
+ /* Here, add it to the list of ini files read */
+ l = (int)strlen(ini_file);
+@@ -695,8 +696,8 @@ int php_init_config(void)
+ p = estrndup(ini_file, l);
+ zend_llist_add_element(&scanned_ini_list, &p);
+ }
++ zend_destroy_file_handle(&fh);
+ }
+- zend_destroy_file_handle(&fh);
+ }
+ }
+ free(namelist[i]);