mirror of
https://github.com/bdnugget/php-src.git
synced 2026-11-12 19:50:50 +00:00
Compare commits
92
Commits
php-7.0.4
...
php-5.5.38
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
bcd100d812 | ||
|
|
29ac2c59a4 | ||
|
|
d4d8fb1b25 | ||
|
|
8ebdb1f5fd | ||
|
|
7521149193 | ||
|
|
47d6ea6332 | ||
|
|
f0a17b3a86 | ||
|
|
8dc5ffa479 | ||
|
|
928aecc002 | ||
|
|
7b1572b177 | ||
|
|
33c1a55b40 | ||
|
|
08ac37bd2a | ||
|
|
1364742be9 | ||
|
|
41131cd41d | ||
|
|
f3feddb5b4 | ||
|
|
e6c48213c2 | ||
|
|
d1a491acf3 | ||
|
|
eebcbd5de3 | ||
|
|
fe1d6feb3d | ||
|
|
3798eb6fd5 | ||
|
|
aa82e99ed8 | ||
|
|
81406c0c1d | ||
|
|
0218acb7e7 | ||
|
|
aca4f65c7e | ||
|
|
98b9dfaec9 | ||
|
|
bdf1b22da5 | ||
|
|
82637e8187 | ||
|
|
51b584b159 | ||
|
|
7377f45b61 | ||
|
|
b63d41e1e5 | ||
|
|
e1ba58f068 | ||
|
|
ac56700125 | ||
|
|
7b2c22696a | ||
|
|
25bd11cf27 | ||
|
|
cab1c3b370 | ||
|
|
155619184f | ||
|
|
0c7250f260 | ||
|
|
fc0b0afdc3 | ||
|
|
2af6dded37 | ||
|
|
c395c6e5d7 | ||
|
|
b028cacf31 | ||
|
|
e1d2f86a41 | ||
|
|
5f107ab8a6 | ||
|
|
7f428cae88 | ||
|
|
6c5211a0ce | ||
|
|
f6aef68089 | ||
|
|
3f627e580a | ||
|
|
b9ec171e7d | ||
|
|
5b597a2e5b | ||
|
|
e9ac8954be | ||
|
|
7722455726 | ||
|
|
7245bff300 | ||
|
|
88746d60ab | ||
|
|
489fd56fe3 | ||
|
|
a44c89e8af | ||
|
|
6f73079ce1 | ||
|
|
f96ebb0986 | ||
|
|
4dd03651f3 | ||
|
|
0c84740450 | ||
|
|
9a826a3bd9 | ||
|
|
f423e1bb89 | ||
|
|
e955913115 | ||
|
|
7a1aac3343 | ||
|
|
97eff7eb57 | ||
|
|
0da8b8b801 | ||
|
|
41fc3c76e9 | ||
|
|
abd159cce4 | ||
|
|
95ed19ae28 | ||
|
|
a4abd2bed9 | ||
|
|
5c571626e3 | ||
|
|
6058b78878 | ||
|
|
9649ca1630 | ||
|
|
008f983ba6 | ||
|
|
61c7a06e7c | ||
|
|
dccda88f27 | ||
|
|
f856734c67 | ||
|
|
082aecfc3a | ||
|
|
d650063a04 | ||
|
|
fd9689745c | ||
|
|
b15f0ecc0f | ||
|
|
8a4d164c2b | ||
|
|
4b0b1cec00 | ||
|
|
f0120ff878 | ||
|
|
551423c642 | ||
|
|
fe13566c93 | ||
|
|
9c19a08b9d | ||
|
|
3dd82caf57 | ||
|
|
f8dd10508b | ||
|
|
64f42c73ef | ||
|
|
95433e8e33 | ||
|
|
72281f29dd | ||
|
|
914d33c40e |
No files matched your search
@@ -1,6 +1,151 @@
|
||||
PHP NEWS
|
||||
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||
** PHP 5.5 is in security-only mode , please do not commit to this branch **
|
||||
21 Jul 2016, PHP 5.5.38
|
||||
|
||||
- BZip2:
|
||||
. Fixed bug #72613 (Inadequate error handling in bzread()). (Stas)
|
||||
|
||||
- Core:
|
||||
. Fixed bug #70480 (php_url_parse_ex() buffer overflow read). (Stas)
|
||||
. Fixed bug #72513 (Stack-based buffer overflow vulnerability in
|
||||
virtual_file_ex). (loianhtuan at gmail dot com)
|
||||
. Fixed bug #72562 (Use After Free in unserialize() with Unexpected Session
|
||||
Deserialization). (taoguangchen at icloud dot com)
|
||||
. Fixed bug #72573 (HTTP_PROXY is improperly trusted by some PHP libraries and
|
||||
applications). (CVE-2016-5385) (Stas)
|
||||
|
||||
- EXIF:
|
||||
. Fixed bug #72603 (Out of bound read in exif_process_IFD_in_MAKERNOTE).
|
||||
(Stas)
|
||||
. Fixed bug #72618 (NULL Pointer Dereference in exif_process_user_comment).
|
||||
(Stas)
|
||||
|
||||
- GD:
|
||||
. Fixed bug #72512 (gdImageTrueColorToPaletteBody allows arbitrary write/read
|
||||
access). (Pierre)
|
||||
. Fixed bug #72519 (imagegif/output out-of-bounds access). (Pierre)
|
||||
. Fixed bug #72558 (Integer overflow error within _gdContributionsAlloc()).
|
||||
(CVE-2016-6207) (Pierre)
|
||||
|
||||
- Intl:
|
||||
. Fixed bug #72533 (locale_accept_from_http out-of-bounds access). (Stas)
|
||||
|
||||
- ODBC:
|
||||
. Fixed bug #69975 (PHP segfaults when accessing nvarchar(max) defined columns)
|
||||
|
||||
- SNMP:
|
||||
. Fixed bug #72479 (Use After Free Vulnerability in SNMP with GC and
|
||||
unserialize()). (taoguangchen at icloud dot com)
|
||||
|
||||
- Xmlrpc:
|
||||
. Fixed bug #72606 (heap-buffer-overflow (write) simplestring_addn simplestring.c).
|
||||
(Stas)
|
||||
|
||||
- Zip:
|
||||
. Fixed bug #72520 (Stack-based buffer overflow vulnerability in
|
||||
php_stream_zip_opener). (loianhtuan at gmail dot com)
|
||||
|
||||
23 Jun 2016, PHP 5.5.37
|
||||
|
||||
- Core:
|
||||
. Fixed bug #72268 (Integer Overflow in nl2br()). (Stas)
|
||||
. Fixed bug #72275 (Integer Overflow in json_encode()/json_decode()/
|
||||
json_utf8_to_utf16()). (Stas)
|
||||
. Fixed bug #72400 (Integer Overflow in addcslashes/addslashes). (Stas)
|
||||
. Fixed bug #72403 (Integer Overflow in Length of String-typed ZVAL). (Stas)
|
||||
|
||||
- GD:
|
||||
. Fixed bug #66387 (Stack overflow with imagefilltoborder). (CVE-2015-8874)
|
||||
(cmb)
|
||||
. Fixed bug #72298 (pass2_no_dither out-of-bounds access). (Stas)
|
||||
. Fixed bug #72339 (Integer Overflow in _gd2GetHeader() resulting in heap
|
||||
overflow). (CVE-2016-5766) (Pierre)
|
||||
. Fixed bug #72407 (NULL Pointer Dereference at _gdScaleVert). (Stas)
|
||||
. Fixed bug #72446 (Integer Overflow in gdImagePaletteToTrueColor() resulting
|
||||
in heap overflow). (CVE-2016-5767) (Pierre)
|
||||
|
||||
- mbstring:
|
||||
. Fixed bug #72402 (_php_mb_regex_ereg_replace_exec - double free).
|
||||
(CVE-2016-5768) (Stas)
|
||||
|
||||
- mcrypt:
|
||||
. Fixed bug #72455 (Heap Overflow due to integer overflows). (CVE-2016-5769)
|
||||
(Stas)
|
||||
|
||||
- SPL:
|
||||
. Fixed bug #72262 (int/size_t confusion in SplFileObject::fread).
|
||||
(CVE-2016-5770) (Stas)
|
||||
. Fixed bug #72433 (Use After Free Vulnerability in PHP's GC algorithm and
|
||||
unserialize). (CVE-2016-5771) (Dmitry)
|
||||
|
||||
- WDDX:
|
||||
. Fixed bug #72340 (Double Free Courruption in wddx_deserialize).
|
||||
(CVE-2016-5772) (Stas)
|
||||
|
||||
- zip:
|
||||
. Fixed bug #72434 (ZipArchive class Use After Free Vulnerability in PHP's GC
|
||||
algorithm and unserialize). (CVE-2016-5773) (Dmitry)
|
||||
|
||||
26 May 2016, PHP 5.5.36
|
||||
|
||||
- Core:
|
||||
. Fixed bug #72114 (Integer underflow / arbitrary null write in
|
||||
fread/gzread). (CVE-2016-5096) (Stas)
|
||||
. Fixed bug #72135 (Integer Overflow in php_html_entities). (CVE-2016-5094)
|
||||
(Stas)
|
||||
|
||||
- GD:
|
||||
. Fixed bug #72227 (imagescale out-of-bounds read). (CVE-2013-7456) (Stas)
|
||||
|
||||
- Intl:
|
||||
. Fixed bug #72241 (get_icu_value_internal out-of-bounds read).
|
||||
(CVE-2016-5093) (Stas)
|
||||
|
||||
- Phar:
|
||||
. Fixed bug #71331 (Uninitialized pointer in phar_make_dirstream()).
|
||||
(CVE-2016-4343) (Stas)
|
||||
|
||||
28 Apr 2016, PHP 5.5.35
|
||||
|
||||
- BCMath:
|
||||
. Fixed bug #72093 (bcpowmod accepts negative scale and corrupts _one_
|
||||
definition). (Stas)
|
||||
|
||||
- Exif:
|
||||
. Fixed bug #72094 (Out of bounds heap read access in exif header
|
||||
processing). (Stas)
|
||||
|
||||
- GD:
|
||||
. Fixed bug #71912 (libgd: signedness vulnerability). (CVE-2016-3074) (Stas)
|
||||
|
||||
- Intl:
|
||||
. Fixed bug #72061 (Out-of-bounds reads in zif_grapheme_stripos with negative
|
||||
offset). (Stas)
|
||||
|
||||
- XML:
|
||||
. Fixed bug #72099 (xml_parse_into_struct segmentation fault). (Stas)
|
||||
|
||||
31 Mar 2016, PHP 5.5.34
|
||||
|
||||
- Fileinfo:
|
||||
. Fixed bug #71527 (Buffer over-write in finfo_open with malformed magic
|
||||
file). (CVE-2015-8865) (Anatol)
|
||||
|
||||
- Mbstring:
|
||||
. Fixed bug #71906 (AddressSanitizer: negative-size-param (-1) in
|
||||
mbfl_strcut). (CVE-2016-4073) (Stas)
|
||||
|
||||
- ODBC:
|
||||
. Fixed bug #71860 (Invalid memory write in phar on filename with \0 in
|
||||
name). (CVE-2016-4072) (Stas)
|
||||
|
||||
- SNMP:
|
||||
. Fixed bug #71704 (php_snmp_error() Format String Vulnerability).
|
||||
(CVE-2016-4071) (andrew at jmpesp dot org)
|
||||
|
||||
- Standard:
|
||||
. Fixed bug #71798 (Integer Overflow in php_raw_url_encode). (CVE-2016-4070)
|
||||
(taoguangchen at icloud dot com, Stas)
|
||||
|
||||
03 Mar 2016, PHP 5.5.33
|
||||
|
||||
@@ -23,25 +168,29 @@ PHP NEWS
|
||||
. Improved the fix for bug #70976. (Remi)
|
||||
|
||||
- PCRE:
|
||||
. Upgraded pcrelib to 8.38.
|
||||
. Upgraded pcrelib to 8.38. (CVE-2015-8383, CVE-2015-8386, CVE-2015-8387,
|
||||
CVE-2015-8389, CVE-2015-8390, CVE-2015-8391, CVE-2015-8393, CVE-2015-8394)
|
||||
|
||||
- Phar:
|
||||
. Fixed bug #71354 (Heap corruption in tar/zip/phar parser). (Stas)
|
||||
. Fixed bug #71354 (Heap corruption in tar/zip/phar parser). (CVE-2016-4342)
|
||||
(Stas)
|
||||
. Fixed bug #71391 (NULL Pointer Dereference in phar_tar_setupmetadata()).
|
||||
(Stas)
|
||||
. Fixed bug #71488 (Stack overflow when decompressing tar archives). (Stas)
|
||||
. Fixed bug #71488 (Stack overflow when decompressing tar archives).
|
||||
(CVE-2016-2554) (Stas)
|
||||
|
||||
- WDDX:
|
||||
. Fixed bug #71335 (Type Confusion in WDDX Packet Deserialization). (Stas)
|
||||
|
||||
|
||||
07 Jan 2015, PHP 5.5.31
|
||||
|
||||
- FPM:
|
||||
. Fixed bug #70755 (fpm_log.c memory leak and buffer overflow). (Stas)
|
||||
. Fixed bug #70755 (fpm_log.c memory leak and buffer overflow).
|
||||
(CVE-2016-5114) (Stas)
|
||||
|
||||
- GD:
|
||||
. Fixed bug #70976 (Memory Read via gdImageRotateInterpolated Array Index
|
||||
Out of Bounds). (emmanuel dot law at gmail dot com).
|
||||
Out of Bounds). (CVE-2016-1903) (emmanuel dot law at gmail dot com).
|
||||
|
||||
- WDDX:
|
||||
. Fixed bug #70661 (Use After Free Vulnerability in WDDX Packet Deserialization).
|
||||
@@ -56,16 +205,18 @@ PHP NEWS
|
||||
01 Oct 2015, PHP 5.5.30
|
||||
|
||||
- Phar:
|
||||
. Fixed bug #69720 (Null pointer dereference in phar_get_fp_offset()). (Stas)
|
||||
. Fixed bug #69720 (Null pointer dereference in phar_get_fp_offset()).
|
||||
(CVE-2015-7803) (Stas)
|
||||
. Fixed bug #70433 (Uninitialized pointer in phar_make_dirstream when zip
|
||||
entry filename is "/"). (Stas)
|
||||
entry filename is "/"). (CVE-2015-7804) (Stas)
|
||||
|
||||
03 Sep 2015, PHP 5.5.29
|
||||
|
||||
- Core:
|
||||
. Fixed bug #70172 (Use After Free Vulnerability in unserialize()). (Stas)
|
||||
. Fixed bug #70172 (Use After Free Vulnerability in unserialize()).
|
||||
(CVE-2015-6834) (Stas)
|
||||
. Fixed bug #70219 (Use after free vulnerability in session deserializer).
|
||||
(taoguangchen at icloud dot com)
|
||||
(CVE-2015-6835) (taoguangchen at icloud dot com)
|
||||
|
||||
- EXIF:
|
||||
. Fixed bug #70385 (Buffer over-read in exif_read_data with TIFF IFD tag byte
|
||||
@@ -81,20 +232,21 @@ PHP NEWS
|
||||
|
||||
- SOAP:
|
||||
. Fixed bug #70388 (SOAP serialize_function_call() type confusion / RCE).
|
||||
(Stas)
|
||||
(CVE-2015-6836) (Stas)
|
||||
|
||||
- SPL:
|
||||
. Fixed bug #70365 (Use-after-free vulnerability in unserialize() with
|
||||
SplObjectStorage). (taoguangchen at icloud dot com)
|
||||
SplObjectStorage). (CVE-2015-6834) (taoguangchen at icloud dot com)
|
||||
. Fixed bug #70366 (Use-after-free vulnerability in unserialize() with
|
||||
SplDoublyLinkedList). (taoguangchen at icloud dot com)
|
||||
SplDoublyLinkedList). (CVE-2015-6834) (taoguangchen at icloud dot com)
|
||||
|
||||
- XSLT:
|
||||
. Fixed bug #69782 (NULL pointer dereference). (Stas)
|
||||
. Fixed bug #69782 (NULL pointer dereference). (CVE-2015-6837, CVE-2015-6838)
|
||||
(Stas)
|
||||
|
||||
- ZIP:
|
||||
. Fixed bug #70350 (ZipArchive::extractTo allows for directory traversal when
|
||||
creating directories). (neal at fb dot com)
|
||||
creating directories). (CVE-2014-9767) (neal at fb dot com)
|
||||
|
||||
06 Aug 2015, PHP 5.5.28
|
||||
|
||||
@@ -109,12 +261,12 @@ PHP NEWS
|
||||
|
||||
- OpenSSL:
|
||||
. Fixed bug #70014 (openssl_random_pseudo_bytes() is not cryptographically
|
||||
secure). (Stas)
|
||||
secure). (CVE-2015-8867) (Stas)
|
||||
|
||||
- Phar:
|
||||
. Improved fix for bug #69441. (Anatol Belski)
|
||||
. Fixed bug #70019 (Files extracted from archive may be placed outside of
|
||||
destination directory). (Anatol Belski)
|
||||
destination directory). (CVE-2015-6833) (Anatol Belski)
|
||||
|
||||
- SOAP:
|
||||
. Fixed bug #70081 (SoapClient info leak / null pointer dereference via
|
||||
@@ -122,13 +274,13 @@ PHP NEWS
|
||||
|
||||
- SPL:
|
||||
. Fixed bug #70068 (Dangling pointer in the unserialization of ArrayObject
|
||||
items). (sean.heelan)
|
||||
items). (CVE-2015-6832) (sean.heelan)
|
||||
. Fixed bug #70166 (Use After Free Vulnerability in unserialize() with
|
||||
SPLArrayObject). (taoguangchen at icloud dot com)
|
||||
SPLArrayObject). (CVE-2015-6831) (taoguangchen at icloud dot com)
|
||||
. Fixed bug #70168 (Use After Free Vulnerability in unserialize() with
|
||||
SplObjectStorage). (taoguangchen at icloud dot com)
|
||||
SplObjectStorage). (CVE-2015-6831) (taoguangchen at icloud dot com)
|
||||
. Fixed bug #70169 (Use After Free Vulnerability in unserialize() with
|
||||
SplDoublyLinkedList). (taoguangchen at icloud dot com)
|
||||
SplDoublyLinkedList). (CVE-2015-6831) (taoguangchen at icloud dot com)
|
||||
|
||||
9 Jul 2015, PHP 5.5.27
|
||||
|
||||
@@ -199,7 +351,8 @@ PHP NEWS
|
||||
heap overflow). (CVE-2015-4643) (Max Spelsberg)
|
||||
. Fixed bug #69646 (OS command injection vulnerability in escapeshellarg).
|
||||
(CVE-2015-4642) (Anatol Belski)
|
||||
. Fixed bug #69719 (Incorrect handling of paths with NULs). (Stas)
|
||||
. Fixed bug #69719 (Incorrect handling of paths with NULs). (CVE-2015-4598)
|
||||
(Stas)
|
||||
|
||||
- GD:
|
||||
. Fixed bug #69479 (GD fails to build with newer libvpx). (Remi)
|
||||
|
||||
@@ -621,14 +621,14 @@ CWD_API void realpath_cache_del(const char *path, int path_len TSRMLS_DC) /* {{{
|
||||
memcmp(path, (*bucket)->path, path_len) == 0) {
|
||||
realpath_cache_bucket *r = *bucket;
|
||||
*bucket = (*bucket)->next;
|
||||
|
||||
|
||||
/* if the pointers match then only subtract the length of the path */
|
||||
if(r->path == r->realpath) {
|
||||
CWDG(realpath_cache_size) -= sizeof(realpath_cache_bucket) + r->path_len + 1;
|
||||
} else {
|
||||
CWDG(realpath_cache_size) -= sizeof(realpath_cache_bucket) + r->path_len + 1 + r->realpath_len + 1;
|
||||
}
|
||||
|
||||
|
||||
free(r);
|
||||
return;
|
||||
} else {
|
||||
@@ -704,7 +704,7 @@ static inline realpath_cache_bucket* realpath_cache_find(const char *path, int p
|
||||
realpath_cache_bucket *r = *bucket;
|
||||
*bucket = (*bucket)->next;
|
||||
|
||||
/* if the pointers match then only subtract the length of the path */
|
||||
/* if the pointers match then only subtract the length of the path */
|
||||
if(r->path == r->realpath) {
|
||||
CWDG(realpath_cache_size) -= sizeof(realpath_cache_bucket) + r->path_len + 1;
|
||||
} else {
|
||||
@@ -1159,7 +1159,7 @@ CWD_API int virtual_file_ex(cwd_state *state, const char *path, verify_path_func
|
||||
int add_slash;
|
||||
void *tmp;
|
||||
|
||||
if (path_length == 0 || path_length >= MAXPATHLEN-1) {
|
||||
if (path_length <= 0 || path_length >= MAXPATHLEN-1) {
|
||||
#ifdef TSRM_WIN32
|
||||
# if _MSC_VER < 1300
|
||||
errno = EINVAL;
|
||||
|
||||
@@ -194,6 +194,9 @@ PHP 5.5 UPGRADE NOTES
|
||||
- Since 5.5.4, fputcsv() has fifth parameter escape_char, allowing to
|
||||
specify escape char.
|
||||
|
||||
- Since 5.5.38, getenv() has optional second parameter, making it only
|
||||
consider local environment and not SAPI environment if true.
|
||||
|
||||
4a. unserialize() change
|
||||
------------------------
|
||||
|
||||
|
||||
@@ -13,5 +13,5 @@ var_dump(gc_collect_cycles());
|
||||
echo "ok\n";
|
||||
?>
|
||||
--EXPECT--
|
||||
int(1)
|
||||
int(2)
|
||||
ok
|
||||
@@ -1254,6 +1254,10 @@ ZEND_API int add_char_to_string(zval *result, const zval *op1, const zval *op2)
|
||||
int length = Z_STRLEN_P(op1) + 1;
|
||||
char *buf;
|
||||
|
||||
if (UNEXPECTED(length < 0)) {
|
||||
zend_error(E_ERROR, "String size overflow");
|
||||
}
|
||||
|
||||
if (IS_INTERNED(Z_STRVAL_P(op1))) {
|
||||
buf = (char *) emalloc(length + 1);
|
||||
memcpy(buf, Z_STRVAL_P(op1), Z_STRLEN_P(op1));
|
||||
@@ -1273,6 +1277,9 @@ ZEND_API int add_string_to_string(zval *result, const zval *op1, const zval *op2
|
||||
int length = Z_STRLEN_P(op1) + Z_STRLEN_P(op2);
|
||||
char *buf;
|
||||
|
||||
if (UNEXPECTED(length < 0)) {
|
||||
zend_error(E_ERROR, "String size overflow");
|
||||
}
|
||||
if (IS_INTERNED(Z_STRVAL_P(op1))) {
|
||||
buf = (char *) emalloc(length+1);
|
||||
memcpy(buf, Z_STRVAL_P(op1), Z_STRLEN_P(op1));
|
||||
|
||||
+2
-2
@@ -119,8 +119,8 @@ int zend_sprintf(char *buffer, const char *format, ...);
|
||||
|
||||
PHP_MAJOR_VERSION=5
|
||||
PHP_MINOR_VERSION=5
|
||||
PHP_RELEASE_VERSION=33
|
||||
PHP_EXTRA_VERSION="-dev"
|
||||
PHP_RELEASE_VERSION=38
|
||||
PHP_EXTRA_VERSION=""
|
||||
PHP_VERSION="$PHP_MAJOR_VERSION.$PHP_MINOR_VERSION.$PHP_RELEASE_VERSION$PHP_EXTRA_VERSION"
|
||||
PHP_VERSION_ID=`expr [$]PHP_MAJOR_VERSION \* 10000 + [$]PHP_MINOR_VERSION \* 100 + [$]PHP_RELEASE_VERSION`
|
||||
|
||||
|
||||
+41
-19
@@ -201,6 +201,21 @@ static void php_str2num(bc_num *num, char *str TSRMLS_DC)
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ split_bc_num
|
||||
Convert to bc_num detecting scale */
|
||||
static bc_num split_bc_num(bc_num num) {
|
||||
bc_num newnum;
|
||||
if (num->n_refs >= 1) {
|
||||
return num;
|
||||
}
|
||||
newnum = _bc_new_num_ex(0, 0, 0);
|
||||
*newnum = *num;
|
||||
newnum->n_refs = 1;
|
||||
num->n_refs--;
|
||||
return newnum;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto string bcadd(string left_operand, string right_operand [, int scale])
|
||||
Returns the sum of two arbitrary precision numbers */
|
||||
PHP_FUNCTION(bcadd)
|
||||
@@ -214,7 +229,7 @@ PHP_FUNCTION(bcadd)
|
||||
if (zend_parse_parameters(argc TSRMLS_CC, "ss|l", &left, &left_len, &right, &right_len, &scale_param) == FAILURE) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if (argc == 3) {
|
||||
scale = (int) ((int)scale_param < 0) ? 0 : scale_param;
|
||||
}
|
||||
@@ -225,11 +240,12 @@ PHP_FUNCTION(bcadd)
|
||||
php_str2num(&first, left TSRMLS_CC);
|
||||
php_str2num(&second, right TSRMLS_CC);
|
||||
bc_add (first, second, &result, scale);
|
||||
|
||||
|
||||
if (result->n_scale > scale) {
|
||||
result = split_bc_num(result);
|
||||
result->n_scale = scale;
|
||||
}
|
||||
|
||||
|
||||
Z_STRVAL_P(return_value) = bc_num2str(result);
|
||||
Z_STRLEN_P(return_value) = strlen(Z_STRVAL_P(return_value));
|
||||
Z_TYPE_P(return_value) = IS_STRING;
|
||||
@@ -253,7 +269,7 @@ PHP_FUNCTION(bcsub)
|
||||
if (zend_parse_parameters(argc TSRMLS_CC, "ss|l", &left, &left_len, &right, &right_len, &scale_param) == FAILURE) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if (argc == 3) {
|
||||
scale = (int) ((int)scale_param < 0) ? 0 : scale_param;
|
||||
}
|
||||
@@ -266,6 +282,7 @@ PHP_FUNCTION(bcsub)
|
||||
bc_sub (first, second, &result, scale);
|
||||
|
||||
if (result->n_scale > scale) {
|
||||
result = split_bc_num(result);
|
||||
result->n_scale = scale;
|
||||
}
|
||||
|
||||
@@ -292,11 +309,11 @@ PHP_FUNCTION(bcmul)
|
||||
if (zend_parse_parameters(argc TSRMLS_CC, "ss|l", &left, &left_len, &right, &right_len, &scale_param) == FAILURE) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if (argc == 3) {
|
||||
scale = (int) ((int)scale_param < 0) ? 0 : scale_param;
|
||||
}
|
||||
|
||||
|
||||
bc_init_num(&first TSRMLS_CC);
|
||||
bc_init_num(&second TSRMLS_CC);
|
||||
bc_init_num(&result TSRMLS_CC);
|
||||
@@ -305,6 +322,7 @@ PHP_FUNCTION(bcmul)
|
||||
bc_multiply (first, second, &result, scale TSRMLS_CC);
|
||||
|
||||
if (result->n_scale > scale) {
|
||||
result = split_bc_num(result);
|
||||
result->n_scale = scale;
|
||||
}
|
||||
|
||||
@@ -331,11 +349,11 @@ PHP_FUNCTION(bcdiv)
|
||||
if (zend_parse_parameters(argc TSRMLS_CC, "ss|l", &left, &left_len, &right, &right_len, &scale_param) == FAILURE) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if (argc == 3) {
|
||||
scale = (int) ((int)scale_param < 0) ? 0 : scale_param;
|
||||
}
|
||||
|
||||
|
||||
bc_init_num(&first TSRMLS_CC);
|
||||
bc_init_num(&second TSRMLS_CC);
|
||||
bc_init_num(&result TSRMLS_CC);
|
||||
@@ -345,6 +363,7 @@ PHP_FUNCTION(bcdiv)
|
||||
switch (bc_divide(first, second, &result, scale TSRMLS_CC)) {
|
||||
case 0: /* OK */
|
||||
if (result->n_scale > scale) {
|
||||
result = split_bc_num(result);
|
||||
result->n_scale = scale;
|
||||
}
|
||||
Z_STRVAL_P(return_value) = bc_num2str(result);
|
||||
@@ -374,13 +393,13 @@ PHP_FUNCTION(bcmod)
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &left, &left_len, &right, &right_len) == FAILURE) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
bc_init_num(&first TSRMLS_CC);
|
||||
bc_init_num(&second TSRMLS_CC);
|
||||
bc_init_num(&result TSRMLS_CC);
|
||||
bc_str2num(&first, left, 0 TSRMLS_CC);
|
||||
bc_str2num(&second, right, 0 TSRMLS_CC);
|
||||
|
||||
|
||||
switch (bc_modulo(first, second, &result, 0 TSRMLS_CC)) {
|
||||
case 0:
|
||||
Z_STRVAL_P(return_value) = bc_num2str(result);
|
||||
@@ -391,7 +410,7 @@ PHP_FUNCTION(bcmod)
|
||||
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Division by zero");
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
bc_free_num(&first);
|
||||
bc_free_num(&second);
|
||||
bc_free_num(&result);
|
||||
@@ -424,8 +443,9 @@ PHP_FUNCTION(bcpowmod)
|
||||
scale_int = (int) ((int)scale < 0) ? 0 : scale;
|
||||
|
||||
if (bc_raisemod(first, second, mod, &result, scale_int TSRMLS_CC) != -1) {
|
||||
if (result->n_scale > scale) {
|
||||
result->n_scale = scale;
|
||||
if (result->n_scale > scale_int) {
|
||||
result = split_bc_num(result);
|
||||
result->n_scale = scale_int;
|
||||
}
|
||||
Z_STRVAL_P(return_value) = bc_num2str(result);
|
||||
Z_STRLEN_P(return_value) = strlen(Z_STRVAL_P(return_value));
|
||||
@@ -433,7 +453,7 @@ PHP_FUNCTION(bcpowmod)
|
||||
} else {
|
||||
RETVAL_FALSE;
|
||||
}
|
||||
|
||||
|
||||
bc_free_num(&first);
|
||||
bc_free_num(&second);
|
||||
bc_free_num(&mod);
|
||||
@@ -455,7 +475,7 @@ PHP_FUNCTION(bcpow)
|
||||
if (zend_parse_parameters(argc TSRMLS_CC, "ss|l", &left, &left_len, &right, &right_len, &scale_param) == FAILURE) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if (argc == 3) {
|
||||
scale = (int) ((int)scale_param < 0) ? 0 : scale_param;
|
||||
}
|
||||
@@ -468,6 +488,7 @@ PHP_FUNCTION(bcpow)
|
||||
bc_raise (first, second, &result, scale TSRMLS_CC);
|
||||
|
||||
if (result->n_scale > scale) {
|
||||
result = split_bc_num(result);
|
||||
result->n_scale = scale;
|
||||
}
|
||||
|
||||
@@ -494,16 +515,17 @@ PHP_FUNCTION(bcsqrt)
|
||||
if (zend_parse_parameters(argc TSRMLS_CC, "s|l", &left, &left_len, &scale_param) == FAILURE) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if (argc == 2) {
|
||||
scale = (int) ((int)scale_param < 0) ? 0 : scale_param;
|
||||
}
|
||||
|
||||
bc_init_num(&result TSRMLS_CC);
|
||||
php_str2num(&result, left TSRMLS_CC);
|
||||
|
||||
|
||||
if (bc_sqrt (&result, scale TSRMLS_CC) != 0) {
|
||||
if (result->n_scale > scale) {
|
||||
result = split_bc_num(result);
|
||||
result->n_scale = scale;
|
||||
}
|
||||
Z_STRVAL_P(return_value) = bc_num2str(result);
|
||||
@@ -531,7 +553,7 @@ PHP_FUNCTION(bccomp)
|
||||
if (zend_parse_parameters(argc TSRMLS_CC, "ss|l", &left, &left_len, &right, &right_len, &scale_param) == FAILURE) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if (argc == 3) {
|
||||
scale = (int) ((int)scale_param < 0) ? 0 : scale_param;
|
||||
}
|
||||
@@ -555,7 +577,7 @@ PHP_FUNCTION(bccomp)
|
||||
PHP_FUNCTION(bcscale)
|
||||
{
|
||||
long new_scale;
|
||||
|
||||
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &new_scale) == FAILURE) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
--TEST--
|
||||
Bug 72093: bcpowmod accepts negative scale and corrupts _one_ definition
|
||||
--SKIPIF--
|
||||
<?php if(!extension_loaded("bcmath")) print "skip"; ?>
|
||||
--FILE--
|
||||
<?php
|
||||
var_dump(bcpowmod(1, "A", 128, -200));
|
||||
var_dump(bcpowmod(1, 1.2, 1, 1));
|
||||
?>
|
||||
--EXPECTF--
|
||||
string(1) "1"
|
||||
bc math warning: non-zero scale in exponent
|
||||
string(3) "0.0"
|
||||
+42
-38
@@ -15,7 +15,7 @@
|
||||
| Author: Sterling Hughes <sterling@php.net> |
|
||||
+----------------------------------------------------------------------+
|
||||
*/
|
||||
|
||||
|
||||
/* $Id$ */
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
@@ -137,29 +137,33 @@ struct php_bz2_stream_data_t {
|
||||
static size_t php_bz2iop_read(php_stream *stream, char *buf, size_t count TSRMLS_DC)
|
||||
{
|
||||
struct php_bz2_stream_data_t *self = (struct php_bz2_stream_data_t *) stream->abstract;
|
||||
size_t ret;
|
||||
|
||||
ret = BZ2_bzread(self->bz_file, buf, count);
|
||||
int bz2_ret;
|
||||
|
||||
if (ret == 0) {
|
||||
bz2_ret = BZ2_bzread(self->bz_file, buf, count);
|
||||
|
||||
if (bz2_ret < 0) {
|
||||
stream->eof = 1;
|
||||
return -1;
|
||||
}
|
||||
if (bz2_ret == 0) {
|
||||
stream->eof = 1;
|
||||
}
|
||||
|
||||
return ret;
|
||||
return (size_t)bz2_ret;
|
||||
}
|
||||
|
||||
static size_t php_bz2iop_write(php_stream *stream, const char *buf, size_t count TSRMLS_DC)
|
||||
{
|
||||
struct php_bz2_stream_data_t *self = (struct php_bz2_stream_data_t *) stream->abstract;
|
||||
|
||||
return BZ2_bzwrite(self->bz_file, (char*)buf, count);
|
||||
return BZ2_bzwrite(self->bz_file, (char*)buf, count);
|
||||
}
|
||||
|
||||
static int php_bz2iop_close(php_stream *stream, int close_handle TSRMLS_DC)
|
||||
{
|
||||
struct php_bz2_stream_data_t *self = (struct php_bz2_stream_data_t *)stream->abstract;
|
||||
int ret = EOF;
|
||||
|
||||
|
||||
if (close_handle) {
|
||||
BZ2_bzclose(self->bz_file);
|
||||
}
|
||||
@@ -191,11 +195,11 @@ php_stream_ops php_stream_bz2io_ops = {
|
||||
};
|
||||
|
||||
/* {{{ Bzip2 stream openers */
|
||||
PHP_BZ2_API php_stream *_php_stream_bz2open_from_BZFILE(BZFILE *bz,
|
||||
PHP_BZ2_API php_stream *_php_stream_bz2open_from_BZFILE(BZFILE *bz,
|
||||
char *mode, php_stream *innerstream STREAMS_DC TSRMLS_DC)
|
||||
{
|
||||
struct php_bz2_stream_data_t *self;
|
||||
|
||||
|
||||
self = emalloc(sizeof(*self));
|
||||
|
||||
self->stream = innerstream;
|
||||
@@ -226,7 +230,7 @@ PHP_BZ2_API php_stream *_php_stream_bz2open(php_stream_wrapper *wrapper,
|
||||
virtual_filepath_ex(path, &path_copy, NULL TSRMLS_CC);
|
||||
#else
|
||||
path_copy = path;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
if (php_check_open_basedir(path_copy TSRMLS_CC)) {
|
||||
#ifdef VIRTUAL_DIR
|
||||
@@ -234,7 +238,7 @@ PHP_BZ2_API php_stream *_php_stream_bz2open(php_stream_wrapper *wrapper,
|
||||
#endif
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
/* try and open it directly first */
|
||||
bz_file = BZ2_bzopen(path_copy, mode);
|
||||
|
||||
@@ -245,11 +249,11 @@ PHP_BZ2_API php_stream *_php_stream_bz2open(php_stream_wrapper *wrapper,
|
||||
free(path_copy);
|
||||
#endif
|
||||
path_copy = NULL;
|
||||
|
||||
|
||||
if (bz_file == NULL) {
|
||||
/* that didn't work, so try and get something from the network/wrapper */
|
||||
stream = php_stream_open_wrapper(path, mode, options | STREAM_WILL_CAST, opened_path);
|
||||
|
||||
|
||||
if (stream) {
|
||||
int fd;
|
||||
if (SUCCESS == php_stream_cast(stream, PHP_STREAM_AS_FD, (void **) &fd, REPORT_ERRORS)) {
|
||||
@@ -264,7 +268,7 @@ PHP_BZ2_API php_stream *_php_stream_bz2open(php_stream_wrapper *wrapper,
|
||||
VCWD_UNLINK(*opened_path);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (bz_file) {
|
||||
retstream = _php_stream_bz2open_from_BZFILE(bz_file, mode, stream STREAMS_REL_CC TSRMLS_CC);
|
||||
if (retstream) {
|
||||
@@ -340,7 +344,7 @@ static PHP_FUNCTION(bzread)
|
||||
if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r|l", &bz, &len)) {
|
||||
RETURN_FALSE;
|
||||
}
|
||||
|
||||
|
||||
php_stream_from_zval(stream, &bz);
|
||||
|
||||
if ((len + 1) < 1) {
|
||||
@@ -350,13 +354,13 @@ static PHP_FUNCTION(bzread)
|
||||
|
||||
Z_STRVAL_P(return_value) = emalloc(len + 1);
|
||||
Z_STRLEN_P(return_value) = php_stream_read(stream, Z_STRVAL_P(return_value), len);
|
||||
|
||||
|
||||
if (Z_STRLEN_P(return_value) < 0) {
|
||||
efree(Z_STRVAL_P(return_value));
|
||||
php_error_docref(NULL TSRMLS_CC, E_WARNING, "could not read valid bz2 data from stream");
|
||||
RETURN_FALSE;
|
||||
RETURN_FALSE;
|
||||
}
|
||||
|
||||
|
||||
Z_STRVAL_P(return_value)[Z_STRLEN_P(return_value)] = 0;
|
||||
Z_TYPE_P(return_value) = IS_STRING;
|
||||
}
|
||||
@@ -372,7 +376,7 @@ static PHP_FUNCTION(bzopen)
|
||||
|
||||
BZFILE *bz; /* The compressed file stream */
|
||||
php_stream *stream = NULL;
|
||||
|
||||
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Zs", &file, &mode, &mode_len) == FAILURE) {
|
||||
return;
|
||||
}
|
||||
@@ -388,15 +392,15 @@ static PHP_FUNCTION(bzopen)
|
||||
php_error_docref(NULL TSRMLS_CC, E_WARNING, "filename cannot be empty");
|
||||
RETURN_FALSE;
|
||||
}
|
||||
|
||||
|
||||
if (CHECK_ZVAL_NULL_PATH(*file)) {
|
||||
RETURN_FALSE;
|
||||
}
|
||||
|
||||
stream = php_stream_bz2open(NULL,
|
||||
Z_STRVAL_PP(file),
|
||||
mode,
|
||||
REPORT_ERRORS,
|
||||
Z_STRVAL_PP(file),
|
||||
mode,
|
||||
REPORT_ERRORS,
|
||||
NULL);
|
||||
} else if (Z_TYPE_PP(file) == IS_RESOURCE) {
|
||||
/* If it is a resource, than its a stream resource */
|
||||
@@ -405,7 +409,7 @@ static PHP_FUNCTION(bzopen)
|
||||
|
||||
php_stream_from_zval(stream, file);
|
||||
stream_mode_len = strlen(stream->mode);
|
||||
|
||||
|
||||
if (stream_mode_len != 1 && !(stream_mode_len == 2 && memchr(stream->mode, 'b', 2))) {
|
||||
php_error_docref(NULL TSRMLS_CC, E_WARNING, "cannot use stream opened in mode '%s'", stream->mode);
|
||||
RETURN_FALSE;
|
||||
@@ -439,7 +443,7 @@ static PHP_FUNCTION(bzopen)
|
||||
if (FAILURE == php_stream_cast(stream, PHP_STREAM_AS_FD, (void *) &fd, REPORT_ERRORS)) {
|
||||
RETURN_FALSE;
|
||||
}
|
||||
|
||||
|
||||
bz = BZ2_bzdopen(fd, mode);
|
||||
|
||||
stream = php_stream_bz2open_from_BZFILE(bz, mode, stream);
|
||||
@@ -493,7 +497,7 @@ static PHP_FUNCTION(bzcompress)
|
||||
work_factor = 0, /* Work factor for compression algorithm */
|
||||
argc; /* Argument count */
|
||||
int source_len; /* Length of the source data */
|
||||
unsigned int dest_len; /* Length of the destination buffer */
|
||||
unsigned int dest_len; /* Length of the destination buffer */
|
||||
|
||||
argc = ZEND_NUM_ARGS();
|
||||
|
||||
@@ -502,19 +506,19 @@ static PHP_FUNCTION(bzcompress)
|
||||
}
|
||||
|
||||
/* Assign them to easy to use variables, dest_len is initially the length of the data
|
||||
+ .01 x length of data + 600 which is the largest size the results of the compression
|
||||
could possibly be, at least that's what the libbz2 docs say (thanks to jeremy@nirvani.net
|
||||
+ .01 x length of data + 600 which is the largest size the results of the compression
|
||||
could possibly be, at least that's what the libbz2 docs say (thanks to jeremy@nirvani.net
|
||||
for pointing this out). */
|
||||
dest_len = (unsigned int) (source_len + (0.01 * source_len) + 600);
|
||||
|
||||
|
||||
/* Allocate the destination buffer */
|
||||
dest = emalloc(dest_len + 1);
|
||||
|
||||
|
||||
/* Handle the optional arguments */
|
||||
if (argc > 1) {
|
||||
block_size = zblock_size;
|
||||
}
|
||||
|
||||
|
||||
if (argc > 2) {
|
||||
work_factor = zwork_factor;
|
||||
}
|
||||
@@ -564,7 +568,7 @@ static PHP_FUNCTION(bzdecompress)
|
||||
/* in most cases bz2 offers at least 2:1 compression, so we use that as our base */
|
||||
bzs.avail_out = source_len * 2;
|
||||
bzs.next_out = dest = emalloc(bzs.avail_out + 1);
|
||||
|
||||
|
||||
while ((error = BZ2_bzDecompress(&bzs)) == BZ_OK && bzs.avail_in > 0) {
|
||||
/* compression is better then 2:1, need to allocate more memory */
|
||||
bzs.avail_out = source_len;
|
||||
@@ -590,13 +594,13 @@ static PHP_FUNCTION(bzdecompress)
|
||||
/* {{{ php_bz2_error()
|
||||
The central error handling interface, does the work for bzerrno, bzerrstr and bzerror */
|
||||
static void php_bz2_error(INTERNAL_FUNCTION_PARAMETERS, int opt)
|
||||
{
|
||||
{
|
||||
zval *bzp; /* BZip2 Resource Pointer */
|
||||
php_stream *stream;
|
||||
const char *errstr; /* Error string */
|
||||
int errnum; /* Error number */
|
||||
struct php_bz2_stream_data_t *self;
|
||||
|
||||
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &bzp) == FAILURE) {
|
||||
return;
|
||||
}
|
||||
@@ -608,10 +612,10 @@ static void php_bz2_error(INTERNAL_FUNCTION_PARAMETERS, int opt)
|
||||
}
|
||||
|
||||
self = (struct php_bz2_stream_data_t *) stream->abstract;
|
||||
|
||||
|
||||
/* Fetch the error information */
|
||||
errstr = BZ2_bzerror(self->bz_file, &errnum);
|
||||
|
||||
|
||||
/* Determine what to return */
|
||||
switch (opt) {
|
||||
case PHP_BZ_ERRNO:
|
||||
@@ -622,7 +626,7 @@ static void php_bz2_error(INTERNAL_FUNCTION_PARAMETERS, int opt)
|
||||
break;
|
||||
case PHP_BZ_ERRBOTH:
|
||||
array_init(return_value);
|
||||
|
||||
|
||||
add_assoc_long (return_value, "errno", errnum);
|
||||
add_assoc_string(return_value, "errstr", (char*)errstr, 1);
|
||||
break;
|
||||
|
||||
Binary file not shown.
@@ -0,0 +1,23 @@
|
||||
--TEST--
|
||||
Bug #72613 (Inadequate error handling in bzread())
|
||||
--SKIPIF--
|
||||
<?php if (!extension_loaded("bz2")) print "skip"; ?>
|
||||
--FILE--
|
||||
<?php
|
||||
$fp = bzopen(__DIR__.'/72613.bz2', 'r');
|
||||
if ($fp === FALSE) {
|
||||
exit("ERROR: bzopen()");
|
||||
}
|
||||
$data = "";
|
||||
while (!feof($fp)) {
|
||||
$res = bzread($fp);
|
||||
if ($res === FALSE) {
|
||||
exit("ERROR: bzread()");
|
||||
}
|
||||
$data .= $res;
|
||||
}
|
||||
bzclose($fp);
|
||||
?>
|
||||
DONE
|
||||
--EXPECT--
|
||||
DONE
|
||||
+46
-10
@@ -2623,6 +2623,7 @@ static int exif_process_user_comment(image_info_type *ImageInfo, char **pszInfoP
|
||||
*pszEncoding = NULL;
|
||||
/* Copy the comment */
|
||||
if (ByteCount>=8) {
|
||||
const zend_encoding *from, *to;
|
||||
if (!memcmp(szValuePtr, "UNICODE\0", 8)) {
|
||||
*pszEncoding = estrdup((const char*)szValuePtr);
|
||||
szValuePtr = szValuePtr+8;
|
||||
@@ -2643,14 +2644,16 @@ static int exif_process_user_comment(image_info_type *ImageInfo, char **pszInfoP
|
||||
} else {
|
||||
decode = ImageInfo->decode_unicode_le;
|
||||
}
|
||||
to = zend_multibyte_fetch_encoding(ImageInfo->encode_unicode TSRMLS_CC);
|
||||
from = zend_multibyte_fetch_encoding(decode TSRMLS_CC);
|
||||
/* XXX this will fail again if encoding_converter returns on error something different than SIZE_MAX */
|
||||
if (zend_multibyte_encoding_converter(
|
||||
if (!to || !from || zend_multibyte_encoding_converter(
|
||||
(unsigned char**)pszInfoPtr,
|
||||
&len,
|
||||
(unsigned char*)szValuePtr,
|
||||
ByteCount,
|
||||
zend_multibyte_fetch_encoding(ImageInfo->encode_unicode TSRMLS_CC),
|
||||
zend_multibyte_fetch_encoding(decode TSRMLS_CC)
|
||||
to,
|
||||
from
|
||||
TSRMLS_CC) == (size_t)-1) {
|
||||
len = exif_process_string_raw(pszInfoPtr, szValuePtr, ByteCount);
|
||||
}
|
||||
@@ -2665,13 +2668,15 @@ static int exif_process_user_comment(image_info_type *ImageInfo, char **pszInfoP
|
||||
szValuePtr = szValuePtr+8;
|
||||
ByteCount -= 8;
|
||||
/* XXX this will fail again if encoding_converter returns on error something different than SIZE_MAX */
|
||||
if (zend_multibyte_encoding_converter(
|
||||
to = zend_multibyte_fetch_encoding(ImageInfo->encode_jis TSRMLS_CC);
|
||||
from = zend_multibyte_fetch_encoding(ImageInfo->motorola_intel ? ImageInfo->decode_jis_be : ImageInfo->decode_jis_le TSRMLS_CC);
|
||||
if (!to || !from || zend_multibyte_encoding_converter(
|
||||
(unsigned char**)pszInfoPtr,
|
||||
&len,
|
||||
(unsigned char*)szValuePtr,
|
||||
ByteCount,
|
||||
zend_multibyte_fetch_encoding(ImageInfo->encode_jis TSRMLS_CC),
|
||||
zend_multibyte_fetch_encoding(ImageInfo->motorola_intel ? ImageInfo->decode_jis_be : ImageInfo->decode_jis_le TSRMLS_CC)
|
||||
to,
|
||||
from
|
||||
TSRMLS_CC) == (size_t)-1) {
|
||||
len = exif_process_string_raw(pszInfoPtr, szValuePtr, ByteCount);
|
||||
}
|
||||
@@ -2742,6 +2747,12 @@ static int exif_process_IFD_in_MAKERNOTE(image_info_type *ImageInfo, char * valu
|
||||
break;
|
||||
}
|
||||
|
||||
if (maker_note->offset >= value_len) {
|
||||
/* Do not go past the value end */
|
||||
exif_error_docref("exif_read_data#error_ifd" EXIFERR_CC, ImageInfo, E_WARNING, "IFD data too short: 0x%04X offset 0x%04X", value_len, maker_note->offset);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
dir_start = value_ptr + maker_note->offset;
|
||||
|
||||
#ifdef EXIF_DEBUG
|
||||
@@ -2770,10 +2781,19 @@ static int exif_process_IFD_in_MAKERNOTE(image_info_type *ImageInfo, char * valu
|
||||
offset_base = value_ptr;
|
||||
break;
|
||||
case MN_OFFSET_GUESS:
|
||||
if (maker_note->offset + 10 + 4 >= value_len) {
|
||||
/* Can not read dir_start+10 since it's beyond value end */
|
||||
exif_error_docref("exif_read_data#error_ifd" EXIFERR_CC, ImageInfo, E_WARNING, "IFD data too short: 0x%04X", value_len);
|
||||
return FALSE;
|
||||
}
|
||||
offset_diff = 2 + NumDirEntries*12 + 4 - php_ifd_get32u(dir_start+10, ImageInfo->motorola_intel);
|
||||
#ifdef EXIF_DEBUG
|
||||
exif_error_docref(NULL EXIFERR_CC, ImageInfo, E_NOTICE, "Using automatic offset correction: 0x%04X", ((int)dir_start-(int)offset_base+maker_note->offset+displacement) + offset_diff);
|
||||
#endif
|
||||
if (offset_diff < 0 || offset_diff >= value_len ) {
|
||||
exif_error_docref("exif_read_data#error_ifd" EXIFERR_CC, ImageInfo, E_WARNING, "IFD data bad offset: 0x%04X length 0x%04X", offset_diff, value_len);
|
||||
return FALSE;
|
||||
}
|
||||
offset_base = value_ptr + offset_diff;
|
||||
break;
|
||||
default:
|
||||
@@ -2782,7 +2802,7 @@ static int exif_process_IFD_in_MAKERNOTE(image_info_type *ImageInfo, char * valu
|
||||
}
|
||||
|
||||
if ((2+NumDirEntries*12) > value_len) {
|
||||
exif_error_docref("exif_read_data#error_ifd" EXIFERR_CC, ImageInfo, E_WARNING, "Illegal IFD size: 2 + x%04X*12 = x%04X > x%04X", NumDirEntries, 2+NumDirEntries*12, value_len);
|
||||
exif_error_docref("exif_read_data#error_ifd" EXIFERR_CC, ImageInfo, E_WARNING, "Illegal IFD size: 2 + 0x%04X*12 = 0x%04X > 0x%04X", NumDirEntries, 2+NumDirEntries*12, value_len);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
@@ -2965,7 +2985,7 @@ static int exif_process_IFD_TAG(image_info_type *ImageInfo, char *dir_entry, cha
|
||||
/* When there are any characters after the first NUL */
|
||||
ImageInfo->CopyrightPhotographer = estrdup(value_ptr);
|
||||
ImageInfo->CopyrightEditor = estrndup(value_ptr+length+1, byte_count-length-1);
|
||||
spprintf(&ImageInfo->Copyright, 0, "%s, %s", value_ptr, value_ptr+length+1);
|
||||
spprintf(&ImageInfo->Copyright, 0, "%s, %s", ImageInfo->CopyrightPhotographer, ImageInfo->CopyrightEditor);
|
||||
/* format = TAG_FMT_UNDEFINED; this musn't be ASCII */
|
||||
/* but we are not supposed to change this */
|
||||
/* keep in mind that image_info does not store editor value */
|
||||
@@ -3068,7 +3088,10 @@ static int exif_process_IFD_TAG(image_info_type *ImageInfo, char *dir_entry, cha
|
||||
break;
|
||||
|
||||
case TAG_MAKER_NOTE:
|
||||
exif_process_IFD_in_MAKERNOTE(ImageInfo, value_ptr, byte_count, offset_base, IFDlength, displacement TSRMLS_CC);
|
||||
if (!exif_process_IFD_in_MAKERNOTE(ImageInfo, value_ptr, byte_count, offset_base, IFDlength, displacement TSRMLS_CC)) {
|
||||
EFREE_IF(outside);
|
||||
return FALSE;
|
||||
}
|
||||
break;
|
||||
|
||||
case TAG_EXIF_IFD_POINTER:
|
||||
@@ -3134,6 +3157,11 @@ static int exif_process_IFD_in_JPEG(image_info_type *ImageInfo, char *dir_start,
|
||||
|
||||
ImageInfo->sections_found |= FOUND_IFD0;
|
||||
|
||||
if ((dir_start + 2) >= (offset_base+IFDlength)) {
|
||||
exif_error_docref("exif_read_data#error_ifd" EXIFERR_CC, ImageInfo, E_WARNING, "Illegal IFD size");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
NumDirEntries = php_ifd_get16u(dir_start, ImageInfo->motorola_intel);
|
||||
|
||||
if ((dir_start+2+NumDirEntries*12) > (offset_base+IFDlength)) {
|
||||
@@ -3157,6 +3185,10 @@ static int exif_process_IFD_in_JPEG(image_info_type *ImageInfo, char *dir_start,
|
||||
* Hack to make it process IDF1 I hope
|
||||
* There are 2 IDFs, the second one holds the keys (0x0201 and 0x0202) to the thumbnail
|
||||
*/
|
||||
if ((dir_start+2+12*de + 4) >= (offset_base+IFDlength)) {
|
||||
exif_error_docref("exif_read_data#error_ifd" EXIFERR_CC, ImageInfo, E_WARNING, "Illegal IFD size");
|
||||
return FALSE;
|
||||
}
|
||||
NextDirOffset = php_ifd_get32u(dir_start+2+12*de, ImageInfo->motorola_intel);
|
||||
if (NextDirOffset) {
|
||||
/* the next line seems false but here IFDlength means length of all IFDs */
|
||||
@@ -3206,9 +3238,13 @@ static void exif_process_TIFF_in_JPEG(image_info_type *ImageInfo, char *CharBuf,
|
||||
}
|
||||
|
||||
/* Check the next two values for correctness. */
|
||||
if (length < 8) {
|
||||
exif_error_docref(NULL EXIFERR_CC, ImageInfo, E_WARNING, "Invalid TIFF start (1)");
|
||||
return;
|
||||
}
|
||||
exif_value_2a = php_ifd_get16u(CharBuf+2, ImageInfo->motorola_intel);
|
||||
offset_of_ifd = php_ifd_get32u(CharBuf+4, ImageInfo->motorola_intel);
|
||||
if ( exif_value_2a != 0x2a || offset_of_ifd < 0x08) {
|
||||
if (exif_value_2a != 0x2a || offset_of_ifd < 0x08) {
|
||||
exif_error_docref(NULL EXIFERR_CC, ImageInfo, E_WARNING, "Invalid TIFF start (1)");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -13,8 +13,4 @@ exif_read_data(__DIR__ . '/bug54002_2.jpeg');
|
||||
--EXPECTF--
|
||||
Warning: exif_read_data(bug54002_1.jpeg): Process tag(x0205=UndefinedTa): Illegal byte_count in %sbug54002.php on line %d
|
||||
|
||||
Warning: exif_read_data(bug54002_1.jpeg): Process tag(xA000=FlashPixVer): Illegal pointer offset(%s) in %sbug54002.php on line %d
|
||||
|
||||
Warning: exif_read_data(bug54002_2.jpeg): Process tag(x0205=UndefinedTa): Illegal byte_count in %sbug54002.php on line %d
|
||||
|
||||
Warning: exif_read_data(bug54002_2.jpeg): Process tag(xA000=FlashPixVer): Illegal pointer offset(%s) in %sbug54002.php on line %d
|
||||
Warning: exif_read_data(bug54002_2.jpeg): Process tag(x0205=UndefinedTa): Illegal byte_count in %sbug54002.php on line %d
|
||||
@@ -10,7 +10,9 @@ echo "Test\n";
|
||||
var_dump(count(exif_read_data(__DIR__."/bug62523_2.jpg")));
|
||||
?>
|
||||
Done
|
||||
--EXPECT--
|
||||
--EXPECTF--
|
||||
Test
|
||||
int(76)
|
||||
|
||||
Warning: exif_read_data(bug62523_2.jpg): IFD data bad offset: 0xADB23672 length 0x0D94 in %s/bug62523_2.php on line %d
|
||||
int(30)
|
||||
Done
|
||||
@@ -0,0 +1,61 @@
|
||||
--TEST--
|
||||
Bug #72094: Out of bounds heap read access in exif header processing
|
||||
--SKIPIF--
|
||||
<?php if (!extension_loaded('exif')) print 'skip exif extension not available';?>
|
||||
--FILE--
|
||||
<?php
|
||||
print_r(exif_read_data(__DIR__ . '/bug72094_1.jpg'));
|
||||
print_r(exif_read_data(__DIR__ . '/bug72094_2.jpg'));
|
||||
print_r(exif_read_data(__DIR__ . '/bug72094_3.jpg'));
|
||||
print_r(exif_read_data(__DIR__ . '/bug72094_4.jpg'));
|
||||
?>
|
||||
DONE
|
||||
--EXPECTF--
|
||||
Warning: exif_read_data(bug72094_1.jpg): Process tag(x3030=UndefinedTa): Illegal format code 0x3030, suppose BYTE in %s/bug72094.php on line %d
|
||||
|
||||
Warning: exif_read_data(bug72094_1.jpg): Process tag(x3030=UndefinedTa): Illegal format code 0x3030, suppose BYTE in %s/bug72094.php on line %d
|
||||
|
||||
Warning: exif_read_data(bug72094_1.jpg): Process tag(x3030=UndefinedTa): Illegal format code 0x3030, suppose BYTE in %s/bug72094.php on line %d
|
||||
|
||||
Warning: exif_read_data(bug72094_1.jpg): Process tag(x3030=UndefinedTa): Illegal format code 0x3030, suppose BYTE in %s/bug72094.php on line %d
|
||||
|
||||
Warning: exif_read_data(bug72094_1.jpg): Process tag(x3030=UndefinedTa): Illegal format code 0x3030, suppose BYTE in %s/bug72094.php on line %d
|
||||
|
||||
Warning: exif_read_data(bug72094_1.jpg): Process tag(x8298=Copyright ): Illegal format code 0x3030, suppose BYTE in %s/bug72094.php on line %d
|
||||
|
||||
Warning: exif_read_data(bug72094_1.jpg): Illegal IFD offset in %s/bug72094.php on line %d
|
||||
|
||||
Warning: exif_read_data(bug72094_1.jpg): File structure corrupted in %s/bug72094.php on line %d
|
||||
|
||||
Warning: exif_read_data(bug72094_1.jpg): Invalid JPEG file in %s/bug72094.php on line %d
|
||||
|
||||
Warning: exif_read_data(bug72094_2.jpg): Illegal IFD size in %s/bug72094.php on line %d
|
||||
|
||||
Warning: exif_read_data(bug72094_2.jpg): File structure corrupted in %s/bug72094.php on line %d
|
||||
|
||||
Warning: exif_read_data(bug72094_2.jpg): Invalid JPEG file in %s/bug72094.php on line %d
|
||||
|
||||
Warning: exif_read_data(bug72094_3.jpg): Process tag(x3030=UndefinedTa): Illegal format code 0x3030, suppose BYTE in %s/bug72094.php on line %d
|
||||
|
||||
Warning: exif_read_data(bug72094_3.jpg): Process tag(x3030=UndefinedTa): Illegal format code 0x3030, suppose BYTE in %s/bug72094.php on line %d
|
||||
|
||||
Warning: exif_read_data(bug72094_3.jpg): Process tag(x3030=UndefinedTa): Illegal format code 0x3030, suppose BYTE in %s/bug72094.php on line %d
|
||||
|
||||
Warning: exif_read_data(bug72094_3.jpg): Process tag(x3030=UndefinedTa): Illegal format code 0x3030, suppose BYTE in %s/bug72094.php on line %d
|
||||
|
||||
Warning: exif_read_data(bug72094_3.jpg): Process tag(x3030=UndefinedTa): Illegal format code 0x3030, suppose BYTE in %s/bug72094.php on line %d
|
||||
|
||||
Warning: exif_read_data(bug72094_3.jpg): Process tag(x3030=UndefinedTa): Illegal format code 0x3030, suppose BYTE in %s/bug72094.php on line %d
|
||||
|
||||
Warning: exif_read_data(bug72094_3.jpg): Illegal IFD size in %s/bug72094.php on line %d
|
||||
|
||||
Warning: exif_read_data(bug72094_3.jpg): File structure corrupted in %s/bug72094.php on line %d
|
||||
|
||||
Warning: exif_read_data(bug72094_3.jpg): Invalid JPEG file in %s/bug72094.php on line %d
|
||||
|
||||
Warning: exif_read_data(bug72094_4.jpg): Invalid TIFF start (1) in %s/bug72094.php on line %d
|
||||
|
||||
Warning: exif_read_data(bug72094_4.jpg): File structure corrupted in %s/bug72094.php on line %d
|
||||
|
||||
Warning: exif_read_data(bug72094_4.jpg): Invalid JPEG file in %s/bug72094.php on line %d
|
||||
DONE
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
After Width: | Height: | Size: 3.6 KiB |
@@ -0,0 +1,11 @@
|
||||
--TEST--
|
||||
Bug #72603 (Out of bound read in exif_process_IFD_in_MAKERNOTE)
|
||||
--SKIPIF--
|
||||
<?php if (!extension_loaded('exif')) print 'skip exif extension not available';?>
|
||||
--FILE--
|
||||
<?php
|
||||
var_dump(count(exif_read_data(dirname(__FILE__) . "/bug72603.jpeg")));
|
||||
?>
|
||||
--EXPECTF--
|
||||
Warning: exif_read_data(bug72603.jpeg): IFD data bad offset: 0x058C length 0x001C in %s/bug72603.php on line %d
|
||||
int(13)
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 3.6 KiB |
@@ -0,0 +1,11 @@
|
||||
--TEST--
|
||||
Bug 72618 (NULL Pointer Dereference in exif_process_user_comment)
|
||||
--SKIPIF--
|
||||
<?php if (!extension_loaded('exif')) print 'skip exif extension not available';?>
|
||||
--FILE--
|
||||
<?php
|
||||
var_dump(count(exif_read_data(dirname(__FILE__) . "/bug72618.jpg")));
|
||||
?>
|
||||
--EXPECTF--
|
||||
Warning: exif_read_data(bug72618.jpg): IFD data bad offset: 0x058E length 0x0030 in %s/bug72618.php on line %d
|
||||
int(13)
|
||||
@@ -414,7 +414,7 @@ file_check_mem(struct magic_set *ms, unsigned int level)
|
||||
size_t len;
|
||||
|
||||
if (level >= ms->c.len) {
|
||||
len = (ms->c.len += 20) * sizeof(*ms->c.li);
|
||||
len = (ms->c.len = 20 + level) * sizeof(*ms->c.li);
|
||||
ms->c.li = CAST(struct level_info *, (ms->c.li == NULL) ?
|
||||
emalloc(len) :
|
||||
erealloc(ms->c.li, len));
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
|
||||
@@ -0,0 +1,19 @@
|
||||
--TEST--
|
||||
Bug #71527 Buffer over-write in finfo_open with malformed magic file
|
||||
--SKIPIF--
|
||||
<?php
|
||||
if (!class_exists('finfo'))
|
||||
die('skip no fileinfo extension');
|
||||
--ENV--
|
||||
USE_ZEND_ALLOC=0
|
||||
--FILE--
|
||||
<?php
|
||||
$finfo = finfo_open(FILEINFO_NONE, dirname(__FILE__) . DIRECTORY_SEPARATOR . "bug71527.magic");
|
||||
$info = finfo_file($finfo, __FILE__);
|
||||
var_dump($info);
|
||||
?>
|
||||
--EXPECTF--
|
||||
Warning: finfo_open(): Failed to load magic database at '%sbug71527.magic'. in %sbug71527.php on line %d
|
||||
|
||||
Warning: finfo_file() expects parameter 1 to be resource, boolean given in %sbug71527.php on line %d
|
||||
bool(false)
|
||||
+26
-15
@@ -133,6 +133,10 @@ gdImagePtr gdImageCreate (int sx, int sy)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (overflow2(sizeof(unsigned char *), sx)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
im = (gdImage *) gdCalloc(1, sizeof(gdImage));
|
||||
|
||||
/* Row-major ever since gd 1.3 */
|
||||
@@ -186,7 +190,7 @@ gdImagePtr gdImageCreateTrueColor (int sx, int sy)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (overflow2(sizeof(int), sx)) {
|
||||
if (overflow2(sizeof(int *), sx)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -595,15 +599,18 @@ void gdImageColorDeallocate (gdImagePtr im, int color)
|
||||
|
||||
void gdImageColorTransparent (gdImagePtr im, int color)
|
||||
{
|
||||
if (color < 0) {
|
||||
return;
|
||||
}
|
||||
if (!im->trueColor) {
|
||||
if((color >= im->colorsTotal)) {
|
||||
return;
|
||||
}
|
||||
/* Make the old transparent color opaque again */
|
||||
if (im->transparent != -1) {
|
||||
im->alpha[im->transparent] = gdAlphaOpaque;
|
||||
}
|
||||
if (color > -1 && color < im->colorsTotal && color < gdMaxColors) {
|
||||
im->alpha[color] = gdAlphaTransparent;
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
im->alpha[color] = gdAlphaTransparent;
|
||||
}
|
||||
im->transparent = color;
|
||||
}
|
||||
@@ -1098,12 +1105,12 @@ void gdImageLine (gdImagePtr im, int x1, int y1, int x2, int y2, int color)
|
||||
int thick = im->thick;
|
||||
|
||||
if (color == gdAntiAliased) {
|
||||
/*
|
||||
/*
|
||||
gdAntiAliased passed as color: use the much faster, much cheaper
|
||||
and equally attractive gdImageAALine implementation. That
|
||||
clips too, so don't clip twice.
|
||||
*/
|
||||
gdImageAALine(im, x1, y1, x2, y2, im->AA_color);
|
||||
gdImageAALine(im, x1, y1, x2, y2, im->AA_color);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1774,9 +1781,13 @@ void gdImageFillToBorder (gdImagePtr im, int x, int y, int border, int color)
|
||||
|
||||
if (x >= im->sx) {
|
||||
x = im->sx - 1;
|
||||
} else if (x < 0) {
|
||||
x = 0;
|
||||
}
|
||||
if (y >= im->sy) {
|
||||
y = im->sy - 1;
|
||||
} else if (y < 0) {
|
||||
y = 0;
|
||||
}
|
||||
|
||||
for (i = x; i >= 0; i--) {
|
||||
@@ -1876,7 +1887,7 @@ void gdImageFill(gdImagePtr im, int x, int y, int nc)
|
||||
return;
|
||||
}
|
||||
|
||||
alphablending_bak = im->alphaBlendingFlag;
|
||||
alphablending_bak = im->alphaBlendingFlag;
|
||||
im->alphaBlendingFlag = 0;
|
||||
|
||||
if (nc==gdTiled){
|
||||
@@ -1888,7 +1899,7 @@ void gdImageFill(gdImagePtr im, int x, int y, int nc)
|
||||
wx2=im->sx;wy2=im->sy;
|
||||
oc = gdImageGetPixel(im, x, y);
|
||||
if (oc==nc || x<0 || x>wx2 || y<0 || y>wy2) {
|
||||
im->alphaBlendingFlag = alphablending_bak;
|
||||
im->alphaBlendingFlag = alphablending_bak;
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1951,7 +1962,7 @@ skip: for (x++; x<=x2 && (gdImageGetPixel(im, x, y)!=oc); x++);
|
||||
efree(stack);
|
||||
|
||||
done:
|
||||
im->alphaBlendingFlag = alphablending_bak;
|
||||
im->alphaBlendingFlag = alphablending_bak;
|
||||
}
|
||||
|
||||
static void _gdImageFillTiled(gdImagePtr im, int x, int y, int nc)
|
||||
@@ -2057,7 +2068,7 @@ void gdImageRectangle (gdImagePtr im, int x1, int y1, int x2, int y2, int color)
|
||||
|
||||
x1ul = x1 - half;
|
||||
y1ul = y1 - half;
|
||||
|
||||
|
||||
x2lr = x2 + half;
|
||||
y2lr = y2 + half;
|
||||
|
||||
@@ -2255,7 +2266,7 @@ void gdImageCopyMerge (gdImagePtr dst, gdImagePtr src, int dstX, int dstY, int s
|
||||
int tox, toy;
|
||||
int ncR, ncG, ncB;
|
||||
toy = dstY;
|
||||
|
||||
|
||||
for (y = srcY; y < (srcY + h); y++) {
|
||||
tox = dstX;
|
||||
for (x = srcX; x < (srcX + w); x++) {
|
||||
@@ -2352,7 +2363,7 @@ void gdImageCopyResized (gdImagePtr dst, gdImagePtr src, int dstX, int dstY, int
|
||||
int colorMap[gdMaxColors];
|
||||
/* Stretch vectors */
|
||||
int *stx, *sty;
|
||||
|
||||
|
||||
if (overflow2(sizeof(int), srcW)) {
|
||||
return;
|
||||
}
|
||||
@@ -2897,7 +2908,7 @@ int gdAlphaBlend (int dst, int src) {
|
||||
src_weight = gdAlphaTransparent - src_alpha;
|
||||
dst_weight = (gdAlphaTransparent - dst_alpha) * src_alpha / gdAlphaMax;
|
||||
tot_weight = src_weight + dst_weight;
|
||||
|
||||
|
||||
/* -------------------------------------------------------------------- */
|
||||
/* What red, green and blue result values will we use? */
|
||||
/* -------------------------------------------------------------------- */
|
||||
|
||||
@@ -138,16 +138,29 @@ static int _gd2GetHeader(gdIOCtxPtr in, int *sx, int *sy, int *cs, int *vers, in
|
||||
if (gd2_compressed(*fmt)) {
|
||||
nc = (*ncx) * (*ncy);
|
||||
GD2_DBG(php_gd_error("Reading %d chunk index entries", nc));
|
||||
if (overflow2(sizeof(t_chunk_info), nc)) {
|
||||
goto fail1;
|
||||
}
|
||||
sidx = sizeof(t_chunk_info) * nc;
|
||||
if (sidx <= 0) {
|
||||
goto fail1;
|
||||
}
|
||||
cidx = gdCalloc(sidx, 1);
|
||||
if (cidx == NULL) {
|
||||
goto fail1;
|
||||
}
|
||||
|
||||
for (i = 0; i < nc; i++) {
|
||||
if (gdGetInt(&cidx[i].offset, in) != 1) {
|
||||
gdFree(cidx);
|
||||
goto fail1;
|
||||
}
|
||||
if (gdGetInt(&cidx[i].size, in) != 1) {
|
||||
gdFree(cidx);
|
||||
goto fail1;
|
||||
}
|
||||
if (cidx[i].offset < 0 || cidx[i].size < 0) {
|
||||
gdFree(cidx);
|
||||
goto fail1;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -601,14 +601,26 @@ nomatch:
|
||||
* code in turn. When the buffer fills up empty it and start over.
|
||||
*/
|
||||
|
||||
static unsigned long masks[] = { 0x0000, 0x0001, 0x0003, 0x0007, 0x000F,
|
||||
static const unsigned long masks[] = { 0x0000, 0x0001, 0x0003, 0x0007, 0x000F,
|
||||
0x001F, 0x003F, 0x007F, 0x00FF,
|
||||
0x01FF, 0x03FF, 0x07FF, 0x0FFF,
|
||||
0x1FFF, 0x3FFF, 0x7FFF, 0xFFFF };
|
||||
|
||||
|
||||
/* Arbitrary value to mark output is done. When we see EOFCode, then we don't
|
||||
* expect to see any more data. If we do (e.g. corrupt image inputs), cur_bits
|
||||
* might be negative, so flag it to return early.
|
||||
*/
|
||||
#define CUR_BITS_FINISHED -1000
|
||||
|
||||
|
||||
static void
|
||||
output(code_int code, GifCtx *ctx)
|
||||
{
|
||||
if (ctx->cur_bits == CUR_BITS_FINISHED) {
|
||||
return;
|
||||
}
|
||||
|
||||
ctx->cur_accum &= masks[ ctx->cur_bits ];
|
||||
|
||||
if( ctx->cur_bits > 0 )
|
||||
@@ -655,8 +667,10 @@ output(code_int code, GifCtx *ctx)
|
||||
ctx->cur_bits -= 8;
|
||||
}
|
||||
|
||||
flush_char(ctx);
|
||||
/* Flag that it's done to prevent re-entry. */
|
||||
ctx->cur_bits = CUR_BITS_FINISHED;
|
||||
|
||||
flush_char(ctx);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -39,8 +39,8 @@
|
||||
downscaling using the fixed point implementations are usually much faster
|
||||
than the existing gdImageCopyResampled while having a similar or better
|
||||
quality.
|
||||
|
||||
For image rotations, the optimized versions have a lazy antialiasing for
|
||||
|
||||
For image rotations, the optimized versions have a lazy antialiasing for
|
||||
the edges of the images. For a much better antialiased result, the affine
|
||||
function is recommended.
|
||||
*/
|
||||
@@ -633,7 +633,7 @@ static inline int _color_blend (const int dst, const int src)
|
||||
}
|
||||
}
|
||||
|
||||
static inline int _setEdgePixel(const gdImagePtr src, unsigned int x, unsigned int y, gdFixed coverage, const int bgColor)
|
||||
static inline int _setEdgePixel(const gdImagePtr src, unsigned int x, unsigned int y, gdFixed coverage, const int bgColor)
|
||||
{
|
||||
const gdFixed f_127 = gd_itofx(127);
|
||||
register int c = src->tpixels[y][x];
|
||||
@@ -881,20 +881,41 @@ int getPixelInterpolated(gdImagePtr im, const double x, const double y, const in
|
||||
static inline LineContribType * _gdContributionsAlloc(unsigned int line_length, unsigned int windows_size)
|
||||
{
|
||||
unsigned int u = 0;
|
||||
LineContribType *res;
|
||||
LineContribType *res;
|
||||
int overflow_error = 0;
|
||||
|
||||
res = (LineContribType *) gdMalloc(sizeof(LineContribType));
|
||||
if (!res) {
|
||||
return NULL;
|
||||
}
|
||||
res->WindowSize = windows_size;
|
||||
res->LineLength = line_length;
|
||||
res->ContribRow = (ContributionType *) gdMalloc(line_length * sizeof(ContributionType));
|
||||
|
||||
for (u = 0 ; u < line_length ; u++) {
|
||||
res->ContribRow[u].Weights = (double *) gdMalloc(windows_size * sizeof(double));
|
||||
}
|
||||
return res;
|
||||
res->WindowSize = windows_size;
|
||||
res->LineLength = line_length;
|
||||
if (overflow2(line_length, sizeof(ContributionType))) {
|
||||
gdFree(res);
|
||||
return NULL;
|
||||
}
|
||||
res->ContribRow = (ContributionType *) gdMalloc(line_length * sizeof(ContributionType));
|
||||
if (res->ContribRow == NULL) {
|
||||
gdFree(res);
|
||||
return NULL;
|
||||
}
|
||||
for (u = 0 ; u < line_length ; u++) {
|
||||
if (overflow2(windows_size, sizeof(double))) {
|
||||
overflow_error = 1;
|
||||
} else {
|
||||
res->ContribRow[u].Weights = (double *) gdMalloc(windows_size * sizeof(double));
|
||||
}
|
||||
if (overflow_error == 1 || res->ContribRow[u].Weights == NULL) {
|
||||
unsigned int i;
|
||||
u--;
|
||||
for (i=0;i<=u;i++) {
|
||||
gdFree(res->ContribRow[i].Weights);
|
||||
}
|
||||
gdFree(res);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
static inline void _gdContributionsFree(LineContribType * p)
|
||||
@@ -909,59 +930,62 @@ static inline void _gdContributionsFree(LineContribType * p)
|
||||
|
||||
static inline LineContribType *_gdContributionsCalc(unsigned int line_size, unsigned int src_size, double scale_d, const interpolation_method pFilter)
|
||||
{
|
||||
double width_d;
|
||||
double scale_f_d = 1.0;
|
||||
const double filter_width_d = DEFAULT_BOX_RADIUS;
|
||||
double width_d;
|
||||
double scale_f_d = 1.0;
|
||||
const double filter_width_d = DEFAULT_BOX_RADIUS;
|
||||
int windows_size;
|
||||
unsigned int u;
|
||||
LineContribType *res;
|
||||
int overflow_error = 0;
|
||||
|
||||
if (scale_d < 1.0) {
|
||||
width_d = filter_width_d / scale_d;
|
||||
scale_f_d = scale_d;
|
||||
} else {
|
||||
width_d= filter_width_d;
|
||||
}
|
||||
if (scale_d < 1.0) {
|
||||
width_d = filter_width_d / scale_d;
|
||||
scale_f_d = scale_d;
|
||||
} else {
|
||||
width_d= filter_width_d;
|
||||
}
|
||||
|
||||
windows_size = 2 * (int)ceil(width_d) + 1;
|
||||
res = _gdContributionsAlloc(line_size, windows_size);
|
||||
|
||||
for (u = 0; u < line_size; u++) {
|
||||
const double dCenter = (double)u / scale_d;
|
||||
/* get the significant edge points affecting the pixel */
|
||||
register int iLeft = MAX(0, (int)floor (dCenter - width_d));
|
||||
int iRight = MIN((int)ceil(dCenter + width_d), (int)src_size - 1);
|
||||
double dTotalWeight = 0.0;
|
||||
windows_size = 2 * (int)ceil(width_d) + 1;
|
||||
res = _gdContributionsAlloc(line_size, windows_size);
|
||||
if (res == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
for (u = 0; u < line_size; u++) {
|
||||
const double dCenter = (double)u / scale_d;
|
||||
/* get the significant edge points affecting the pixel */
|
||||
register int iLeft = MAX(0, (int)floor (dCenter - width_d));
|
||||
int iRight = MIN((int)ceil(dCenter + width_d), (int)src_size - 1);
|
||||
double dTotalWeight = 0.0;
|
||||
int iSrc;
|
||||
|
||||
res->ContribRow[u].Left = iLeft;
|
||||
res->ContribRow[u].Right = iRight;
|
||||
/* Cut edge points to fit in filter window in case of spill-off */
|
||||
if (iRight - iLeft + 1 > windows_size) {
|
||||
if (iLeft < ((int)src_size - 1 / 2)) {
|
||||
iLeft++;
|
||||
} else {
|
||||
iRight--;
|
||||
}
|
||||
}
|
||||
|
||||
/* Cut edge points to fit in filter window in case of spill-off */
|
||||
if (iRight - iLeft + 1 > windows_size) {
|
||||
if (iLeft < ((int)src_size - 1 / 2)) {
|
||||
iLeft++;
|
||||
} else {
|
||||
iRight--;
|
||||
}
|
||||
}
|
||||
res->ContribRow[u].Left = iLeft;
|
||||
res->ContribRow[u].Right = iRight;
|
||||
|
||||
for (iSrc = iLeft; iSrc <= iRight; iSrc++) {
|
||||
dTotalWeight += (res->ContribRow[u].Weights[iSrc-iLeft] = scale_f_d * (*pFilter)(scale_f_d * (dCenter - (double)iSrc)));
|
||||
}
|
||||
for (iSrc = iLeft; iSrc <= iRight; iSrc++) {
|
||||
dTotalWeight += (res->ContribRow[u].Weights[iSrc-iLeft] = scale_f_d * (*pFilter)(scale_f_d * (dCenter - (double)iSrc)));
|
||||
}
|
||||
|
||||
if (dTotalWeight < 0.0) {
|
||||
_gdContributionsFree(res);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (dTotalWeight > 0.0) {
|
||||
for (iSrc = iLeft; iSrc <= iRight; iSrc++) {
|
||||
res->ContribRow[u].Weights[iSrc-iLeft] /= dTotalWeight;
|
||||
}
|
||||
}
|
||||
}
|
||||
return res;
|
||||
if (dTotalWeight > 0.0) {
|
||||
for (iSrc = iLeft; iSrc <= iRight; iSrc++) {
|
||||
res->ContribRow[u].Weights[iSrc-iLeft] /= dTotalWeight;
|
||||
}
|
||||
}
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
static inline void _gdScaleRow(gdImagePtr pSrc, unsigned int src_width, gdImagePtr dst, unsigned int dst_width, unsigned int row, LineContribType *contrib)
|
||||
@@ -1049,6 +1073,9 @@ static inline void _gdScaleVert (const gdImagePtr pSrc, const unsigned int src_w
|
||||
}
|
||||
|
||||
contrib = _gdContributionsCalc(dst_height, src_height, (double)(dst_height) / (double)(src_height), pSrc->interpolation);
|
||||
if (contrib == NULL) {
|
||||
return;
|
||||
}
|
||||
/* scale each column */
|
||||
for (u = 0; u < dst_width - 1; u++) {
|
||||
_gdScaleCol(pSrc, src_width, pDst, dst_width, dst_height, u, contrib);
|
||||
@@ -1070,12 +1097,12 @@ gdImagePtr gdImageScaleTwoPass(const gdImagePtr src, const unsigned int src_widt
|
||||
|
||||
dst = gdImageCreateTrueColor(new_width, new_height);
|
||||
if (dst == NULL) {
|
||||
gdFree(tmp_im);
|
||||
gdImageDestroy(tmp_im);
|
||||
return NULL;
|
||||
}
|
||||
gdImageSetInterpolationMethod(dst, src->interpolation_id);
|
||||
_gdScaleVert(tmp_im, new_width, src_height, dst, new_width, new_height);
|
||||
gdFree(tmp_im);
|
||||
gdImageDestroy(tmp_im);
|
||||
|
||||
return dst;
|
||||
}
|
||||
@@ -1093,7 +1120,7 @@ gdImagePtr Scale(const gdImagePtr src, const unsigned int src_width, const unsig
|
||||
_gdScaleHoriz(src, src_width, src_height, tmp_im, new_width, src_height);
|
||||
_gdScaleVert(tmp_im, new_width, src_height, dst, new_width, new_height);
|
||||
|
||||
gdFree(tmp_im);
|
||||
gdImageDestroy(tmp_im);
|
||||
return dst;
|
||||
}
|
||||
|
||||
@@ -1222,7 +1249,13 @@ static gdImagePtr gdImageScaleBilinearPalette(gdImagePtr im, const unsigned int
|
||||
if (new_img == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
new_img->transparent = gdTrueColorAlpha(im->red[transparent], im->green[transparent], im->blue[transparent], im->alpha[transparent]);
|
||||
|
||||
if (transparent < 0) {
|
||||
/* uninitialized */
|
||||
new_img->transparent = -1;
|
||||
} else {
|
||||
new_img->transparent = gdTrueColorAlpha(im->red[transparent], im->green[transparent], im->blue[transparent], im->alpha[transparent]);
|
||||
}
|
||||
|
||||
for (i=0; i < _height; i++) {
|
||||
long j;
|
||||
@@ -2273,7 +2306,7 @@ int gdTransformAffineGetImage(gdImagePtr *dst,
|
||||
if (!src->trueColor) {
|
||||
gdImagePaletteToTrueColor(src);
|
||||
}
|
||||
|
||||
|
||||
/* Translate to dst origin (0,0) */
|
||||
gdAffineTranslate(m, -bbox.x, -bbox.y);
|
||||
gdAffineConcat(m, affine, m);
|
||||
@@ -2332,7 +2365,7 @@ int gdTransformAffineCopy(gdImagePtr dst,
|
||||
if (src->interpolation_id == GD_BILINEAR_FIXED || src->interpolation_id == GD_BICUBIC_FIXED || src->interpolation_id == GD_NEAREST_NEIGHBOUR) {
|
||||
interpolation_id_bak = src->interpolation_id;
|
||||
interpolation_bak = src->interpolation;
|
||||
|
||||
|
||||
gdImageSetInterpolationMethod(src, GD_BICUBIC);
|
||||
}
|
||||
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
* If it is not working, it's not Thomas G. Lane's fault.
|
||||
*/
|
||||
|
||||
/*
|
||||
/*
|
||||
SETTING THIS ONE CAUSES STRIPED IMAGE
|
||||
to be done: solve this
|
||||
#define ORIGINAL_LIB_JPEG_REVERSE_ODD_ROWS
|
||||
@@ -152,7 +152,7 @@
|
||||
* color space, and repeatedly splits the "largest" remaining box until we
|
||||
* have as many boxes as desired colors. Then the mean color in each
|
||||
* remaining box becomes one of the possible output colors.
|
||||
*
|
||||
*
|
||||
* The second pass over the image maps each input pixel to the closest output
|
||||
* color (optionally after applying a Floyd-Steinberg dithering correction).
|
||||
* This mapping is logically trivial, but making it go fast enough requires
|
||||
@@ -1320,16 +1320,16 @@ pass2_no_dither (j_decompress_ptr cinfo,
|
||||
#else
|
||||
r = gdTrueColorGetRed (*inptr);
|
||||
g = gdTrueColorGetGreen (*inptr);
|
||||
/*
|
||||
/*
|
||||
2.0.24: inptr must not be incremented until after
|
||||
transparency check, if any. Thanks to "Super Pikeman."
|
||||
transparency check, if any. Thanks to "Super Pikeman."
|
||||
*/
|
||||
b = gdTrueColorGetBlue (*inptr);
|
||||
|
||||
/* If the pixel is transparent, we assign it the palette index that
|
||||
* will later be added at the end of the palette as the transparent
|
||||
* index. */
|
||||
if ((oim->transparent >= 0) && (oim->transparent == *(inptr - 1)))
|
||||
if ((oim->transparent >= 0) && (oim->transparent == *inptr))
|
||||
{
|
||||
*outptr++ = nim->colorsTotal;
|
||||
inptr++;
|
||||
@@ -1795,7 +1795,7 @@ static void gdImageTrueColorToPaletteBody (gdImagePtr oim, int dither, int color
|
||||
}
|
||||
} else {
|
||||
nim = oim;
|
||||
}
|
||||
}
|
||||
if (!oim->trueColor)
|
||||
{
|
||||
/* (Almost) nothing to do! */
|
||||
@@ -2004,7 +2004,7 @@ static void gdImageTrueColorToPaletteBody (gdImagePtr oim, int dither, int color
|
||||
}
|
||||
|
||||
/* Success! Get rid of the truecolor image data. */
|
||||
if (!cimP) {
|
||||
if (!cimP) {
|
||||
oim->trueColor = 0;
|
||||
/* Junk the truecolor pixels */
|
||||
for (i = 0; i < oim->sy; i++)
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
--TEST--
|
||||
Bug #66387 (Stack overflow with imagefilltoborder)
|
||||
--SKIPIF--
|
||||
<?php
|
||||
if (!extension_loaded('gd')) die('skip gd extension not available!');
|
||||
?>
|
||||
--FILE--
|
||||
<?php
|
||||
$im = imagecreatetruecolor(20, 20);
|
||||
$c = imagecolorallocate($im, 255, 0, 0);
|
||||
imagefilltoborder($im, 0, -999355, $c, $c);
|
||||
echo "ready\n";
|
||||
?>
|
||||
--EXPECT--
|
||||
ready
|
||||
@@ -0,0 +1,16 @@
|
||||
--TEST--
|
||||
Bug #71912 (libgd: signedness vulnerability)
|
||||
--SKIPIF--
|
||||
<?php
|
||||
if(!extension_loaded('gd')){ die('skip gd extension not available'); }
|
||||
if(!function_exists('imagecreatefromgd2')) die('skip imagecreatefromgd2() not available');
|
||||
?>
|
||||
--FILE--
|
||||
<?php
|
||||
imagecreatefromgd2(__DIR__."/invalid_neg_size.gd2");
|
||||
?>
|
||||
OK
|
||||
--EXPECTF--
|
||||
|
||||
Warning: imagecreatefromgd2(): '%s/invalid_neg_size.gd2' is not a valid GD2 file in %s/bug71912.php on line %d
|
||||
OK
|
||||
@@ -0,0 +1,15 @@
|
||||
--TEST--
|
||||
Bug #72227: imagescale out-of-bounds read
|
||||
--SKIPIF--
|
||||
<?php
|
||||
if (!extension_loaded('gd')) die("skip gd extension not available\n");
|
||||
?>
|
||||
--FILE--
|
||||
<?php
|
||||
|
||||
$img = imagecreatetruecolor ( 100, 100);
|
||||
imagescale($img, 13, 1, IMG_BICUBIC);
|
||||
?>
|
||||
DONE
|
||||
--EXPECT--
|
||||
DONE
|
||||
@@ -0,0 +1,15 @@
|
||||
--TEST--
|
||||
Bug #72298: pass2_no_dither out-of-bounds access
|
||||
--SKIPIF--
|
||||
<?php
|
||||
if (!extension_loaded('gd')) die("skip gd extension not available\n");
|
||||
?>
|
||||
--FILE--
|
||||
<?php
|
||||
$img = imagecreatetruecolor (1 , 1);
|
||||
imagecolortransparent($img, 0);
|
||||
imagetruecolortopalette($img, false, 4);
|
||||
?>
|
||||
DONE
|
||||
--EXPECT--
|
||||
DONE
|
||||
@@ -0,0 +1,33 @@
|
||||
--TEST--
|
||||
Bug #72339 Integer Overflow in _gd2GetHeader() resulting in heap overflow
|
||||
--SKIPIF--
|
||||
<?php if (!function_exists("imagecreatefromgd2")) print "skip"; ?>
|
||||
--FILE--
|
||||
<?php
|
||||
$fname = dirname(__FILE__) . DIRECTORY_SEPARATOR . "bug72339.gd";
|
||||
|
||||
$fh = fopen($fname, "w");
|
||||
fwrite($fh, "gd2\x00");
|
||||
fwrite($fh, pack("n", 2));
|
||||
fwrite($fh, pack("n", 1));
|
||||
fwrite($fh, pack("n", 1));
|
||||
fwrite($fh, pack("n", 0x40));
|
||||
fwrite($fh, pack("n", 2));
|
||||
fwrite($fh, pack("n", 0x5AA0)); // Chunks Wide
|
||||
fwrite($fh, pack("n", 0x5B00)); // Chunks Vertically
|
||||
fwrite($fh, str_repeat("\x41\x41\x41\x41", 0x1000000)); // overflow data
|
||||
fclose($fh);
|
||||
|
||||
$im = imagecreatefromgd2($fname);
|
||||
|
||||
if ($im) {
|
||||
imagedestroy($im);
|
||||
}
|
||||
unlink($fname);
|
||||
|
||||
?>
|
||||
--EXPECTF--
|
||||
Warning: imagecreatefromgd2(): gd warning: product of memory allocation multiplication would exceed INT_MAX, failing operation gracefully
|
||||
in %sbug72339.php on line %d
|
||||
|
||||
Warning: imagecreatefromgd2(): '%sbug72339.gd' is not a valid GD2 file in %sbug72339.php on line %d
|
||||
@@ -0,0 +1,17 @@
|
||||
--TEST--
|
||||
Bug #19366 (gdimagefill() function crashes (fixed in bundled libgd))
|
||||
--SKIPIF--
|
||||
<?php
|
||||
if (!extension_loaded('gd')) die("skip gd extension not available\n");
|
||||
?>
|
||||
--FILE--
|
||||
<?php
|
||||
$img = imagecreatetruecolor(100, 100);
|
||||
imagecolortransparent($img, -1000000);
|
||||
imagetruecolortopalette($img, TRUE, 3);
|
||||
imagecolortransparent($img, 9);
|
||||
echo "OK";
|
||||
?>
|
||||
--EXPECT--
|
||||
OK
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
--TEST--
|
||||
Bug #72512 gdImageTrueColorToPaletteBody allows arbitrary write/read access, var 0
|
||||
--SKIPIF--
|
||||
<?php
|
||||
if (!extension_loaded('gd')) die("skip gd extension not available\n");
|
||||
?>
|
||||
--FILE--
|
||||
<?php
|
||||
|
||||
$img = imagecreatetruecolor(13, 1007);
|
||||
|
||||
imagecolortransparent($img, -10066304);
|
||||
imagetruecolortopalette($img, TRUE, 3);
|
||||
imagescale($img, 1, 65535);
|
||||
?>
|
||||
==DONE==
|
||||
--EXPECT--
|
||||
==DONE==
|
||||
@@ -0,0 +1,18 @@
|
||||
--TEST--
|
||||
Bug #72512 gdImageTrueColorToPaletteBody allows arbitrary write/read access, var 1
|
||||
--SKIPIF--
|
||||
<?php
|
||||
if (!extension_loaded('gd')) die("skip gd extension not available\n");
|
||||
?>
|
||||
--FILE--
|
||||
<?php
|
||||
|
||||
$img = imagecreatetruecolor(100, 100);
|
||||
imagecolortransparent($img, -1000000);
|
||||
imagetruecolortopalette($img, TRUE, 3);
|
||||
imagecolortransparent($img, 9);
|
||||
|
||||
?>
|
||||
==DONE==
|
||||
--EXPECT--
|
||||
==DONE==
|
||||
Binary file not shown.
@@ -112,7 +112,7 @@ PHP_FUNCTION(grapheme_strpos)
|
||||
int haystack_len, needle_len;
|
||||
unsigned char *found;
|
||||
long loffset = 0;
|
||||
int32_t offset = 0;
|
||||
int32_t offset = 0, noffset = 0;
|
||||
int ret_pos;
|
||||
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss|l", (char **)&haystack, &haystack_len, (char **)&needle, &needle_len, &loffset) == FAILURE) {
|
||||
@@ -132,6 +132,7 @@ PHP_FUNCTION(grapheme_strpos)
|
||||
|
||||
/* we checked that it will fit: */
|
||||
offset = (int32_t) loffset;
|
||||
noffset = offset >= 0 ? offset : haystack_len + offset;
|
||||
|
||||
/* the offset is 'grapheme count offset' so it still might be invalid - we'll check it later */
|
||||
|
||||
@@ -146,7 +147,7 @@ PHP_FUNCTION(grapheme_strpos)
|
||||
/* quick check to see if the string might be there
|
||||
* I realize that 'offset' is 'grapheme count offset' but will work in spite of that
|
||||
*/
|
||||
found = (unsigned char *)php_memnstr((char *)haystack + offset, (char *)needle, needle_len, (char *)haystack + haystack_len);
|
||||
found = (unsigned char *)php_memnstr((char *)haystack + noffset, (char *)needle, needle_len, (char *)haystack + haystack_len);
|
||||
|
||||
/* if it isn't there the we are done */
|
||||
if (!found) {
|
||||
@@ -214,12 +215,13 @@ PHP_FUNCTION(grapheme_stripos)
|
||||
is_ascii = ( grapheme_ascii_check(haystack, haystack_len) >= 0 );
|
||||
|
||||
if ( is_ascii ) {
|
||||
int32_t noffset = offset >= 0 ? offset : haystack_len + offset;
|
||||
needle_dup = (unsigned char *)estrndup((char *)needle, needle_len);
|
||||
php_strtolower((char *)needle_dup, needle_len);
|
||||
haystack_dup = (unsigned char *)estrndup((char *)haystack, haystack_len);
|
||||
php_strtolower((char *)haystack_dup, haystack_len);
|
||||
|
||||
found = (unsigned char*) php_memnstr((char *)haystack_dup + offset, (char *)needle_dup, needle_len, (char *)haystack_dup + haystack_len);
|
||||
found = (unsigned char*) php_memnstr((char *)haystack_dup + noffset, (char *)needle_dup, needle_len, (char *)haystack_dup + haystack_len);
|
||||
|
||||
efree(haystack_dup);
|
||||
efree(needle_dup);
|
||||
@@ -537,7 +539,7 @@ PHP_FUNCTION(grapheme_substr)
|
||||
efree(ustr);
|
||||
}
|
||||
ubrk_close(bi);
|
||||
RETURN_EMPTY_STRING();
|
||||
RETURN_EMPTY_STRING();
|
||||
}
|
||||
|
||||
/* find the end point of the string to return */
|
||||
@@ -576,7 +578,7 @@ PHP_FUNCTION(grapheme_substr)
|
||||
sub_str_end_pos = ustr_len;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if(sub_str_start_pos > sub_str_end_pos) {
|
||||
intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR, "grapheme_substr: length is beyond start", 1 TSRMLS_CC );
|
||||
|
||||
|
||||
+136
-117
@@ -65,26 +65,26 @@ ZEND_EXTERN_MODULE_GLOBALS( intl )
|
||||
*/
|
||||
static const char * const LOC_GRANDFATHERED[] = {
|
||||
"art-lojban", "i-klingon", "i-lux", "i-navajo", "no-bok", "no-nyn",
|
||||
"cel-gaulish", "en-GB-oed", "i-ami",
|
||||
"i-bnn", "i-default", "i-enochian",
|
||||
"i-mingo", "i-pwn", "i-tao",
|
||||
"cel-gaulish", "en-GB-oed", "i-ami",
|
||||
"i-bnn", "i-default", "i-enochian",
|
||||
"i-mingo", "i-pwn", "i-tao",
|
||||
"i-tay", "i-tsu", "sgn-BE-fr",
|
||||
"sgn-BE-nl", "sgn-CH-de", "zh-cmn",
|
||||
"zh-cmn-Hans", "zh-cmn-Hant", "zh-gan" ,
|
||||
"zh-guoyu", "zh-hakka", "zh-min",
|
||||
"zh-min-nan", "zh-wuu", "zh-xiang",
|
||||
"zh-min-nan", "zh-wuu", "zh-xiang",
|
||||
"zh-yue", NULL
|
||||
};
|
||||
|
||||
/* Based on IANA registry at the time of writing this code
|
||||
* This array lists the preferred values for the grandfathered tags if applicable
|
||||
* This is in sync with the array LOC_GRANDFATHERED
|
||||
* This is in sync with the array LOC_GRANDFATHERED
|
||||
* e.g. the offsets of the grandfathered tags match the offset of the preferred value
|
||||
*/
|
||||
static const int LOC_PREFERRED_GRANDFATHERED_LEN = 6;
|
||||
static const char * const LOC_PREFERRED_GRANDFATHERED[] = {
|
||||
"jbo", "tlh", "lb",
|
||||
"nv", "nb", "nn",
|
||||
"nv", "nb", "nn",
|
||||
NULL
|
||||
};
|
||||
|
||||
@@ -122,7 +122,7 @@ static int16_t findOffset(const char* const* list, const char* key)
|
||||
/*}}}*/
|
||||
|
||||
static char* getPreferredTag(const char* gf_tag)
|
||||
{
|
||||
{
|
||||
char* result = NULL;
|
||||
int grOffset = 0;
|
||||
|
||||
@@ -141,15 +141,15 @@ static char* getPreferredTag(const char* gf_tag)
|
||||
}
|
||||
|
||||
/* {{{
|
||||
* returns the position of next token for lookup
|
||||
* returns the position of next token for lookup
|
||||
* or -1 if no token
|
||||
* strtokr equivalent search for token in reverse direction
|
||||
* strtokr equivalent search for token in reverse direction
|
||||
*/
|
||||
static int getStrrtokenPos(char* str, int savedPos)
|
||||
{
|
||||
int result =-1;
|
||||
int i;
|
||||
|
||||
|
||||
for(i=savedPos-1; i>=0; i--) {
|
||||
if(isIDSeparator(*(str+i)) ){
|
||||
/* delimiter found; check for singleton */
|
||||
@@ -171,7 +171,7 @@ static int getStrrtokenPos(char* str, int savedPos)
|
||||
/* }}} */
|
||||
|
||||
/* {{{
|
||||
* returns the position of a singleton if present
|
||||
* returns the position of a singleton if present
|
||||
* returns -1 if no singleton
|
||||
* strtok equivalent search for singleton
|
||||
*/
|
||||
@@ -180,7 +180,7 @@ static int getSingletonPos(const char* str)
|
||||
int result =-1;
|
||||
int i=0;
|
||||
int len = 0;
|
||||
|
||||
|
||||
if( str && ((len=strlen(str))>0) ){
|
||||
for( i=0; i<len ; i++){
|
||||
if( isIDSeparator(*(str+i)) ){
|
||||
@@ -198,7 +198,7 @@ static int getSingletonPos(const char* str)
|
||||
}
|
||||
}
|
||||
}/* end of for */
|
||||
|
||||
|
||||
}
|
||||
return result;
|
||||
}
|
||||
@@ -224,7 +224,7 @@ PHP_NAMED_FUNCTION(zif_locale_get_default)
|
||||
PHP_NAMED_FUNCTION(zif_locale_set_default)
|
||||
{
|
||||
char* locale_name = NULL;
|
||||
int len=0;
|
||||
int len=0;
|
||||
|
||||
if(zend_parse_parameters( ZEND_NUM_ARGS() TSRMLS_CC, "s",
|
||||
&locale_name ,&len ) == FAILURE)
|
||||
@@ -240,14 +240,14 @@ PHP_NAMED_FUNCTION(zif_locale_set_default)
|
||||
len = strlen(locale_name);
|
||||
}
|
||||
|
||||
zend_alter_ini_entry(LOCALE_INI_NAME, sizeof(LOCALE_INI_NAME), locale_name, len, PHP_INI_USER, PHP_INI_STAGE_RUNTIME);
|
||||
zend_alter_ini_entry(LOCALE_INI_NAME, sizeof(LOCALE_INI_NAME), locale_name, len, PHP_INI_USER, PHP_INI_STAGE_RUNTIME);
|
||||
|
||||
RETURN_TRUE;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{
|
||||
* Gets the value from ICU
|
||||
* Gets the value from ICU
|
||||
* common code shared by get_primary_language,get_script or get_region or get_variant
|
||||
* result = 0 if error, 1 if successful , -1 if no value
|
||||
*/
|
||||
@@ -284,7 +284,7 @@ static char* get_icu_value_internal( const char* loc_name , char* tag_name, int*
|
||||
}
|
||||
}
|
||||
|
||||
singletonPos = getSingletonPos( loc_name );
|
||||
singletonPos = getSingletonPos( loc_name );
|
||||
if( singletonPos == 0){
|
||||
/* singleton at start of script, region , variant etc.
|
||||
* or invalid singleton at start of language */
|
||||
@@ -299,7 +299,7 @@ static char* get_icu_value_internal( const char* loc_name , char* tag_name, int*
|
||||
} /* end of if != LOC_CANONICAL_TAG */
|
||||
|
||||
if( mod_loc_name == NULL){
|
||||
mod_loc_name = estrdup(loc_name );
|
||||
mod_loc_name = estrdup(loc_name );
|
||||
}
|
||||
|
||||
/* Proceed to ICU */
|
||||
@@ -326,6 +326,7 @@ static char* get_icu_value_internal( const char* loc_name , char* tag_name, int*
|
||||
if( U_FAILURE( status ) ) {
|
||||
if( status == U_BUFFER_OVERFLOW_ERROR ) {
|
||||
status = U_ZERO_ERROR;
|
||||
buflen++; /* add space for \0 */
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -366,7 +367,7 @@ static char* get_icu_value_internal( const char* loc_name , char* tag_name, int*
|
||||
* Gets the value from ICU , called when PHP userspace function is called
|
||||
* common code shared by get_primary_language,get_script or get_region or get_variant
|
||||
*/
|
||||
static void get_icu_value_src_php( char* tag_name, INTERNAL_FUNCTION_PARAMETERS)
|
||||
static void get_icu_value_src_php( char* tag_name, INTERNAL_FUNCTION_PARAMETERS)
|
||||
{
|
||||
|
||||
const char* loc_name = NULL;
|
||||
@@ -422,37 +423,37 @@ static void get_icu_value_src_php( char* tag_name, INTERNAL_FUNCTION_PARAMETERS)
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto static string Locale::getScript($locale)
|
||||
* gets the script for the $locale
|
||||
/* {{{ proto static string Locale::getScript($locale)
|
||||
* gets the script for the $locale
|
||||
}}} */
|
||||
/* {{{ proto static string locale_get_script($locale)
|
||||
* gets the script for the $locale
|
||||
/* {{{ proto static string locale_get_script($locale)
|
||||
* gets the script for the $locale
|
||||
*/
|
||||
PHP_FUNCTION( locale_get_script )
|
||||
PHP_FUNCTION( locale_get_script )
|
||||
{
|
||||
get_icu_value_src_php( LOC_SCRIPT_TAG , INTERNAL_FUNCTION_PARAM_PASSTHRU );
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto static string Locale::getRegion($locale)
|
||||
* gets the region for the $locale
|
||||
/* {{{ proto static string Locale::getRegion($locale)
|
||||
* gets the region for the $locale
|
||||
}}} */
|
||||
/* {{{ proto static string locale_get_region($locale)
|
||||
* gets the region for the $locale
|
||||
/* {{{ proto static string locale_get_region($locale)
|
||||
* gets the region for the $locale
|
||||
*/
|
||||
PHP_FUNCTION( locale_get_region )
|
||||
PHP_FUNCTION( locale_get_region )
|
||||
{
|
||||
get_icu_value_src_php( LOC_REGION_TAG , INTERNAL_FUNCTION_PARAM_PASSTHRU );
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto static string Locale::getPrimaryLanguage($locale)
|
||||
* gets the primary language for the $locale
|
||||
/* {{{ proto static string Locale::getPrimaryLanguage($locale)
|
||||
* gets the primary language for the $locale
|
||||
}}} */
|
||||
/* {{{ proto static string locale_get_primary_language($locale)
|
||||
* gets the primary language for the $locale
|
||||
/* {{{ proto static string locale_get_primary_language($locale)
|
||||
* gets the primary language for the $locale
|
||||
*/
|
||||
PHP_FUNCTION(locale_get_primary_language )
|
||||
PHP_FUNCTION(locale_get_primary_language )
|
||||
{
|
||||
get_icu_value_src_php( LOC_LANG_TAG , INTERNAL_FUNCTION_PARAM_PASSTHRU );
|
||||
}
|
||||
@@ -460,9 +461,9 @@ PHP_FUNCTION(locale_get_primary_language )
|
||||
|
||||
|
||||
/* {{{
|
||||
* common code shared by display_xyz functions to get the value from ICU
|
||||
* common code shared by display_xyz functions to get the value from ICU
|
||||
}}} */
|
||||
static void get_icu_disp_value_src_php( char* tag_name, INTERNAL_FUNCTION_PARAMETERS)
|
||||
static void get_icu_disp_value_src_php( char* tag_name, INTERNAL_FUNCTION_PARAMETERS)
|
||||
{
|
||||
const char* loc_name = NULL;
|
||||
int loc_name_len = 0;
|
||||
@@ -488,7 +489,7 @@ static void get_icu_disp_value_src_php( char* tag_name, INTERNAL_FUNCTION_PARAME
|
||||
intl_error_reset( NULL TSRMLS_CC );
|
||||
|
||||
if(zend_parse_parameters( ZEND_NUM_ARGS() TSRMLS_CC, "s|s",
|
||||
&loc_name, &loc_name_len ,
|
||||
&loc_name, &loc_name_len ,
|
||||
&disp_loc_name ,&disp_loc_name_len ) == FAILURE)
|
||||
{
|
||||
spprintf(&msg , 0, "locale_get_display_%s : unable to parse input params", tag_name );
|
||||
@@ -525,7 +526,7 @@ static void get_icu_disp_value_src_php( char* tag_name, INTERNAL_FUNCTION_PARAME
|
||||
if( mod_loc_name==NULL ){
|
||||
mod_loc_name = estrdup( loc_name );
|
||||
}
|
||||
|
||||
|
||||
/* Check if disp_loc_name passed , if not use default locale */
|
||||
if( !disp_loc_name){
|
||||
disp_loc_name = estrdup(intl_locale_get_default(TSRMLS_C));
|
||||
@@ -604,7 +605,7 @@ static void get_icu_disp_value_src_php( char* tag_name, INTERNAL_FUNCTION_PARAME
|
||||
/* {{{ proto static string get_display_name($locale[, $in_locale = null])
|
||||
* gets the name for the $locale in $in_locale or default_locale
|
||||
*/
|
||||
PHP_FUNCTION(locale_get_display_name)
|
||||
PHP_FUNCTION(locale_get_display_name)
|
||||
{
|
||||
get_icu_disp_value_src_php( DISP_NAME , INTERNAL_FUNCTION_PARAM_PASSTHRU );
|
||||
}
|
||||
@@ -616,7 +617,7 @@ PHP_FUNCTION(locale_get_display_name)
|
||||
/* {{{ proto static string get_display_language($locale[, $in_locale = null])
|
||||
* gets the language for the $locale in $in_locale or default_locale
|
||||
*/
|
||||
PHP_FUNCTION(locale_get_display_language)
|
||||
PHP_FUNCTION(locale_get_display_language)
|
||||
{
|
||||
get_icu_disp_value_src_php( LOC_LANG_TAG , INTERNAL_FUNCTION_PARAM_PASSTHRU );
|
||||
}
|
||||
@@ -628,7 +629,7 @@ PHP_FUNCTION(locale_get_display_language)
|
||||
/* {{{ proto static string get_display_script($locale, $in_locale = null)
|
||||
* gets the script for the $locale in $in_locale or default_locale
|
||||
*/
|
||||
PHP_FUNCTION(locale_get_display_script)
|
||||
PHP_FUNCTION(locale_get_display_script)
|
||||
{
|
||||
get_icu_disp_value_src_php( LOC_SCRIPT_TAG , INTERNAL_FUNCTION_PARAM_PASSTHRU );
|
||||
}
|
||||
@@ -640,7 +641,7 @@ PHP_FUNCTION(locale_get_display_script)
|
||||
/* {{{ proto static string get_display_region($locale, $in_locale = null)
|
||||
* gets the region for the $locale in $in_locale or default_locale
|
||||
*/
|
||||
PHP_FUNCTION(locale_get_display_region)
|
||||
PHP_FUNCTION(locale_get_display_region)
|
||||
{
|
||||
get_icu_disp_value_src_php( LOC_REGION_TAG , INTERNAL_FUNCTION_PARAM_PASSTHRU );
|
||||
}
|
||||
@@ -654,7 +655,7 @@ PHP_FUNCTION(locale_get_display_region)
|
||||
* proto static string get_display_variant($locale, $in_locale = null)
|
||||
* gets the variant for the $locale in $in_locale or default_locale
|
||||
*/
|
||||
PHP_FUNCTION(locale_get_display_variant)
|
||||
PHP_FUNCTION(locale_get_display_variant)
|
||||
{
|
||||
get_icu_disp_value_src_php( LOC_VARIANT_TAG , INTERNAL_FUNCTION_PARAM_PASSTHRU );
|
||||
}
|
||||
@@ -667,7 +668,7 @@ PHP_FUNCTION(locale_get_display_variant)
|
||||
/* {{{ proto static array locale_get_keywords(string $locale) {
|
||||
* return an associative array containing keyword-value
|
||||
* pairs for this locale. The keys are keys to the array (doh!)
|
||||
*/
|
||||
*/
|
||||
PHP_FUNCTION( locale_get_keywords )
|
||||
{
|
||||
UEnumeration* e = NULL;
|
||||
@@ -679,10 +680,10 @@ PHP_FUNCTION( locale_get_keywords )
|
||||
const char* loc_name = NULL;
|
||||
int loc_name_len = 0;
|
||||
|
||||
/*
|
||||
ICU expects the buffer to be allocated before calling the function
|
||||
and so the buffer size has been explicitly specified
|
||||
ICU uloc.h #define ULOC_KEYWORD_AND_VALUES_CAPACITY 100
|
||||
/*
|
||||
ICU expects the buffer to be allocated before calling the function
|
||||
and so the buffer size has been explicitly specified
|
||||
ICU uloc.h #define ULOC_KEYWORD_AND_VALUES_CAPACITY 100
|
||||
hence the kw_value buffer size is 100
|
||||
*/
|
||||
char* kw_value = NULL;
|
||||
@@ -721,7 +722,7 @@ PHP_FUNCTION( locale_get_keywords )
|
||||
kw_value_len=uloc_getKeywordValue( loc_name,kw_key, kw_value, kw_value_len+1 , &status );
|
||||
} else if(!U_FAILURE(status)) {
|
||||
kw_value = erealloc( kw_value , kw_value_len+1);
|
||||
}
|
||||
}
|
||||
if (U_FAILURE(status)) {
|
||||
intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR, "locale_get_keywords: Error encountered while getting the keyword value for the keyword", 0 TSRMLS_CC );
|
||||
if( kw_value){
|
||||
@@ -740,10 +741,10 @@ PHP_FUNCTION( locale_get_keywords )
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto static string Locale::canonicalize($locale)
|
||||
* @return string the canonicalized locale
|
||||
/* {{{ proto static string Locale::canonicalize($locale)
|
||||
* @return string the canonicalized locale
|
||||
* }}} */
|
||||
/* {{{ proto static string locale_canonicalize(Locale $loc, string $locale)
|
||||
/* {{{ proto static string locale_canonicalize(Locale $loc, string $locale)
|
||||
* @param string $locale The locale string to canonicalize
|
||||
*/
|
||||
PHP_FUNCTION(locale_canonicalize)
|
||||
@@ -752,10 +753,10 @@ PHP_FUNCTION(locale_canonicalize)
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ append_key_value
|
||||
/* {{{ append_key_value
|
||||
* Internal function which is called from locale_compose
|
||||
* gets the value for the key_name and appends to the loc_name
|
||||
* returns 1 if successful , -1 if not found ,
|
||||
* returns 1 if successful , -1 if not found ,
|
||||
* 0 if array element is not a string , -2 if buffer-overflow
|
||||
*/
|
||||
static int append_key_value(smart_str* loc_name, HashTable* hash_arr, char* key_name)
|
||||
@@ -767,7 +768,7 @@ static int append_key_value(smart_str* loc_name, HashTable* hash_arr, char* key_
|
||||
/* element value is not a string */
|
||||
return FAILURE;
|
||||
}
|
||||
if(strcmp(key_name, LOC_LANG_TAG) != 0 &&
|
||||
if(strcmp(key_name, LOC_LANG_TAG) != 0 &&
|
||||
strcmp(key_name, LOC_GRANDFATHERED_LANG_TAG)!=0 ) {
|
||||
/* not lang or grandfathered tag */
|
||||
smart_str_appendl(loc_name, SEPARATOR , sizeof(SEPARATOR)-1);
|
||||
@@ -792,11 +793,11 @@ static void add_prefix(smart_str* loc_name, char* key_name)
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ append_multiple_key_values
|
||||
/* {{{ append_multiple_key_values
|
||||
* Internal function which is called from locale_compose
|
||||
* gets the multiple values for the key_name and appends to the loc_name
|
||||
* used for 'variant','extlang','private'
|
||||
* returns 1 if successful , -1 if not found ,
|
||||
* used for 'variant','extlang','private'
|
||||
* returns 1 if successful , -1 if not found ,
|
||||
* 0 if array element is not a string , -2 if buffer-overflow
|
||||
*/
|
||||
static int append_multiple_key_values(smart_str* loc_name, HashTable* hash_arr, char* key_name TSRMLS_DC)
|
||||
@@ -850,8 +851,8 @@ static int append_multiple_key_values(smart_str* loc_name, HashTable* hash_arr,
|
||||
|
||||
/* Multiple variant values as variant0, variant1 ,variant2 */
|
||||
isFirstSubtag = 0;
|
||||
for( i=0 ; i< max_value; i++ ){
|
||||
snprintf( cur_key_name , 30, "%s%d", key_name , i);
|
||||
for( i=0 ; i< max_value; i++ ){
|
||||
snprintf( cur_key_name , 30, "%s%d", key_name , i);
|
||||
if( zend_hash_find( hash_arr , cur_key_name , strlen(cur_key_name) + 1,(void **)&ele_value ) == SUCCESS ){
|
||||
if( Z_TYPE_PP(ele_value)!= IS_STRING ){
|
||||
/* variant is not a string */
|
||||
@@ -873,7 +874,7 @@ static int append_multiple_key_values(smart_str* loc_name, HashTable* hash_arr,
|
||||
|
||||
/*{{{
|
||||
* If applicable sets error message and aborts locale_compose gracefully
|
||||
* returns 0 if locale_compose needs to be aborted
|
||||
* returns 0 if locale_compose needs to be aborted
|
||||
* otherwise returns 1
|
||||
*/
|
||||
static int handleAppendResult( int result, smart_str* loc_name TSRMLS_DC)
|
||||
@@ -890,11 +891,11 @@ static int handleAppendResult( int result, smart_str* loc_name TSRMLS_DC)
|
||||
/* }}} */
|
||||
|
||||
#define RETURN_SMART_STR(s) smart_str_0((s)); RETURN_STRINGL((s)->c, (s)->len, 0)
|
||||
/* {{{ proto static string Locale::composeLocale($array)
|
||||
* Creates a locale by combining the parts of locale-ID passed
|
||||
/* {{{ proto static string Locale::composeLocale($array)
|
||||
* Creates a locale by combining the parts of locale-ID passed
|
||||
* }}} */
|
||||
/* {{{ proto static string compose_locale($array)
|
||||
* Creates a locale by combining the parts of locale-ID passed
|
||||
/* {{{ proto static string compose_locale($array)
|
||||
* Creates a locale by combining the parts of locale-ID passed
|
||||
* }}} */
|
||||
PHP_FUNCTION(locale_compose)
|
||||
{
|
||||
@@ -920,7 +921,7 @@ PHP_FUNCTION(locale_compose)
|
||||
RETURN_FALSE;
|
||||
|
||||
/* Check for grandfathered first */
|
||||
result = append_key_value(loc_name, hash_arr, LOC_GRANDFATHERED_LANG_TAG);
|
||||
result = append_key_value(loc_name, hash_arr, LOC_GRANDFATHERED_LANG_TAG);
|
||||
if( result == SUCCESS){
|
||||
RETURN_SMART_STR(loc_name);
|
||||
}
|
||||
@@ -929,7 +930,7 @@ PHP_FUNCTION(locale_compose)
|
||||
}
|
||||
|
||||
/* Not grandfathered */
|
||||
result = append_key_value(loc_name, hash_arr , LOC_LANG_TAG);
|
||||
result = append_key_value(loc_name, hash_arr , LOC_LANG_TAG);
|
||||
if( result == LOC_NOT_FOUND ){
|
||||
intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR,
|
||||
"locale_compose: parameter array does not contain 'language' tag.", 0 TSRMLS_CC );
|
||||
@@ -947,11 +948,11 @@ PHP_FUNCTION(locale_compose)
|
||||
}
|
||||
|
||||
/* Script */
|
||||
result = append_key_value(loc_name, hash_arr , LOC_SCRIPT_TAG);
|
||||
result = append_key_value(loc_name, hash_arr , LOC_SCRIPT_TAG);
|
||||
if( !handleAppendResult( result, loc_name TSRMLS_CC)){
|
||||
RETURN_FALSE;
|
||||
}
|
||||
|
||||
|
||||
/* Region */
|
||||
result = append_key_value( loc_name, hash_arr , LOC_REGION_TAG);
|
||||
if( !handleAppendResult( result, loc_name TSRMLS_CC)){
|
||||
@@ -959,7 +960,7 @@ PHP_FUNCTION(locale_compose)
|
||||
}
|
||||
|
||||
/* Variant */
|
||||
result = append_multiple_key_values( loc_name, hash_arr , LOC_VARIANT_TAG TSRMLS_CC);
|
||||
result = append_multiple_key_values( loc_name, hash_arr , LOC_VARIANT_TAG TSRMLS_CC);
|
||||
if( !handleAppendResult( result, loc_name TSRMLS_CC)){
|
||||
RETURN_FALSE;
|
||||
}
|
||||
@@ -985,16 +986,16 @@ static char* get_private_subtags(const char* loc_name)
|
||||
{
|
||||
char* result =NULL;
|
||||
int singletonPos = 0;
|
||||
int len =0;
|
||||
int len =0;
|
||||
const char* mod_loc_name =NULL;
|
||||
|
||||
if( loc_name && (len = strlen(loc_name)>0 ) ){
|
||||
mod_loc_name = loc_name ;
|
||||
mod_loc_name = loc_name ;
|
||||
len = strlen(mod_loc_name);
|
||||
while( (singletonPos = getSingletonPos(mod_loc_name))!= -1){
|
||||
|
||||
if( singletonPos!=-1){
|
||||
if( (*(mod_loc_name+singletonPos)=='x') || (*(mod_loc_name+singletonPos)=='X') ){
|
||||
if( singletonPos!=-1){
|
||||
if( (*(mod_loc_name+singletonPos)=='x') || (*(mod_loc_name+singletonPos)=='X') ){
|
||||
/* private subtag start found */
|
||||
if( singletonPos + 2 == len){
|
||||
/* loc_name ends with '-x-' ; return NULL */
|
||||
@@ -1019,7 +1020,7 @@ static char* get_private_subtags(const char* loc_name)
|
||||
|
||||
} /* end of while */
|
||||
}
|
||||
|
||||
|
||||
return result;
|
||||
}
|
||||
/* }}} */
|
||||
@@ -1044,20 +1045,20 @@ static int add_array_entry(const char* loc_name, zval* hash_arr, char* key_name
|
||||
} else {
|
||||
key_value = get_icu_value_internal( loc_name , key_name , &result,1 );
|
||||
}
|
||||
if( (strcmp(key_name , LOC_PRIVATE_TAG)==0) ||
|
||||
if( (strcmp(key_name , LOC_PRIVATE_TAG)==0) ||
|
||||
( strcmp(key_name , LOC_VARIANT_TAG)==0) ){
|
||||
if( result > 0 && key_value){
|
||||
/* Tokenize on the "_" or "-" */
|
||||
token = php_strtok_r( key_value , DELIMITER ,&last_ptr);
|
||||
token = php_strtok_r( key_value , DELIMITER ,&last_ptr);
|
||||
if( cur_key_name ){
|
||||
efree( cur_key_name);
|
||||
}
|
||||
cur_key_name = (char*)ecalloc( 25, 25);
|
||||
sprintf( cur_key_name , "%s%d", key_name , cnt++);
|
||||
sprintf( cur_key_name , "%s%d", key_name , cnt++);
|
||||
add_assoc_string( hash_arr, cur_key_name , token ,TRUE );
|
||||
/* tokenize on the "_" or "-" and stop at singleton if any */
|
||||
while( (token = php_strtok_r(NULL , DELIMITER , &last_ptr)) && (strlen(token)>1) ){
|
||||
sprintf( cur_key_name , "%s%d", key_name , cnt++);
|
||||
sprintf( cur_key_name , "%s%d", key_name , cnt++);
|
||||
add_assoc_string( hash_arr, cur_key_name , token , TRUE );
|
||||
}
|
||||
/*
|
||||
@@ -1077,16 +1078,16 @@ static int add_array_entry(const char* loc_name, zval* hash_arr, char* key_name
|
||||
}
|
||||
/*if( key_name != LOC_PRIVATE_TAG && key_value){*/
|
||||
if( key_value){
|
||||
efree(key_value);
|
||||
efree(key_value);
|
||||
}
|
||||
return cur_result;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto static array Locale::parseLocale($locale)
|
||||
/* {{{ proto static array Locale::parseLocale($locale)
|
||||
* parses a locale-id into an array the different parts of it
|
||||
}}} */
|
||||
/* {{{ proto static array parse_locale($locale)
|
||||
/* {{{ proto static array parse_locale($locale)
|
||||
* parses a locale-id into an array the different parts of it
|
||||
*/
|
||||
PHP_FUNCTION(locale_parse)
|
||||
@@ -1144,7 +1145,7 @@ PHP_FUNCTION(locale_get_all_variants)
|
||||
char* saved_ptr = NULL;
|
||||
|
||||
intl_error_reset( NULL TSRMLS_CC );
|
||||
|
||||
|
||||
if(zend_parse_parameters( ZEND_NUM_ARGS() TSRMLS_CC, "s",
|
||||
&loc_name, &loc_name_len ) == FAILURE)
|
||||
{
|
||||
@@ -1162,15 +1163,15 @@ PHP_FUNCTION(locale_get_all_variants)
|
||||
array_init( return_value );
|
||||
|
||||
/* If the locale is grandfathered, stop, no variants */
|
||||
if( findOffset( LOC_GRANDFATHERED , loc_name ) >= 0 ){
|
||||
if( findOffset( LOC_GRANDFATHERED , loc_name ) >= 0 ){
|
||||
/* ("Grandfathered Tag. No variants."); */
|
||||
}
|
||||
else {
|
||||
else {
|
||||
/* Call ICU variant */
|
||||
variant = get_icu_value_internal( loc_name , LOC_VARIANT_TAG , &result ,0);
|
||||
if( result > 0 && variant){
|
||||
/* Tokenize on the "_" or "-" */
|
||||
token = php_strtok_r( variant , DELIMITER , &saved_ptr);
|
||||
token = php_strtok_r( variant , DELIMITER , &saved_ptr);
|
||||
add_next_index_stringl( return_value, token , strlen(token) ,TRUE );
|
||||
/* tokenize on the "_" or "-" and stop at singleton if any */
|
||||
while( (token = php_strtok_r(NULL , DELIMITER, &saved_ptr)) && (strlen(token)>1) ){
|
||||
@@ -1181,7 +1182,7 @@ PHP_FUNCTION(locale_get_all_variants)
|
||||
efree( variant );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
/* }}} */
|
||||
@@ -1220,11 +1221,11 @@ static int strToMatch(const char* str ,char *retstr)
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto static boolean Locale::filterMatches(string $langtag, string $locale[, bool $canonicalize])
|
||||
* Checks if a $langtag filter matches with $locale according to RFC 4647's basic filtering algorithm
|
||||
* Checks if a $langtag filter matches with $locale according to RFC 4647's basic filtering algorithm
|
||||
*/
|
||||
/* }}} */
|
||||
/* {{{ proto boolean locale_filter_matches(string $langtag, string $locale[, bool $canonicalize])
|
||||
* Checks if a $langtag filter matches with $locale according to RFC 4647's basic filtering algorithm
|
||||
* Checks if a $langtag filter matches with $locale according to RFC 4647's basic filtering algorithm
|
||||
*/
|
||||
PHP_FUNCTION(locale_filter_matches)
|
||||
{
|
||||
@@ -1243,13 +1244,13 @@ PHP_FUNCTION(locale_filter_matches)
|
||||
char* cur_lang_tag = NULL;
|
||||
char* cur_loc_range = NULL;
|
||||
|
||||
zend_bool boolCanonical = 0;
|
||||
zend_bool boolCanonical = 0;
|
||||
UErrorCode status = U_ZERO_ERROR;
|
||||
|
||||
intl_error_reset( NULL TSRMLS_CC );
|
||||
|
||||
|
||||
if(zend_parse_parameters( ZEND_NUM_ARGS() TSRMLS_CC, "ss|b",
|
||||
&lang_tag, &lang_tag_len , &loc_range , &loc_range_len ,
|
||||
&lang_tag, &lang_tag_len , &loc_range , &loc_range_len ,
|
||||
&boolCanonical) == FAILURE)
|
||||
{
|
||||
intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR,
|
||||
@@ -1270,7 +1271,7 @@ PHP_FUNCTION(locale_filter_matches)
|
||||
/* canonicalize loc_range */
|
||||
can_loc_range=get_icu_value_internal( loc_range , LOC_CANONICALIZE_TAG , &result , 0);
|
||||
if( result ==0) {
|
||||
intl_error_set( NULL, status,
|
||||
intl_error_set( NULL, status,
|
||||
"locale_filter_matches : unable to canonicalize loc_range" , 0 TSRMLS_CC );
|
||||
RETURN_FALSE;
|
||||
}
|
||||
@@ -1278,7 +1279,7 @@ PHP_FUNCTION(locale_filter_matches)
|
||||
/* canonicalize lang_tag */
|
||||
can_lang_tag = get_icu_value_internal( lang_tag , LOC_CANONICALIZE_TAG , &result , 0);
|
||||
if( result ==0) {
|
||||
intl_error_set( NULL, status,
|
||||
intl_error_set( NULL, status,
|
||||
"locale_filter_matches : unable to canonicalize lang_tag" , 0 TSRMLS_CC );
|
||||
RETURN_FALSE;
|
||||
}
|
||||
@@ -1306,11 +1307,11 @@ PHP_FUNCTION(locale_filter_matches)
|
||||
|
||||
/* check if prefix */
|
||||
token = strstr( cur_lang_tag , cur_loc_range );
|
||||
|
||||
|
||||
if( token && (token==cur_lang_tag) ){
|
||||
/* check if the char. after match is SEPARATOR */
|
||||
chrcheck = token + (strlen(cur_loc_range));
|
||||
if( isIDSeparator(*chrcheck) || isEndOfTag(*chrcheck) ){
|
||||
if( isIDSeparator(*chrcheck) || isEndOfTag(*chrcheck) ){
|
||||
if( cur_lang_tag){
|
||||
efree( cur_lang_tag );
|
||||
}
|
||||
@@ -1346,7 +1347,7 @@ PHP_FUNCTION(locale_filter_matches)
|
||||
else{
|
||||
/* Convert to lower case for case-insensitive comparison */
|
||||
cur_lang_tag = ecalloc( 1, strlen(lang_tag ) + 1);
|
||||
|
||||
|
||||
result = strToMatch( lang_tag , cur_lang_tag);
|
||||
if( result == 0) {
|
||||
efree( cur_lang_tag );
|
||||
@@ -1362,11 +1363,11 @@ PHP_FUNCTION(locale_filter_matches)
|
||||
|
||||
/* check if prefix */
|
||||
token = strstr( cur_lang_tag , cur_loc_range );
|
||||
|
||||
|
||||
if( token && (token==cur_lang_tag) ){
|
||||
/* check if the char. after match is SEPARATOR */
|
||||
chrcheck = token + (strlen(cur_loc_range));
|
||||
if( isIDSeparator(*chrcheck) || isEndOfTag(*chrcheck) ){
|
||||
if( isIDSeparator(*chrcheck) || isEndOfTag(*chrcheck) ){
|
||||
if( cur_lang_tag){
|
||||
efree( cur_lang_tag );
|
||||
}
|
||||
@@ -1393,7 +1394,7 @@ PHP_FUNCTION(locale_filter_matches)
|
||||
static void array_cleanup( char* arr[] , int arr_size)
|
||||
{
|
||||
int i=0;
|
||||
for( i=0; i< arr_size; i++ ){
|
||||
for( i=0; i< arr_size; i++ ){
|
||||
if( arr[i*2] ){
|
||||
efree( arr[i*2]);
|
||||
}
|
||||
@@ -1403,7 +1404,7 @@ static void array_cleanup( char* arr[] , int arr_size)
|
||||
|
||||
#define LOOKUP_CLEAN_RETURN(value) array_cleanup(cur_arr, cur_arr_len); return (value)
|
||||
/* {{{
|
||||
* returns the lookup result to lookup_loc_range_src_php
|
||||
* returns the lookup result to lookup_loc_range_src_php
|
||||
* internal function
|
||||
*/
|
||||
static char* lookup_loc_range(const char* loc_range, HashTable* hash_arr, int canonicalize TSRMLS_DC)
|
||||
@@ -1427,7 +1428,7 @@ static char* lookup_loc_range(const char* loc_range, HashTable* hash_arr, int ca
|
||||
for(zend_hash_internal_pointer_reset(hash_arr);
|
||||
zend_hash_has_more_elements(hash_arr) == SUCCESS;
|
||||
zend_hash_move_forward(hash_arr)) {
|
||||
|
||||
|
||||
if (zend_hash_get_current_data(hash_arr, (void**)&ele_value) == FAILURE) {
|
||||
/* Should never actually fail since the key is known to exist.*/
|
||||
continue;
|
||||
@@ -1436,7 +1437,7 @@ static char* lookup_loc_range(const char* loc_range, HashTable* hash_arr, int ca
|
||||
/* element value is not a string */
|
||||
intl_error_set(NULL, U_ILLEGAL_ARGUMENT_ERROR, "lookup_loc_range: locale array element is not a string", 0 TSRMLS_CC);
|
||||
LOOKUP_CLEAN_RETURN(NULL);
|
||||
}
|
||||
}
|
||||
cur_arr[cur_arr_len*2] = estrndup(Z_STRVAL_PP(ele_value), Z_STRLEN_PP(ele_value));
|
||||
result = strToMatch(Z_STRVAL_PP(ele_value), cur_arr[cur_arr_len*2]);
|
||||
if(result == 0) {
|
||||
@@ -1444,12 +1445,12 @@ static char* lookup_loc_range(const char* loc_range, HashTable* hash_arr, int ca
|
||||
LOOKUP_CLEAN_RETURN(NULL);
|
||||
}
|
||||
cur_arr[cur_arr_len*2+1] = Z_STRVAL_PP(ele_value);
|
||||
cur_arr_len++ ;
|
||||
cur_arr_len++ ;
|
||||
} /* end of for */
|
||||
|
||||
/* Canonicalize array elements */
|
||||
if(canonicalize) {
|
||||
for(i=0; i<cur_arr_len; i++) {
|
||||
for(i=0; i<cur_arr_len; i++) {
|
||||
lang_tag = get_icu_value_internal(cur_arr[i*2], LOC_CANONICALIZE_TAG, &result, 0);
|
||||
if(result != 1 || lang_tag == NULL || !lang_tag[0]) {
|
||||
if(lang_tag) {
|
||||
@@ -1459,7 +1460,7 @@ static char* lookup_loc_range(const char* loc_range, HashTable* hash_arr, int ca
|
||||
LOOKUP_CLEAN_RETURN(NULL);
|
||||
}
|
||||
cur_arr[i*2] = erealloc(cur_arr[i*2], strlen(lang_tag)+1);
|
||||
result = strToMatch(lang_tag, cur_arr[i*2]);
|
||||
result = strToMatch(lang_tag, cur_arr[i*2]);
|
||||
efree(lang_tag);
|
||||
if(result == 0) {
|
||||
intl_error_set(NULL, U_ILLEGAL_ARGUMENT_ERROR, "lookup_loc_range: unable to canonicalize lang_tag" , 0 TSRMLS_CC);
|
||||
@@ -1482,11 +1483,11 @@ static char* lookup_loc_range(const char* loc_range, HashTable* hash_arr, int ca
|
||||
} else {
|
||||
loc_range = can_loc_range;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
cur_loc_range = ecalloc(1, strlen(loc_range)+1);
|
||||
/* convert to lower and replace hyphens */
|
||||
result = strToMatch(loc_range, cur_loc_range);
|
||||
result = strToMatch(loc_range, cur_loc_range);
|
||||
if(can_loc_range) {
|
||||
efree(can_loc_range);
|
||||
}
|
||||
@@ -1498,8 +1499,8 @@ static char* lookup_loc_range(const char* loc_range, HashTable* hash_arr, int ca
|
||||
/* Lookup for the lang_tag match */
|
||||
saved_pos = strlen(cur_loc_range);
|
||||
while(saved_pos > 0) {
|
||||
for(i=0; i< cur_arr_len; i++){
|
||||
if(cur_arr[i*2] != NULL && strlen(cur_arr[i*2]) == saved_pos && strncmp(cur_loc_range, cur_arr[i*2], saved_pos) == 0) {
|
||||
for(i=0; i< cur_arr_len; i++){
|
||||
if(cur_arr[i*2] != NULL && strlen(cur_arr[i*2]) == saved_pos && strncmp(cur_loc_range, cur_arr[i*2], saved_pos) == 0) {
|
||||
/* Match found */
|
||||
return_value = estrdup(canonicalize?cur_arr[i*2]:cur_arr[i*2+1]);
|
||||
efree(cur_loc_range);
|
||||
@@ -1515,14 +1516,14 @@ static char* lookup_loc_range(const char* loc_range, HashTable* hash_arr, int ca
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto string Locale::lookup(array $langtag, string $locale[, bool $canonicalize[, string $default = null]])
|
||||
/* {{{ proto string Locale::lookup(array $langtag, string $locale[, bool $canonicalize[, string $default = null]])
|
||||
* Searchs the items in $langtag for the best match to the language
|
||||
* range
|
||||
* range
|
||||
*/
|
||||
/* }}} */
|
||||
/* {{{ proto string locale_lookup(array $langtag, string $locale[, bool $canonicalize[, string $default = null]])
|
||||
* Searchs the items in $langtag for the best match to the language
|
||||
* range
|
||||
* range
|
||||
*/
|
||||
PHP_FUNCTION(locale_lookup)
|
||||
{
|
||||
@@ -1552,8 +1553,8 @@ PHP_FUNCTION(locale_lookup)
|
||||
|
||||
if( !hash_arr || zend_hash_num_elements( hash_arr ) == 0 ) {
|
||||
RETURN_EMPTY_STRING();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
result = lookup_loc_range(loc_range, hash_arr, boolCanonical TSRMLS_CC);
|
||||
if(result == NULL || result[0] == '\0') {
|
||||
if( fallback_loc ) {
|
||||
@@ -1590,10 +1591,28 @@ PHP_FUNCTION(locale_accept_from_http)
|
||||
"locale_accept_from_http: unable to parse input parameters", 0 TSRMLS_CC );
|
||||
RETURN_FALSE;
|
||||
}
|
||||
|
||||
if(http_accept_len > ULOC_FULLNAME_CAPACITY) {
|
||||
/* check each fragment, if any bigger than capacity, can't do it due to bug #72533 */
|
||||
char *start = http_accept;
|
||||
char *end;
|
||||
size_t len;
|
||||
do {
|
||||
end = strchr(start, ',');
|
||||
len = end ? end-start : http_accept_len-(start-http_accept);
|
||||
if(len > ULOC_FULLNAME_CAPACITY) {
|
||||
intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR,
|
||||
"locale_accept_from_http: locale string too long", 0 TSRMLS_CC );
|
||||
RETURN_FALSE;
|
||||
}
|
||||
if(end) {
|
||||
start = end+1;
|
||||
}
|
||||
} while(end != NULL);
|
||||
}
|
||||
|
||||
available = ures_openAvailableLocales(NULL, &status);
|
||||
INTL_CHECK_STATUS(status, "locale_accept_from_http: failed to retrieve locale list");
|
||||
len = uloc_acceptLanguageFromHTTP(resultLocale, INTL_MAX_LOCALE_LEN,
|
||||
len = uloc_acceptLanguageFromHTTP(resultLocale, INTL_MAX_LOCALE_LEN,
|
||||
&outResult, http_accept, available, &status);
|
||||
uenum_close(available);
|
||||
INTL_CHECK_STATUS(status, "locale_accept_from_http: failed to find acceptable locale");
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
--TEST--
|
||||
Bug #72061: Out-of-bounds reads in zif_grapheme_stripos with negative offset
|
||||
--SKIPIF--
|
||||
<?php if( !extension_loaded( 'intl' ) ) print 'skip'; ?>
|
||||
--FILE--
|
||||
<?php
|
||||
|
||||
var_dump(grapheme_stripos(str_repeat("ABCD", 16384), "A", -201));
|
||||
var_dump(grapheme_strpos(str_repeat("ABCD", 16384), "A", -201));
|
||||
?>
|
||||
DONE
|
||||
--EXPECT--
|
||||
int(65336)
|
||||
int(65336)
|
||||
DONE
|
||||
@@ -0,0 +1,14 @@
|
||||
--TEST--
|
||||
Bug #72241: get_icu_value_internal out-of-bounds read
|
||||
--SKIPIF--
|
||||
<?php if( !extension_loaded( 'intl' ) ) print 'skip'; ?>
|
||||
--FILE--
|
||||
<?php
|
||||
$var1=str_repeat("A", 1000);
|
||||
$out = locale_get_primary_language($var1);
|
||||
echo strlen($out) . PHP_EOL;
|
||||
echo unpack('H*', $out)[1] . PHP_EOL;
|
||||
--EXPECT--
|
||||
1000
|
||||
61616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161
|
||||
|
||||
@@ -0,0 +1,30 @@
|
||||
--TEST--
|
||||
Bug #72533 (locale_accept_from_http out-of-bounds access)
|
||||
--SKIPIF--
|
||||
<?php if( !extension_loaded( 'intl' ) ) print 'skip'; ?>
|
||||
--FILE--
|
||||
<?php
|
||||
|
||||
function ut_main()
|
||||
{
|
||||
$ret = var_export(ut_loc_accept_http(str_repeat('x', 256)), true);
|
||||
$ret .= "\n";
|
||||
if(intl_is_failure(intl_get_error_code())) {
|
||||
$ret .= var_export(intl_get_error_message(), true);
|
||||
}
|
||||
$ret .= "\n";
|
||||
$ret .= var_export(ut_loc_accept_http(str_repeat('en,', 256)), true);
|
||||
$ret .= "\n";
|
||||
if(intl_is_failure(intl_get_error_code())) {
|
||||
$ret .= var_export(intl_get_error_message(), true);
|
||||
}
|
||||
return $ret;
|
||||
}
|
||||
|
||||
include_once( 'ut_common.inc' );
|
||||
ut_run();
|
||||
?>
|
||||
--EXPECTF--
|
||||
false
|
||||
'locale_accept_from_http: locale string too long: U_ILLEGAL_ARGUMENT_ERROR'
|
||||
'en'
|
||||
@@ -1544,3 +1544,5 @@ xmlXPtrNewRangePointNode
|
||||
xmlXPtrNewRangePoints
|
||||
xmlXPtrRangeToFunction
|
||||
xmlXPtrWrapLocationSet
|
||||
xmlBufContent
|
||||
xmlBufUse
|
||||
@@ -72,7 +72,7 @@
|
||||
*
|
||||
*/
|
||||
|
||||
/*
|
||||
/*
|
||||
* Unicode support
|
||||
*
|
||||
* Portions copyright (c) 1999,2000,2001 by the PHP3 internationalization team.
|
||||
@@ -137,7 +137,7 @@ mbfl_buffer_converter_new(
|
||||
mbfl_buffer_converter *
|
||||
mbfl_buffer_converter_new2(
|
||||
const mbfl_encoding *from,
|
||||
const mbfl_encoding *to,
|
||||
const mbfl_encoding *to,
|
||||
int buf_initsz)
|
||||
{
|
||||
mbfl_buffer_converter *convd;
|
||||
@@ -339,7 +339,7 @@ mbfl_buffer_converter_result(mbfl_buffer_converter *convd, mbfl_string *result)
|
||||
}
|
||||
|
||||
mbfl_string *
|
||||
mbfl_buffer_converter_feed_result(mbfl_buffer_converter *convd, mbfl_string *string,
|
||||
mbfl_buffer_converter_feed_result(mbfl_buffer_converter *convd, mbfl_string *string,
|
||||
mbfl_string *result)
|
||||
{
|
||||
if (convd == NULL || string == NULL || result == NULL) {
|
||||
@@ -535,7 +535,7 @@ const mbfl_encoding *mbfl_encoding_detector_judge2(mbfl_encoding_detector *ident
|
||||
}
|
||||
n--;
|
||||
}
|
||||
|
||||
|
||||
/* fallback judge */
|
||||
if (!encoding) {
|
||||
n = identd->filter_list_size - 1;
|
||||
@@ -702,7 +702,7 @@ mbfl_identify_encoding(mbfl_string *string, enum mbfl_no_encoding *elist, int el
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* cleanup */
|
||||
/* dtors should be called in reverse order */
|
||||
i = num; while (--i >= 0) {
|
||||
@@ -785,7 +785,7 @@ mbfl_identify_encoding2(mbfl_string *string, const mbfl_encoding **elist, int el
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* cleanup */
|
||||
/* dtors should be called in reverse order */
|
||||
i = num; while (--i >= 0) {
|
||||
@@ -844,7 +844,7 @@ mbfl_strlen(mbfl_string *string)
|
||||
} else {
|
||||
/* wchar filter */
|
||||
mbfl_convert_filter *filter = mbfl_convert_filter_new(
|
||||
string->no_encoding,
|
||||
string->no_encoding,
|
||||
mbfl_no_encoding_wchar,
|
||||
filter_count_output, 0, &len);
|
||||
if (filter == NULL) {
|
||||
@@ -865,7 +865,7 @@ mbfl_strlen(mbfl_string *string)
|
||||
return len;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* strpos
|
||||
*/
|
||||
@@ -931,7 +931,7 @@ retry:
|
||||
/*
|
||||
* oddlen
|
||||
*/
|
||||
int
|
||||
int
|
||||
mbfl_oddlen(mbfl_string *string)
|
||||
{
|
||||
int len, n, m, k;
|
||||
@@ -1071,7 +1071,7 @@ mbfl_strpos(
|
||||
++result;
|
||||
} else if ((c & 0xc0) != 0x80) {
|
||||
++result;
|
||||
}
|
||||
}
|
||||
}
|
||||
goto out;
|
||||
}
|
||||
@@ -1116,7 +1116,7 @@ mbfl_strpos(
|
||||
qe = needle_u8_val + needle_u8_len;
|
||||
if (offset < 0) {
|
||||
if (-offset > needle_len) {
|
||||
offset += needle_len;
|
||||
offset += needle_len;
|
||||
while (offset < 0) {
|
||||
unsigned char c;
|
||||
if (p <= e) {
|
||||
@@ -1158,7 +1158,7 @@ mbfl_strpos(
|
||||
++result;
|
||||
} else if ((c & 0xc0) != 0x80) {
|
||||
++result;
|
||||
}
|
||||
}
|
||||
}
|
||||
goto out;
|
||||
}
|
||||
@@ -1501,7 +1501,7 @@ mbfl_strcut(
|
||||
if (encoding->flag & (MBFL_ENCTYPE_WCS2BE | MBFL_ENCTYPE_WCS2LE)) {
|
||||
from &= -2;
|
||||
|
||||
if (from + length >= string->len) {
|
||||
if (length >= string->len - from) {
|
||||
length = string->len - from;
|
||||
}
|
||||
|
||||
@@ -1510,14 +1510,14 @@ mbfl_strcut(
|
||||
} else if (encoding->flag & (MBFL_ENCTYPE_WCS4BE | MBFL_ENCTYPE_WCS4LE)) {
|
||||
from &= -4;
|
||||
|
||||
if (from + length >= string->len) {
|
||||
if (length >= string->len - from) {
|
||||
length = string->len - from;
|
||||
}
|
||||
|
||||
start = string->val + from;
|
||||
end = start + (length & -4);
|
||||
} else if ((encoding->flag & MBFL_ENCTYPE_SBCS)) {
|
||||
if (from + length >= string->len) {
|
||||
if (length >= string->len - from) {
|
||||
length = string->len - from;
|
||||
}
|
||||
|
||||
@@ -1539,7 +1539,7 @@ mbfl_strcut(
|
||||
start = p;
|
||||
|
||||
/* search end position */
|
||||
if ((start - string->val) + length >= (int)string->len) {
|
||||
if (length >= (int)string->len - (start - string->val)) {
|
||||
end = string->val + string->len;
|
||||
} else {
|
||||
for (q = p + length; p < q; p += (m = mbtab[*p]));
|
||||
@@ -2024,7 +2024,7 @@ mbfl_ja_jp_hantozen(
|
||||
mbfl_no_encoding_wchar,
|
||||
(int(*)(int, void*))next_filter->filter_function,
|
||||
(int(*)(void*))next_filter->filter_flush,
|
||||
next_filter);
|
||||
next_filter);
|
||||
if (encoder == NULL) {
|
||||
goto out;
|
||||
}
|
||||
|
||||
+32
-33
@@ -32,7 +32,7 @@
|
||||
#include "ext/standard/info.h"
|
||||
#include "php_mbregex.h"
|
||||
#include "mbstring.h"
|
||||
|
||||
|
||||
#include "php_onig_compat.h" /* must come prior to the oniguruma header */
|
||||
#include <oniguruma.h>
|
||||
#undef UChar
|
||||
@@ -55,7 +55,7 @@ struct _zend_mb_regex_globals {
|
||||
#define MBREX(g) (MBSTRG(mb_regex_globals)->g)
|
||||
|
||||
/* {{{ static void php_mb_regex_free_cache() */
|
||||
static void php_mb_regex_free_cache(php_mb_regex_t **pre)
|
||||
static void php_mb_regex_free_cache(php_mb_regex_t **pre)
|
||||
{
|
||||
onig_free(*pre);
|
||||
}
|
||||
@@ -78,7 +78,7 @@ static int _php_mb_regex_globals_ctor(zend_mb_regex_globals *pglobals TSRMLS_DC)
|
||||
/* }}} */
|
||||
|
||||
/* {{{ _php_mb_regex_globals_dtor */
|
||||
static void _php_mb_regex_globals_dtor(zend_mb_regex_globals *pglobals TSRMLS_DC)
|
||||
static void _php_mb_regex_globals_dtor(zend_mb_regex_globals *pglobals TSRMLS_DC)
|
||||
{
|
||||
zend_hash_destroy(&pglobals->ht_rc);
|
||||
}
|
||||
@@ -466,7 +466,7 @@ static php_mb_regex_t *php_mbregex_compile_pattern(const char *pattern, int patl
|
||||
retval = *rc;
|
||||
}
|
||||
out:
|
||||
return retval;
|
||||
return retval;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
@@ -483,7 +483,7 @@ static size_t _php_mb_regex_get_option_string(char *str, size_t len, OnigOptionT
|
||||
--len_left;
|
||||
*(p++) = 'i';
|
||||
}
|
||||
++len_req;
|
||||
++len_req;
|
||||
}
|
||||
|
||||
if ((option & ONIG_OPTION_EXTEND) != 0) {
|
||||
@@ -491,7 +491,7 @@ static size_t _php_mb_regex_get_option_string(char *str, size_t len, OnigOptionT
|
||||
--len_left;
|
||||
*(p++) = 'x';
|
||||
}
|
||||
++len_req;
|
||||
++len_req;
|
||||
}
|
||||
|
||||
if ((option & (ONIG_OPTION_MULTILINE | ONIG_OPTION_SINGLELINE)) ==
|
||||
@@ -500,14 +500,14 @@ static size_t _php_mb_regex_get_option_string(char *str, size_t len, OnigOptionT
|
||||
--len_left;
|
||||
*(p++) = 'p';
|
||||
}
|
||||
++len_req;
|
||||
++len_req;
|
||||
} else {
|
||||
if ((option & ONIG_OPTION_MULTILINE) != 0) {
|
||||
if (len_left > 0) {
|
||||
--len_left;
|
||||
*(p++) = 'm';
|
||||
}
|
||||
++len_req;
|
||||
++len_req;
|
||||
}
|
||||
|
||||
if ((option & ONIG_OPTION_SINGLELINE) != 0) {
|
||||
@@ -515,22 +515,22 @@ static size_t _php_mb_regex_get_option_string(char *str, size_t len, OnigOptionT
|
||||
--len_left;
|
||||
*(p++) = 's';
|
||||
}
|
||||
++len_req;
|
||||
++len_req;
|
||||
}
|
||||
}
|
||||
}
|
||||
if ((option & ONIG_OPTION_FIND_LONGEST) != 0) {
|
||||
if (len_left > 0) {
|
||||
--len_left;
|
||||
*(p++) = 'l';
|
||||
}
|
||||
++len_req;
|
||||
++len_req;
|
||||
}
|
||||
if ((option & ONIG_OPTION_FIND_NOT_EMPTY) != 0) {
|
||||
if (len_left > 0) {
|
||||
--len_left;
|
||||
*(p++) = 'n';
|
||||
}
|
||||
++len_req;
|
||||
++len_req;
|
||||
}
|
||||
|
||||
c = 0;
|
||||
@@ -566,7 +566,7 @@ static size_t _php_mb_regex_get_option_string(char *str, size_t len, OnigOptionT
|
||||
--len_left;
|
||||
*(p++) = '\0';
|
||||
}
|
||||
++len_req;
|
||||
++len_req;
|
||||
if (len < len_req) {
|
||||
return len_req;
|
||||
}
|
||||
@@ -577,11 +577,11 @@ static size_t _php_mb_regex_get_option_string(char *str, size_t len, OnigOptionT
|
||||
|
||||
/* {{{ _php_mb_regex_init_options */
|
||||
static void
|
||||
_php_mb_regex_init_options(const char *parg, int narg, OnigOptionType *option, OnigSyntaxType **syntax, int *eval)
|
||||
_php_mb_regex_init_options(const char *parg, int narg, OnigOptionType *option, OnigSyntaxType **syntax, int *eval)
|
||||
{
|
||||
int n;
|
||||
char c;
|
||||
int optm = 0;
|
||||
int optm = 0;
|
||||
|
||||
*syntax = ONIG_SYNTAX_RUBY;
|
||||
|
||||
@@ -636,13 +636,13 @@ _php_mb_regex_init_options(const char *parg, int narg, OnigOptionType *option, O
|
||||
*syntax = ONIG_SYNTAX_POSIX_EXTENDED;
|
||||
break;
|
||||
case 'e':
|
||||
if (eval != NULL) *eval = 1;
|
||||
if (eval != NULL) *eval = 1;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (option != NULL) *option|=optm;
|
||||
if (option != NULL) *option|=optm;
|
||||
}
|
||||
}
|
||||
/* }}} */
|
||||
@@ -860,11 +860,11 @@ static void _php_mb_regex_ereg_replace_exec(INTERNAL_FUNCTION_PARAMETERS, OnigOp
|
||||
} else {
|
||||
/* FIXME: this code is not multibyte aware! */
|
||||
convert_to_long_ex(arg_pattern_zval);
|
||||
pat_buf[0] = (char)Z_LVAL_PP(arg_pattern_zval);
|
||||
pat_buf[0] = (char)Z_LVAL_PP(arg_pattern_zval);
|
||||
pat_buf[1] = '\0';
|
||||
|
||||
arg_pattern = pat_buf;
|
||||
arg_pattern_len = 1;
|
||||
arg_pattern_len = 1;
|
||||
}
|
||||
/* create regex pattern buffer */
|
||||
re = php_mbregex_compile_pattern(arg_pattern, arg_pattern_len, options, MBREX(current_mbctype), syntax TSRMLS_CC);
|
||||
@@ -934,7 +934,7 @@ static void _php_mb_regex_ereg_replace_exec(INTERNAL_FUNCTION_PARAMETERS, OnigOp
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (eval) {
|
||||
zval v;
|
||||
/* null terminate buffer */
|
||||
@@ -953,32 +953,31 @@ static void _php_mb_regex_ereg_replace_exec(INTERNAL_FUNCTION_PARAMETERS, OnigOp
|
||||
eval_buf.len = 0;
|
||||
zval_dtor(&v);
|
||||
} else if (is_callable) {
|
||||
zval *retval_ptr;
|
||||
zval *retval_ptr = NULL;
|
||||
zval **args[1];
|
||||
zval *subpats;
|
||||
int i;
|
||||
|
||||
|
||||
MAKE_STD_ZVAL(subpats);
|
||||
array_init(subpats);
|
||||
|
||||
|
||||
for (i = 0; i < regs->num_regs; i++) {
|
||||
add_next_index_stringl(subpats, string + regs->beg[i], regs->end[i] - regs->beg[i], 1);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
args[0] = &subpats;
|
||||
/* null terminate buffer */
|
||||
smart_str_0(&eval_buf);
|
||||
|
||||
|
||||
arg_replace_fci.param_count = 1;
|
||||
arg_replace_fci.params = args;
|
||||
arg_replace_fci.retval_ptr_ptr = &retval_ptr;
|
||||
if (zend_call_function(&arg_replace_fci, &arg_replace_fci_cache TSRMLS_CC) == SUCCESS && arg_replace_fci.retval_ptr_ptr) {
|
||||
if (zend_call_function(&arg_replace_fci, &arg_replace_fci_cache TSRMLS_CC) == SUCCESS && arg_replace_fci.retval_ptr_ptr && retval_ptr) {
|
||||
convert_to_string_ex(&retval_ptr);
|
||||
smart_str_appendl(&out_buf, Z_STRVAL_P(retval_ptr), Z_STRLEN_P(retval_ptr));
|
||||
eval_buf.len = 0;
|
||||
zval_ptr_dtor(&retval_ptr);
|
||||
} else {
|
||||
efree(description);
|
||||
if (!EG(exception)) {
|
||||
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to call custom replacement function");
|
||||
}
|
||||
@@ -991,7 +990,7 @@ static void _php_mb_regex_ereg_replace_exec(INTERNAL_FUNCTION_PARAMETERS, OnigOp
|
||||
pos = (OnigUChar *)string + n;
|
||||
} else {
|
||||
if (pos < string_lim) {
|
||||
smart_str_appendl(&out_buf, pos, 1);
|
||||
smart_str_appendl(&out_buf, pos, 1);
|
||||
}
|
||||
pos++;
|
||||
}
|
||||
@@ -1013,7 +1012,7 @@ static void _php_mb_regex_ereg_replace_exec(INTERNAL_FUNCTION_PARAMETERS, OnigOp
|
||||
smart_str_free(&eval_buf);
|
||||
|
||||
if (err <= -2) {
|
||||
smart_str_free(&out_buf);
|
||||
smart_str_free(&out_buf);
|
||||
RETVAL_FALSE;
|
||||
} else {
|
||||
smart_str_appendc(&out_buf, '\0');
|
||||
@@ -1063,7 +1062,7 @@ PHP_FUNCTION(mb_split)
|
||||
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss|l", &arg_pattern, &arg_pattern_len, &string, &string_len, &count) == FAILURE) {
|
||||
RETURN_FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
if (count > 0) {
|
||||
count--;
|
||||
@@ -1317,7 +1316,7 @@ PHP_FUNCTION(mb_ereg_search_init)
|
||||
if (zend_parse_parameters(argc TSRMLS_CC, "z|ss", &arg_str, &arg_pattern, &arg_pattern_len, &arg_options, &arg_options_len) == FAILURE) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if (argc > 1 && arg_pattern_len == 0) {
|
||||
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Empty pattern");
|
||||
RETURN_FALSE;
|
||||
@@ -1416,7 +1415,7 @@ PHP_FUNCTION(mb_ereg_search_setpos)
|
||||
/* }}} */
|
||||
|
||||
/* {{{ php_mb_regex_set_options */
|
||||
static void _php_mb_regex_set_options(OnigOptionType options, OnigSyntaxType *syntax, OnigOptionType *prev_options, OnigSyntaxType **prev_syntax TSRMLS_DC)
|
||||
static void _php_mb_regex_set_options(OnigOptionType options, OnigSyntaxType *syntax, OnigOptionType *prev_options, OnigSyntaxType **prev_syntax TSRMLS_DC)
|
||||
{
|
||||
if (prev_options != NULL) {
|
||||
*prev_options = MBREX(regex_default_options);
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
--TEST--
|
||||
Bug #72402: _php_mb_regex_ereg_replace_exec - double free
|
||||
--SKIPIF--
|
||||
<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
|
||||
--FILE--
|
||||
<?php
|
||||
function throwit() {
|
||||
throw new Exception('it');
|
||||
}
|
||||
$var10 = "throwit";
|
||||
try {
|
||||
$var14 = mb_ereg_replace_callback("", $var10, "");
|
||||
} catch(Exception $e) {}
|
||||
?>
|
||||
DONE
|
||||
--EXPECT--
|
||||
DONE
|
||||
+50
-42
@@ -44,7 +44,7 @@
|
||||
|
||||
static int le_mcrypt;
|
||||
|
||||
typedef struct _php_mcrypt {
|
||||
typedef struct _php_mcrypt {
|
||||
MCRYPT td;
|
||||
zend_bool init;
|
||||
} php_mcrypt;
|
||||
@@ -292,7 +292,7 @@ ZEND_DECLARE_MODULE_GLOBALS(mcrypt)
|
||||
|
||||
zend_module_entry mcrypt_module_entry = {
|
||||
STANDARD_MODULE_HEADER,
|
||||
"mcrypt",
|
||||
"mcrypt",
|
||||
mcrypt_functions,
|
||||
PHP_MINIT(mcrypt), PHP_MSHUTDOWN(mcrypt),
|
||||
NULL, NULL,
|
||||
@@ -376,7 +376,7 @@ ZEND_GET_MODULE(mcrypt)
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &mcryptind) == FAILURE) { \
|
||||
return; \
|
||||
} \
|
||||
ZEND_FETCH_RESOURCE (pm, php_mcrypt *, &mcryptind, -1, "MCrypt", le_mcrypt);
|
||||
ZEND_FETCH_RESOURCE (pm, php_mcrypt *, &mcryptind, -1, "MCrypt", le_mcrypt);
|
||||
|
||||
#define MCRYPT_GET_MODE_DIR_ARGS(DIRECTORY) \
|
||||
char *dir = NULL; \
|
||||
@@ -407,7 +407,7 @@ PHP_INI_END()
|
||||
static void php_mcrypt_module_dtor(zend_rsrc_list_entry *rsrc TSRMLS_DC) /* {{{ */
|
||||
{
|
||||
php_mcrypt *pm = (php_mcrypt *) rsrc->ptr;
|
||||
if (pm) {
|
||||
if (pm) {
|
||||
mcrypt_generic_deinit(pm->td);
|
||||
mcrypt_module_close(pm->td);
|
||||
efree(pm);
|
||||
@@ -548,7 +548,7 @@ PHP_MINFO_FUNCTION(mcrypt) /* {{{ */
|
||||
smart_str_free(&tmp1);
|
||||
smart_str_free(&tmp2);
|
||||
php_info_print_table_end();
|
||||
|
||||
|
||||
DISPLAY_INI_ENTRIES();
|
||||
}
|
||||
/* }}} */
|
||||
@@ -563,17 +563,17 @@ PHP_FUNCTION(mcrypt_module_open)
|
||||
int mode_len, mode_dir_len;
|
||||
MCRYPT td;
|
||||
php_mcrypt *pm;
|
||||
|
||||
|
||||
if (zend_parse_parameters (ZEND_NUM_ARGS() TSRMLS_CC, "ssss",
|
||||
&cipher, &cipher_len, &cipher_dir, &cipher_dir_len,
|
||||
&mode, &mode_len, &mode_dir, &mode_dir_len)) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
td = mcrypt_module_open (
|
||||
cipher,
|
||||
cipher_dir_len > 0 ? cipher_dir : MCG(algorithms_dir),
|
||||
mode,
|
||||
mode,
|
||||
mode_dir_len > 0 ? mode_dir : MCG(modes_dir)
|
||||
);
|
||||
|
||||
@@ -600,7 +600,7 @@ PHP_FUNCTION(mcrypt_generic_init)
|
||||
int max_key_size, key_size, iv_size;
|
||||
php_mcrypt *pm;
|
||||
int result = 0;
|
||||
|
||||
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rss", &mcryptind, &key, &key_len, &iv, &iv_len) == FAILURE) {
|
||||
return;
|
||||
}
|
||||
@@ -679,7 +679,7 @@ PHP_FUNCTION(mcrypt_generic)
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &mcryptind, &data, &data_len) == FAILURE) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
ZEND_FETCH_RESOURCE(pm, php_mcrypt *, &mcryptind, -1, "MCrypt", le_mcrypt);
|
||||
PHP_MCRYPT_INIT_CHECK
|
||||
|
||||
@@ -692,6 +692,10 @@ PHP_FUNCTION(mcrypt_generic)
|
||||
if (mcrypt_enc_is_block_mode(pm->td) == 1) { /* It's a block algorithm */
|
||||
block_size = mcrypt_enc_get_block_size(pm->td);
|
||||
data_size = (((data_len - 1) / block_size) + 1) * block_size;
|
||||
if (data_size <= 0) {
|
||||
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Integer overflow in data size");
|
||||
RETURN_FALSE;
|
||||
}
|
||||
data_s = emalloc(data_size + 1);
|
||||
memset(data_s, 0, data_size);
|
||||
memcpy(data_s, data, data_len);
|
||||
@@ -701,7 +705,7 @@ PHP_FUNCTION(mcrypt_generic)
|
||||
memset(data_s, 0, data_size);
|
||||
memcpy(data_s, data, data_len);
|
||||
}
|
||||
|
||||
|
||||
mcrypt_generic(pm->td, data_s, data_size);
|
||||
data_s[data_size] = '\0';
|
||||
|
||||
@@ -720,11 +724,11 @@ PHP_FUNCTION(mdecrypt_generic)
|
||||
php_mcrypt *pm;
|
||||
char* data_s;
|
||||
int block_size, data_size;
|
||||
|
||||
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &mcryptind, &data, &data_len) == FAILURE) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
ZEND_FETCH_RESOURCE(pm, php_mcrypt * , &mcryptind, -1, "MCrypt", le_mcrypt);
|
||||
PHP_MCRYPT_INIT_CHECK
|
||||
|
||||
@@ -737,6 +741,10 @@ PHP_FUNCTION(mdecrypt_generic)
|
||||
if (mcrypt_enc_is_block_mode(pm->td) == 1) { /* It's a block algorithm */
|
||||
block_size = mcrypt_enc_get_block_size(pm->td);
|
||||
data_size = (((data_len - 1) / block_size) + 1) * block_size;
|
||||
if (data_size <= 0) {
|
||||
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Integer overflow in data size");
|
||||
RETURN_FALSE;
|
||||
}
|
||||
data_s = emalloc(data_size + 1);
|
||||
memset(data_s, 0, data_size);
|
||||
memcpy(data_s, data, data_len);
|
||||
@@ -746,7 +754,7 @@ PHP_FUNCTION(mdecrypt_generic)
|
||||
memset(data_s, 0, data_size);
|
||||
memcpy(data_s, data, data_len);
|
||||
}
|
||||
|
||||
|
||||
mdecrypt_generic(pm->td, data_s, data_size);
|
||||
|
||||
RETVAL_STRINGL(data_s, data_size, 1);
|
||||
@@ -760,7 +768,7 @@ PHP_FUNCTION(mcrypt_enc_get_supported_key_sizes)
|
||||
{
|
||||
int i, count = 0;
|
||||
int *key_sizes;
|
||||
|
||||
|
||||
MCRYPT_GET_TD_ARG
|
||||
array_init(return_value);
|
||||
|
||||
@@ -829,7 +837,7 @@ PHP_FUNCTION(mcrypt_enc_is_block_algorithm)
|
||||
MCRYPT_GET_TD_ARG
|
||||
|
||||
if (mcrypt_enc_is_block_algorithm(pm->td) == 1) {
|
||||
RETURN_TRUE
|
||||
RETURN_TRUE
|
||||
} else {
|
||||
RETURN_FALSE
|
||||
}
|
||||
@@ -908,7 +916,7 @@ PHP_FUNCTION(mcrypt_enc_get_modes_name)
|
||||
PHP_FUNCTION(mcrypt_module_self_test)
|
||||
{
|
||||
MCRYPT_GET_MODE_DIR_ARGS(algorithms_dir);
|
||||
|
||||
|
||||
if (mcrypt_module_self_test(module, dir) == 0) {
|
||||
RETURN_TRUE;
|
||||
} else {
|
||||
@@ -922,7 +930,7 @@ PHP_FUNCTION(mcrypt_module_self_test)
|
||||
PHP_FUNCTION(mcrypt_module_is_block_algorithm_mode)
|
||||
{
|
||||
MCRYPT_GET_MODE_DIR_ARGS(modes_dir)
|
||||
|
||||
|
||||
if (mcrypt_module_is_block_algorithm_mode(module, dir) == 1) {
|
||||
RETURN_TRUE;
|
||||
} else {
|
||||
@@ -936,7 +944,7 @@ PHP_FUNCTION(mcrypt_module_is_block_algorithm_mode)
|
||||
PHP_FUNCTION(mcrypt_module_is_block_algorithm)
|
||||
{
|
||||
MCRYPT_GET_MODE_DIR_ARGS(algorithms_dir)
|
||||
|
||||
|
||||
if (mcrypt_module_is_block_algorithm(module, dir) == 1) {
|
||||
RETURN_TRUE;
|
||||
} else {
|
||||
@@ -950,7 +958,7 @@ PHP_FUNCTION(mcrypt_module_is_block_algorithm)
|
||||
PHP_FUNCTION(mcrypt_module_is_block_mode)
|
||||
{
|
||||
MCRYPT_GET_MODE_DIR_ARGS(modes_dir)
|
||||
|
||||
|
||||
if (mcrypt_module_is_block_mode(module, dir) == 1) {
|
||||
RETURN_TRUE;
|
||||
} else {
|
||||
@@ -964,7 +972,7 @@ PHP_FUNCTION(mcrypt_module_is_block_mode)
|
||||
PHP_FUNCTION(mcrypt_module_get_algo_block_size)
|
||||
{
|
||||
MCRYPT_GET_MODE_DIR_ARGS(algorithms_dir)
|
||||
|
||||
|
||||
RETURN_LONG(mcrypt_module_get_algo_block_size(module, dir));
|
||||
}
|
||||
/* }}} */
|
||||
@@ -974,7 +982,7 @@ PHP_FUNCTION(mcrypt_module_get_algo_block_size)
|
||||
PHP_FUNCTION(mcrypt_module_get_algo_key_size)
|
||||
{
|
||||
MCRYPT_GET_MODE_DIR_ARGS(algorithms_dir);
|
||||
|
||||
|
||||
RETURN_LONG(mcrypt_module_get_algo_key_size(module, dir));
|
||||
}
|
||||
/* }}} */
|
||||
@@ -985,7 +993,7 @@ PHP_FUNCTION(mcrypt_module_get_supported_key_sizes)
|
||||
{
|
||||
int i, count = 0;
|
||||
int *key_sizes;
|
||||
|
||||
|
||||
MCRYPT_GET_MODE_DIR_ARGS(algorithms_dir)
|
||||
array_init(return_value);
|
||||
|
||||
@@ -1011,7 +1019,7 @@ PHP_FUNCTION(mcrypt_list_algorithms)
|
||||
&lib_dir, &lib_dir_len) == FAILURE) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
array_init(return_value);
|
||||
modules = mcrypt_list_algorithms(lib_dir, &count);
|
||||
|
||||
@@ -1058,7 +1066,7 @@ PHP_FUNCTION(mcrypt_get_key_size)
|
||||
{
|
||||
char *cipher;
|
||||
char *module;
|
||||
int cipher_len, module_len;
|
||||
int cipher_len, module_len;
|
||||
char *cipher_dir_string;
|
||||
char *module_dir_string;
|
||||
MCRYPT td;
|
||||
@@ -1069,7 +1077,7 @@ PHP_FUNCTION(mcrypt_get_key_size)
|
||||
&cipher, &cipher_len, &module, &module_len) == FAILURE) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
td = mcrypt_module_open(cipher, cipher_dir_string, module, module_dir_string);
|
||||
if (td != MCRYPT_FAILED) {
|
||||
RETVAL_LONG(mcrypt_enc_get_key_size(td));
|
||||
@@ -1087,7 +1095,7 @@ PHP_FUNCTION(mcrypt_get_block_size)
|
||||
{
|
||||
char *cipher;
|
||||
char *module;
|
||||
int cipher_len, module_len;
|
||||
int cipher_len, module_len;
|
||||
char *cipher_dir_string;
|
||||
char *module_dir_string;
|
||||
MCRYPT td;
|
||||
@@ -1098,7 +1106,7 @@ PHP_FUNCTION(mcrypt_get_block_size)
|
||||
&cipher, &cipher_len, &module, &module_len) == FAILURE) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
td = mcrypt_module_open(cipher, cipher_dir_string, module, module_dir_string);
|
||||
if (td != MCRYPT_FAILED) {
|
||||
RETVAL_LONG(mcrypt_enc_get_block_size(td));
|
||||
@@ -1116,7 +1124,7 @@ PHP_FUNCTION(mcrypt_get_iv_size)
|
||||
{
|
||||
char *cipher;
|
||||
char *module;
|
||||
int cipher_len, module_len;
|
||||
int cipher_len, module_len;
|
||||
char *cipher_dir_string;
|
||||
char *module_dir_string;
|
||||
MCRYPT td;
|
||||
@@ -1127,7 +1135,7 @@ PHP_FUNCTION(mcrypt_get_iv_size)
|
||||
&cipher, &cipher_len, &module, &module_len) == FAILURE) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
td = mcrypt_module_open(cipher, cipher_dir_string, module, module_dir_string);
|
||||
if (td != MCRYPT_FAILED) {
|
||||
RETVAL_LONG(mcrypt_enc_get_iv_size(td));
|
||||
@@ -1217,7 +1225,7 @@ static void php_mcrypt_do_crypt(char* cipher, const char *key, int key_len, cons
|
||||
} else { /* dertermine smallest supported key > length of requested key */
|
||||
use_key_length = max_key_length; /* start with max key length */
|
||||
for (i = 0; i < count; i++) {
|
||||
if (key_length_sizes[i] >= key_len &&
|
||||
if (key_length_sizes[i] >= key_len &&
|
||||
key_length_sizes[i] < use_key_length)
|
||||
{
|
||||
use_key_length = key_length_sizes[i];
|
||||
@@ -1228,11 +1236,11 @@ static void php_mcrypt_do_crypt(char* cipher, const char *key, int key_len, cons
|
||||
memcpy(key_s, key, MIN(key_len, use_key_length));
|
||||
}
|
||||
mcrypt_free (key_length_sizes);
|
||||
|
||||
|
||||
/* Check IV */
|
||||
iv_s = NULL;
|
||||
iv_size = mcrypt_enc_get_iv_size (td);
|
||||
|
||||
|
||||
/* IV is required */
|
||||
if (mcrypt_enc_mode_has_iv(td) == 1) {
|
||||
if (argc == 5) {
|
||||
@@ -1272,7 +1280,7 @@ static void php_mcrypt_do_crypt(char* cipher, const char *key, int key_len, cons
|
||||
} else {
|
||||
mdecrypt_generic(td, data_s, data_size);
|
||||
}
|
||||
|
||||
|
||||
RETVAL_STRINGL(data_s, data_size, 1);
|
||||
|
||||
/* freeing vars */
|
||||
@@ -1294,9 +1302,9 @@ PHP_FUNCTION(mcrypt_encrypt)
|
||||
zval **mode;
|
||||
char *cipher, *key, *data, *iv = NULL;
|
||||
int cipher_len, key_len, data_len, iv_len = 0;
|
||||
|
||||
|
||||
MCRYPT_GET_CRYPT_ARGS
|
||||
|
||||
|
||||
convert_to_string_ex(mode);
|
||||
|
||||
php_mcrypt_do_crypt(cipher, key, key_len, data, data_len, Z_STRVAL_PP(mode), iv, iv_len, ZEND_NUM_ARGS(), MCRYPT_ENCRYPT, return_value TSRMLS_CC);
|
||||
@@ -1312,7 +1320,7 @@ PHP_FUNCTION(mcrypt_decrypt)
|
||||
int cipher_len, key_len, data_len, iv_len = 0;
|
||||
|
||||
MCRYPT_GET_CRYPT_ARGS
|
||||
|
||||
|
||||
convert_to_string_ex(mode);
|
||||
|
||||
php_mcrypt_do_crypt(cipher, key, key_len, data, data_len, Z_STRVAL_PP(mode), iv, iv_len, ZEND_NUM_ARGS(), MCRYPT_DECRYPT, return_value TSRMLS_CC);
|
||||
@@ -1326,7 +1334,7 @@ PHP_FUNCTION(mcrypt_ecb)
|
||||
zval **mode;
|
||||
char *cipher, *key, *data, *iv = NULL;
|
||||
int cipher_len, key_len, data_len, iv_len = 0;
|
||||
|
||||
|
||||
MCRYPT_GET_CRYPT_ARGS
|
||||
|
||||
convert_to_long_ex(mode);
|
||||
@@ -1358,7 +1366,7 @@ PHP_FUNCTION(mcrypt_cfb)
|
||||
zval **mode;
|
||||
char *cipher, *key, *data, *iv = NULL;
|
||||
int cipher_len, key_len, data_len, iv_len = 0;
|
||||
|
||||
|
||||
MCRYPT_GET_CRYPT_ARGS
|
||||
|
||||
convert_to_long_ex(mode);
|
||||
@@ -1374,7 +1382,7 @@ PHP_FUNCTION(mcrypt_ofb)
|
||||
zval **mode;
|
||||
char *cipher, *key, *data, *iv = NULL;
|
||||
int cipher_len, key_len, data_len, iv_len = 0;
|
||||
|
||||
|
||||
MCRYPT_GET_CRYPT_ARGS
|
||||
|
||||
convert_to_long_ex(mode);
|
||||
@@ -1400,9 +1408,9 @@ PHP_FUNCTION(mcrypt_create_iv)
|
||||
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot create an IV with a size of less than 1 or greater than %d", INT_MAX);
|
||||
RETURN_FALSE;
|
||||
}
|
||||
|
||||
|
||||
iv = ecalloc(size + 1, 1);
|
||||
|
||||
|
||||
if (source == RANDOM || source == URANDOM) {
|
||||
#if PHP_WIN32
|
||||
/* random/urandom equivalent on Windows */
|
||||
|
||||
@@ -1007,6 +1007,13 @@ int odbc_bindcols(odbc_result *result TSRMLS_DC)
|
||||
rc = SQLColAttributes(result->stmt, (SQLUSMALLINT)(i+1), SQL_COLUMN_DISPLAY_SIZE,
|
||||
NULL, 0, NULL, &displaysize);
|
||||
}
|
||||
|
||||
/* Workaround for drivers that report NVARCHAR(MAX) columns as SQL_WVARCHAR with size 0 (bug #69975) */
|
||||
if (result->values[i].coltype == SQL_WVARCHAR && displaysize == 0) {
|
||||
result->values[i].coltype = SQL_WLONGVARCHAR;
|
||||
result->values[i].value = NULL;
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
/* Workaround for Oracle ODBC Driver bug (#50162) when fetching TIMESTAMP column */
|
||||
if (result->values[i].coltype == SQL_TIMESTAMP) {
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
--TEST--
|
||||
Bug #69975 (PHP segfaults when accessing nvarchar(max) defined columns)
|
||||
--SKIPIF--
|
||||
<?php include 'skipif.inc'; ?>
|
||||
--FILE--
|
||||
<?php
|
||||
include 'config.inc';
|
||||
|
||||
$conn = odbc_connect($dsn, $user, $pass);
|
||||
@odbc_exec($conn, 'CREATE DATABASE odbcTEST');
|
||||
odbc_exec($conn, 'CREATE TABLE FOO (ID INT, VARCHAR_COL NVARCHAR(MAX))');
|
||||
odbc_exec($conn, "INSERT INTO FOO VALUES (1, 'foo')");
|
||||
|
||||
$result = odbc_exec($conn, "SELECT VARCHAR_COL FROM FOO");
|
||||
var_dump(odbc_fetch_array($result));
|
||||
|
||||
echo "ready";
|
||||
?>
|
||||
--EXPECT--
|
||||
array(1) {
|
||||
["VARCHAR_COL"]=>
|
||||
string(3) "foo"
|
||||
}
|
||||
ready
|
||||
--CLEAN--
|
||||
<?php
|
||||
include 'config.inc';
|
||||
|
||||
$conn = odbc_connect($dsn, $user, $pass);
|
||||
odbc_exec($conn, 'DROP TABLE FOO');
|
||||
odbc_exec($conn, 'DROP DATABASE odbcTEST');
|
||||
?>
|
||||
@@ -207,6 +207,7 @@ static php_stream *phar_make_dirstream(char *dir, HashTable *manifest TSRMLS_DC)
|
||||
zend_hash_internal_pointer_reset(manifest);
|
||||
|
||||
while (FAILURE != zend_hash_has_more_elements(manifest)) {
|
||||
keylen = 0;
|
||||
if (HASH_KEY_NON_EXISTENT == zend_hash_get_current_key_ex(manifest, &key, &keylen, &unused, 0, NULL)) {
|
||||
break;
|
||||
}
|
||||
@@ -214,7 +215,7 @@ static php_stream *phar_make_dirstream(char *dir, HashTable *manifest TSRMLS_DC)
|
||||
PHAR_STR(key, str_key);
|
||||
|
||||
if (keylen <= (uint)dirlen) {
|
||||
if (keylen < (uint)dirlen || !strncmp(str_key, dir, dirlen)) {
|
||||
if (keylen == 0 || keylen < (uint)dirlen || !strncmp(str_key, dir, dirlen)) {
|
||||
PHAR_STR_FREE(str_key);
|
||||
if (SUCCESS != zend_hash_move_forward(manifest)) {
|
||||
break;
|
||||
|
||||
@@ -2261,6 +2261,10 @@ int phar_split_fname(char *filename, int filename_len, char **arch, int *arch_le
|
||||
#endif
|
||||
int ext_len, free_filename = 0;
|
||||
|
||||
if (CHECK_NULL_PATH(filename, filename_len)) {
|
||||
return FAILURE;
|
||||
}
|
||||
|
||||
if (!strncasecmp(filename, "phar://", 7)) {
|
||||
filename += 7;
|
||||
filename_len -= 7;
|
||||
|
||||
+20
-20
@@ -478,7 +478,7 @@ PHP_METHOD(Phar, mount)
|
||||
int fname_len, arch_len, entry_len, path_len, actual_len;
|
||||
phar_archive_data **pphar;
|
||||
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &path, &path_len, &actual, &actual_len) == FAILURE) {
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "pp", &path, &path_len, &actual, &actual_len) == FAILURE) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -960,7 +960,7 @@ PHP_METHOD(Phar, createDefaultStub)
|
||||
int index_len = 0, webindex_len = 0;
|
||||
size_t stub_len;
|
||||
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|ss", &index, &index_len, &webindex, &webindex_len) == FAILURE) {
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|pp", &index, &index_len, &webindex, &webindex_len) == FAILURE) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1004,7 +1004,7 @@ PHP_METHOD(Phar, loadPhar)
|
||||
char *fname, *alias = NULL, *error;
|
||||
int fname_len, alias_len = 0;
|
||||
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|s!", &fname, &fname_len, &alias, &alias_len) == FAILURE) {
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "p|s!", &fname, &fname_len, &alias, &alias_len) == FAILURE) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1083,7 +1083,7 @@ PHP_METHOD(Phar, isValidPharFilename)
|
||||
int fname_len, ext_len, is_executable;
|
||||
zend_bool executable = 1;
|
||||
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|b", &fname, &fname_len, &executable) == FAILURE) {
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "p|b", &fname, &fname_len, &executable) == FAILURE) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1154,11 +1154,11 @@ PHP_METHOD(Phar, __construct)
|
||||
is_data = instanceof_function(Z_OBJCE_P(zobj), phar_ce_data TSRMLS_CC);
|
||||
|
||||
if (is_data) {
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|ls!l", &fname, &fname_len, &flags, &alias, &alias_len, &format) == FAILURE) {
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "p|ls!l", &fname, &fname_len, &flags, &alias, &alias_len, &format) == FAILURE) {
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|ls!", &fname, &fname_len, &flags, &alias, &alias_len) == FAILURE) {
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "p|ls!", &fname, &fname_len, &flags, &alias, &alias_len) == FAILURE) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -1326,7 +1326,7 @@ PHP_METHOD(Phar, unlinkArchive)
|
||||
int fname_len, zname_len, arch_len, entry_len;
|
||||
phar_archive_data *phar;
|
||||
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &fname, &fname_len) == FAILURE) {
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "p", &fname, &fname_len) == FAILURE) {
|
||||
RETURN_FALSE;
|
||||
}
|
||||
|
||||
@@ -1756,7 +1756,7 @@ PHP_METHOD(Phar, buildFromDirectory)
|
||||
return;
|
||||
}
|
||||
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|s", &dir, &dir_len, ®ex, ®ex_len) == FAILURE) {
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "p|s", &dir, &dir_len, ®ex, ®ex_len) == FAILURE) {
|
||||
RETURN_FALSE;
|
||||
}
|
||||
|
||||
@@ -2628,7 +2628,7 @@ PHP_METHOD(Phar, delete)
|
||||
return;
|
||||
}
|
||||
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &fname, &fname_len) == FAILURE) {
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "p", &fname, &fname_len) == FAILURE) {
|
||||
RETURN_FALSE;
|
||||
}
|
||||
|
||||
@@ -3440,7 +3440,7 @@ PHP_METHOD(Phar, copy)
|
||||
|
||||
PHAR_ARCHIVE_OBJECT();
|
||||
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &oldfile, &oldfile_len, &newfile, &newfile_len) == FAILURE) {
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "pp", &oldfile, &oldfile_len, &newfile, &newfile_len) == FAILURE) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -3546,7 +3546,7 @@ PHP_METHOD(Phar, offsetExists)
|
||||
|
||||
PHAR_ARCHIVE_OBJECT();
|
||||
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &fname, &fname_len) == FAILURE) {
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "p", &fname, &fname_len) == FAILURE) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -3583,7 +3583,7 @@ PHP_METHOD(Phar, offsetGet)
|
||||
phar_entry_info *entry;
|
||||
PHAR_ARCHIVE_OBJECT();
|
||||
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &fname, &fname_len) == FAILURE) {
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "p", &fname, &fname_len) == FAILURE) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -3731,8 +3731,8 @@ PHP_METHOD(Phar, offsetSet)
|
||||
return;
|
||||
}
|
||||
|
||||
if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, ZEND_NUM_ARGS() TSRMLS_CC, "sr", &fname, &fname_len, &zresource) == FAILURE
|
||||
&& zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &fname, &fname_len, &cont_str, &cont_len) == FAILURE) {
|
||||
if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, ZEND_NUM_ARGS() TSRMLS_CC, "pr", &fname, &fname_len, &zresource) == FAILURE
|
||||
&& zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ps", &fname, &fname_len, &cont_str, &cont_len) == FAILURE) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -3770,7 +3770,7 @@ PHP_METHOD(Phar, offsetUnset)
|
||||
return;
|
||||
}
|
||||
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &fname, &fname_len) == FAILURE) {
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "p", &fname, &fname_len) == FAILURE) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -3817,7 +3817,7 @@ PHP_METHOD(Phar, addEmptyDir)
|
||||
|
||||
PHAR_ARCHIVE_OBJECT();
|
||||
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &dirname, &dirname_len) == FAILURE) {
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "p", &dirname, &dirname_len) == FAILURE) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -3842,7 +3842,7 @@ PHP_METHOD(Phar, addFile)
|
||||
|
||||
PHAR_ARCHIVE_OBJECT();
|
||||
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|s", &fname, &fname_len, &localname, &localname_len) == FAILURE) {
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "p|s", &fname, &fname_len, &localname, &localname_len) == FAILURE) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -3886,7 +3886,7 @@ PHP_METHOD(Phar, addFromString)
|
||||
|
||||
PHAR_ARCHIVE_OBJECT();
|
||||
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &localname, &localname_len, &cont_str, &cont_len) == FAILURE) {
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ps", &localname, &localname_len, &cont_str, &cont_len) == FAILURE) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -4313,7 +4313,7 @@ PHP_METHOD(Phar, extractTo)
|
||||
|
||||
PHAR_ARCHIVE_OBJECT();
|
||||
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|z!b", &pathto, &pathto_len, &zval_files, &overwrite) == FAILURE) {
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "p|z!b", &pathto, &pathto_len, &zval_files, &overwrite) == FAILURE) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -4452,7 +4452,7 @@ PHP_METHOD(PharFileInfo, __construct)
|
||||
phar_archive_data *phar_data;
|
||||
zval *zobj = getThis(), arg1;
|
||||
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &fname, &fname_len) == FAILURE) {
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "p", &fname, &fname_len) == FAILURE) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -356,7 +356,7 @@ bail:
|
||||
entry.filename_len = entry.uncompressed_filesize;
|
||||
|
||||
/* Check for overflow - bug 61065 */
|
||||
if (entry.filename_len == UINT_MAX) {
|
||||
if (entry.filename_len == UINT_MAX || entry.filename_len == 0) {
|
||||
if (error) {
|
||||
spprintf(error, 4096, "phar error: \"%s\" is a corrupted tar file (invalid entry size)", fname);
|
||||
}
|
||||
|
||||
@@ -126,19 +126,19 @@ echo $e->getMessage() . "\n";
|
||||
--EXPECTF--
|
||||
Warning: Phar::mungServer() expects parameter 1 to be array, %string given in %sbadparameters.php on line %d
|
||||
|
||||
Warning: Phar::createDefaultStub() expects parameter 1 to be %string, array given in %sbadparameters.php on line %d
|
||||
Warning: Phar::createDefaultStub() expects parameter 1 to be a valid path, array given in %sbadparameters.php on line %d
|
||||
|
||||
Warning: Phar::loadPhar() expects parameter 1 to be %string, array given in %sbadparameters.php on line %d
|
||||
Warning: Phar::loadPhar() expects parameter 1 to be a valid path, array given in %sbadparameters.php on line %d
|
||||
|
||||
Warning: Phar::canCompress() expects parameter 1 to be long, %string given in %sbadparameters.php on line %d
|
||||
|
||||
Warning: Phar::__construct() expects parameter 1 to be %string, array given in %sbadparameters.php on line %d
|
||||
Warning: Phar::__construct() expects parameter 1 to be a valid path, array given in %sbadparameters.php on line %d
|
||||
|
||||
Warning: Phar::convertToExecutable() expects parameter 1 to be long, array given in %sbadparameters.php on line %d
|
||||
|
||||
Warning: Phar::convertToData() expects parameter 1 to be long, array given in %sbadparameters.php on line %d
|
||||
|
||||
Warning: PharData::delete() expects parameter 1 to be %string, array given in %sbadparameters.php on line %d
|
||||
Warning: PharData::delete() expects parameter 1 to be a valid path, array given in %sbadparameters.php on line %d
|
||||
Cannot write out phar archive, phar is read-only
|
||||
Entry oops does not exist and cannot be deleted
|
||||
%sfiles/frontcontroller10.phar
|
||||
@@ -165,18 +165,18 @@ Phar is readonly, cannot change compression
|
||||
Warning: Phar::copy() expects exactly 2 parameters, 1 given in %sbadparameters.php on line %d
|
||||
Cannot copy "a" to "b", phar is read-only
|
||||
|
||||
Warning: Phar::offsetExists() expects parameter 1 to be %string, array given in %sbadparameters.php on line %d
|
||||
Warning: Phar::offsetExists() expects parameter 1 to be a valid path, array given in %sbadparameters.php on line %d
|
||||
|
||||
Warning: Phar::offsetGet() expects parameter 1 to be %string, array given in %sbadparameters.php on line %d
|
||||
Warning: Phar::offsetGet() expects parameter 1 to be a valid path, array given in %sbadparameters.php on line %d
|
||||
|
||||
Warning: Phar::offsetSet() expects exactly 2 parameters, 1 given in %sbadparameters.php on line %d
|
||||
|
||||
Warning: PharData::offsetUnset() expects parameter 1 to be %string, array given in %sbadparameters.php on line %d
|
||||
Warning: PharData::offsetUnset() expects parameter 1 to be a valid path, array given in %sbadparameters.php on line %d
|
||||
Write operations disabled by the php.ini setting phar.readonly
|
||||
|
||||
Warning: Phar::addEmptyDir() expects parameter 1 to be %string, array given in %sbadparameters.php on line %d
|
||||
Warning: Phar::addEmptyDir() expects parameter 1 to be a valid path, array given in %sbadparameters.php on line %d
|
||||
|
||||
Warning: Phar::addFile() expects parameter 1 to be %string, array given in %sbadparameters.php on line %d
|
||||
Warning: Phar::addFile() expects parameter 1 to be a valid path, array given in %sbadparameters.php on line %d
|
||||
|
||||
Warning: Phar::addFromString() expects exactly 2 parameters, 1 given in %sbadparameters.php on line %d
|
||||
Write operations disabled by the php.ini setting phar.readonly
|
||||
|
||||
@@ -48,11 +48,12 @@ try {
|
||||
<?php
|
||||
@unlink(__DIR__."/bug64931.phar");
|
||||
?>
|
||||
--EXPECT--
|
||||
--EXPECTF--
|
||||
Test
|
||||
CAUGHT: Cannot create any files in magic ".phar" directory
|
||||
CAUGHT: Cannot create any files in magic ".phar" directory
|
||||
CAUGHT: Cannot create any files in magic ".phar" directory
|
||||
CAUGHT: Cannot create any files in magic ".phar" directory
|
||||
CAUGHT: Cannot create any files in magic ".phar" directory
|
||||
===DONE===
|
||||
|
||||
Warning: Phar::addFromString() expects parameter 1 to be a valid path, string given in %s%ebug64931.php on line %d
|
||||
===DONE===
|
||||
@@ -0,0 +1,15 @@
|
||||
--TEST--
|
||||
Bug #71331 (Uninitialized pointer in phar_make_dirstream())
|
||||
--SKIPIF--
|
||||
<?php if (!extension_loaded("phar")) die("skip"); ?>
|
||||
--FILE--
|
||||
<?php
|
||||
$p = new PharData(__DIR__."/bug71331.tar");
|
||||
?>
|
||||
DONE
|
||||
--EXPECTF--
|
||||
Fatal error: Uncaught exception 'UnexpectedValueException' with message 'phar error: "%s/bug71331.tar" is a corrupted tar file (invalid entry size)' in %s/bug71331.php:2
|
||||
Stack trace:
|
||||
#0 %s/bug71331.php(2): PharData->__construct('%s')
|
||||
#1 {main}
|
||||
thrown in %s/bug71331.php on line 2
|
||||
Binary file not shown.
@@ -80,6 +80,5 @@ string(5) "query"
|
||||
11:Error: file_put_contents(phar:///%s): failed to open stream: phar error: invalid path "%s" contains illegal character
|
||||
12:Error: file_put_contents(phar:///%s): failed to open stream: phar error: invalid path "%s" contains illegal character
|
||||
13:Error: file_put_contents(phar:///%s): failed to open stream: phar error: invalid path "%s" contains illegal character
|
||||
Exception: Entry a does not exist and cannot be created: phar error: invalid path "a" contains illegal character
|
||||
===DONE===
|
||||
Error: Phar::offsetSet() expects parameter 1 to be a valid path, string given===DONE===
|
||||
|
||||
@@ -138,7 +138,7 @@ string(3) "hi2"
|
||||
bool(false)
|
||||
Invalid argument, expected a filename (string) or array of filenames
|
||||
|
||||
Warning: Phar::extractTo() expects parameter 1 to be %string, array given in %sphar_extract.php on line %d
|
||||
Warning: Phar::extractTo() expects parameter 1 to be a valid path, array given in %sphar_extract.php on line %d
|
||||
Invalid argument, extraction path must be non-zero length
|
||||
Unable to use path "%soops" for extraction, it is a file, must be a directory
|
||||
Invalid argument, array of filenames to extract contains non-string value
|
||||
|
||||
@@ -76,7 +76,7 @@ var_dump(Phar::isValidPharFilename('dir.phar.php', false));
|
||||
<?php
|
||||
rmdir(dirname(__FILE__) . '/.phar');
|
||||
--EXPECTF--
|
||||
Warning: Phar::isValidPharFilename() expects parameter 1 to be %string, array given in %sphar_isvalidpharfilename.php on line %d
|
||||
Warning: Phar::isValidPharFilename() expects parameter 1 to be a valid path, array given in %sphar_isvalidpharfilename.php on line %d
|
||||
*
|
||||
bool(false)
|
||||
bool(false)
|
||||
|
||||
@@ -90,7 +90,7 @@ Unknown phar archive ""
|
||||
Unknown phar archive "%sphar_unlinkarchive.phar"
|
||||
Unknown phar archive "%sphar_unlinkarchive.phar.tar": internal corruption of phar "%sphar_unlinkarchive.phar.tar" (truncated entry)
|
||||
|
||||
Warning: Phar::unlinkArchive() expects parameter 1 to be %string, array given in %sphar_unlinkarchive.php on line %d
|
||||
Warning: Phar::unlinkArchive() expects parameter 1 to be a valid path, array given in %sphar_unlinkarchive.php on line %d
|
||||
bool(false)
|
||||
string(48) "<?php echo "first stub\n"; __HALT_COMPILER(); ?>"
|
||||
phar archive "%sphar_unlinkarchive.phar" has open file handles or objects. fclose() all file handles, and unset() all objects prior to calling unlinkArchive()
|
||||
|
||||
@@ -47,7 +47,7 @@ echo $e->getMessage() . "\n";
|
||||
--EXPECTF--
|
||||
Cannot open phar file 'phar://%spharfileinfo_construct.phar/oops': internal corruption of phar "%spharfileinfo_construct.phar" (truncated entry)
|
||||
|
||||
Warning: PharFileInfo::__construct() expects parameter 1 to be %string, array given in %spharfileinfo_construct.php on line %d
|
||||
Warning: PharFileInfo::__construct() expects parameter 1 to be a valid path, array given in %spharfileinfo_construct.php on line %d
|
||||
Cannot access phar file entry '/oops/I/do/not/exist' in archive '%spharfileinfo_construct.phar'
|
||||
Cannot call constructor twice
|
||||
'%spharfileinfo_construct.php' is not a valid phar archive URL (must have at least phar://filename.phar)
|
||||
|
||||
@@ -866,7 +866,7 @@ PS_SERIALIZER_DECODE_FUNC(php_serialize) /* {{{ */
|
||||
if (php_var_unserialize(&session_vars, &val, endptr, &var_hash TSRMLS_CC)) {
|
||||
var_push_dtor(&var_hash, &session_vars);
|
||||
}
|
||||
|
||||
|
||||
PHP_VAR_UNSERIALIZE_DESTROY(var_hash);
|
||||
if (PS(http_session_vars)) {
|
||||
zval_ptr_dtor(&PS(http_session_vars));
|
||||
@@ -931,6 +931,7 @@ PS_SERIALIZER_DECODE_FUNC(php_binary) /* {{{ */
|
||||
namelen = ((unsigned char)(*p)) & (~PS_BIN_UNDEF);
|
||||
|
||||
if (namelen < 0 || namelen > PS_BIN_MAX || (p + namelen) >= endptr) {
|
||||
PHP_VAR_UNSERIALIZE_DESTROY(var_hash);
|
||||
return FAILURE;
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,44 @@
|
||||
--TEST--
|
||||
Bug #72562: Use After Free in unserialize() with Unexpected Session Deserialization
|
||||
--SKIPIF--
|
||||
<?php include('skipif.inc'); ?>
|
||||
--FILE--
|
||||
<?php
|
||||
|
||||
ini_set('session.serialize_handler', 'php_binary');
|
||||
session_start();
|
||||
$sess = "\x1xi:1;\x2y";
|
||||
session_decode($sess);
|
||||
$uns_1 = '{';
|
||||
$out_1[] = unserialize($uns_1);
|
||||
unset($out_1);
|
||||
$fakezval = ptr2str(1122334455);
|
||||
$fakezval .= ptr2str(0);
|
||||
$fakezval .= "\x00\x00\x00\x00";
|
||||
$fakezval .= "\x01";
|
||||
$fakezval .= "\x00";
|
||||
$fakezval .= "\x00\x00";
|
||||
for ($i = 0; $i < 5; $i++) {
|
||||
$v[$i] = $fakezval.$i;
|
||||
}
|
||||
$uns_2 = 'R:2;';
|
||||
$out_2 = unserialize($uns_2);
|
||||
var_dump($out_2);
|
||||
|
||||
function ptr2str($ptr)
|
||||
{
|
||||
$out = '';
|
||||
for ($i = 0; $i < 8; $i++) {
|
||||
$out .= chr($ptr & 0xff);
|
||||
$ptr >>= 8;
|
||||
}
|
||||
return $out;
|
||||
}
|
||||
?>
|
||||
--EXPECTF--
|
||||
Warning: session_decode(): Failed to decode session object. Session has been destroyed in %s/bug72562.php on line %d
|
||||
|
||||
Notice: unserialize(): Error at offset 0 of 1 bytes in %s/bug72562.php on line %d
|
||||
|
||||
Notice: unserialize(): Error at offset 4 of 4 bytes in %s/bug72562.php on line %d
|
||||
bool(false)
|
||||
+50
-41
@@ -475,7 +475,7 @@ static void php_snmp_session_destructor(zend_rsrc_list_entry *rsrc TSRMLS_DC)
|
||||
static void php_snmp_object_free_storage(void *object TSRMLS_DC)
|
||||
{
|
||||
php_snmp_object *intern = (php_snmp_object *)object;
|
||||
|
||||
|
||||
if (!intern) {
|
||||
return;
|
||||
}
|
||||
@@ -483,7 +483,7 @@ static void php_snmp_object_free_storage(void *object TSRMLS_DC)
|
||||
netsnmp_session_free(&(intern->session));
|
||||
|
||||
zend_object_std_dtor(&intern->zo TSRMLS_CC);
|
||||
|
||||
|
||||
efree(intern);
|
||||
}
|
||||
|
||||
@@ -503,7 +503,7 @@ static zend_object_value php_snmp_object_new(zend_class_entry *class_type TSRMLS
|
||||
retval.handlers = (zend_object_handlers *) &php_snmp_object_handlers;
|
||||
|
||||
return retval;
|
||||
|
||||
|
||||
}
|
||||
|
||||
/* {{{ php_snmp_error
|
||||
@@ -533,7 +533,7 @@ static void php_snmp_error(zval *object, const char *docref TSRMLS_DC, int type,
|
||||
}
|
||||
|
||||
if (object && (snmp_object->exceptions_enabled & type)) {
|
||||
zend_throw_exception_ex(php_snmp_exception_ce, type TSRMLS_CC, snmp_object->snmp_errstr);
|
||||
zend_throw_exception_ex(php_snmp_exception_ce, type TSRMLS_CC, "%s", snmp_object->snmp_errstr);
|
||||
} else {
|
||||
va_start(args, format);
|
||||
php_verror(docref, "", E_WARNING, format, args TSRMLS_CC);
|
||||
@@ -556,7 +556,7 @@ static void php_snmp_getvalue(struct variable_list *vars, zval *snmpval TSRMLS_D
|
||||
char *dbuf = (char *)NULL;
|
||||
int buflen = sizeof(sbuf) - 1;
|
||||
int val_len = vars->val_len;
|
||||
|
||||
|
||||
/* use emalloc() for large values, use static array otherwize */
|
||||
|
||||
/* There is no way to know the size of buffer snprint_value() needs in order to print a value there.
|
||||
@@ -702,7 +702,7 @@ static void php_snmp_getvalue(struct variable_list *vars, zval *snmpval TSRMLS_D
|
||||
* SNMP object fetcher/setter for all SNMP versions
|
||||
*
|
||||
*/
|
||||
static void php_snmp_internal(INTERNAL_FUNCTION_PARAMETERS, int st,
|
||||
static void php_snmp_internal(INTERNAL_FUNCTION_PARAMETERS, int st,
|
||||
struct snmp_session *session,
|
||||
struct objid_query *objid_query)
|
||||
{
|
||||
@@ -721,7 +721,7 @@ static void php_snmp_internal(INTERNAL_FUNCTION_PARAMETERS, int st,
|
||||
|
||||
/* we start with retval=FALSE. If any actual data is acquired, retval will be set to appropriate type */
|
||||
RETVAL_FALSE;
|
||||
|
||||
|
||||
/* reset errno and errstr */
|
||||
php_snmp_error(getThis(), NULL TSRMLS_CC, PHP_SNMP_ERRNO_NOERROR, "");
|
||||
|
||||
@@ -805,8 +805,8 @@ retry:
|
||||
}
|
||||
for (vars = response->variables; vars; vars = vars->next_variable) {
|
||||
/* do not output errors as values */
|
||||
if ( vars->type == SNMP_ENDOFMIBVIEW ||
|
||||
vars->type == SNMP_NOSUCHOBJECT ||
|
||||
if ( vars->type == SNMP_ENDOFMIBVIEW ||
|
||||
vars->type == SNMP_NOSUCHOBJECT ||
|
||||
vars->type == SNMP_NOSUCHINSTANCE ) {
|
||||
if ((st & SNMP_CMD_WALK) && Z_TYPE_P(return_value) == IS_ARRAY) {
|
||||
break;
|
||||
@@ -816,8 +816,8 @@ retry:
|
||||
php_snmp_error(getThis(), NULL TSRMLS_CC, PHP_SNMP_ERRNO_ERROR_IN_REPLY, "Error in packet at '%s': %s", buf, buf2);
|
||||
continue;
|
||||
}
|
||||
|
||||
if ((st & SNMP_CMD_WALK) &&
|
||||
|
||||
if ((st & SNMP_CMD_WALK) &&
|
||||
(vars->name_length < rootlen || memcmp(root, vars->name, rootlen * sizeof(oid)))) { /* not part of this subtree */
|
||||
if (Z_TYPE_P(return_value) == IS_ARRAY) { /* some records are fetched already, shut down further lookup */
|
||||
keepwalking = 0;
|
||||
@@ -1101,7 +1101,7 @@ static int php_snmp_parse_oid(zval *object, int st, struct objid_query *objid_qu
|
||||
efree(objid_query->vars);
|
||||
return FALSE;
|
||||
}
|
||||
} else {
|
||||
} else {
|
||||
memmove((char *)objid_query->vars[0].name, (char *)objid_mib, sizeof(objid_mib));
|
||||
objid_query->vars[0].name_length = sizeof(objid_mib) / sizeof(oid);
|
||||
}
|
||||
@@ -1437,7 +1437,7 @@ static void php_snmp(INTERNAL_FUNCTION_PARAMETERS, int st, int version)
|
||||
int session_less_mode = (getThis() == NULL);
|
||||
php_snmp_object *snmp_object;
|
||||
php_snmp_object glob_snmp_object;
|
||||
|
||||
|
||||
objid_query.max_repetitions = -1;
|
||||
objid_query.non_repeaters = 0;
|
||||
objid_query.valueretrieval = SNMP_G(valueretrieval);
|
||||
@@ -1550,7 +1550,7 @@ static void php_snmp(INTERNAL_FUNCTION_PARAMETERS, int st, int version)
|
||||
}
|
||||
|
||||
php_snmp_internal(INTERNAL_FUNCTION_PARAM_PASSTHRU, st, session, &objid_query);
|
||||
|
||||
|
||||
efree(objid_query.vars);
|
||||
|
||||
if (session_less_mode) {
|
||||
@@ -1563,7 +1563,7 @@ static void php_snmp(INTERNAL_FUNCTION_PARAMETERS, int st, int version)
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto mixed snmpget(string host, string community, mixed object_id [, int timeout [, int retries]])
|
||||
/* {{{ proto mixed snmpget(string host, string community, mixed object_id [, int timeout [, int retries]])
|
||||
Fetch a SNMP object */
|
||||
PHP_FUNCTION(snmpget)
|
||||
{
|
||||
@@ -1571,7 +1571,7 @@ PHP_FUNCTION(snmpget)
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto mixed snmpgetnext(string host, string community, mixed object_id [, int timeout [, int retries]])
|
||||
/* {{{ proto mixed snmpgetnext(string host, string community, mixed object_id [, int timeout [, int retries]])
|
||||
Fetch a SNMP object */
|
||||
PHP_FUNCTION(snmpgetnext)
|
||||
{
|
||||
@@ -1579,7 +1579,7 @@ PHP_FUNCTION(snmpgetnext)
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto mixed snmpwalk(string host, string community, mixed object_id [, int timeout [, int retries]])
|
||||
/* {{{ proto mixed snmpwalk(string host, string community, mixed object_id [, int timeout [, int retries]])
|
||||
Return all objects under the specified object id */
|
||||
PHP_FUNCTION(snmpwalk)
|
||||
{
|
||||
@@ -1595,7 +1595,7 @@ PHP_FUNCTION(snmprealwalk)
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto bool snmpset(string host, string community, mixed object_id, mixed type, mixed value [, int timeout [, int retries]])
|
||||
/* {{{ proto bool snmpset(string host, string community, mixed object_id, mixed type, mixed value [, int timeout [, int retries]])
|
||||
Set the value of a SNMP object */
|
||||
PHP_FUNCTION(snmpset)
|
||||
{
|
||||
@@ -1642,7 +1642,7 @@ PHP_FUNCTION(snmp_set_enum_print)
|
||||
|
||||
netsnmp_ds_set_boolean(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_PRINT_NUMERIC_ENUM, (int) a1);
|
||||
RETURN_TRUE;
|
||||
}
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto bool snmp_set_oid_output_format(int oid_format)
|
||||
@@ -1670,10 +1670,10 @@ PHP_FUNCTION(snmp_set_oid_output_format)
|
||||
RETURN_FALSE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto mixed snmp2_get(string host, string community, mixed object_id [, int timeout [, int retries]])
|
||||
/* {{{ proto mixed snmp2_get(string host, string community, mixed object_id [, int timeout [, int retries]])
|
||||
Fetch a SNMP object */
|
||||
PHP_FUNCTION(snmp2_get)
|
||||
{
|
||||
@@ -1681,7 +1681,7 @@ PHP_FUNCTION(snmp2_get)
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto mixed snmp2_getnext(string host, string community, mixed object_id [, int timeout [, int retries]])
|
||||
/* {{{ proto mixed snmp2_getnext(string host, string community, mixed object_id [, int timeout [, int retries]])
|
||||
Fetch a SNMP object */
|
||||
PHP_FUNCTION(snmp2_getnext)
|
||||
{
|
||||
@@ -1689,7 +1689,7 @@ PHP_FUNCTION(snmp2_getnext)
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto mixed snmp2_walk(string host, string community, mixed object_id [, int timeout [, int retries]])
|
||||
/* {{{ proto mixed snmp2_walk(string host, string community, mixed object_id [, int timeout [, int retries]])
|
||||
Return all objects under the specified object id */
|
||||
PHP_FUNCTION(snmp2_walk)
|
||||
{
|
||||
@@ -1705,7 +1705,7 @@ PHP_FUNCTION(snmp2_real_walk)
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto bool snmp2_set(string host, string community, mixed object_id, mixed type, mixed value [, int timeout [, int retries]])
|
||||
/* {{{ proto bool snmp2_set(string host, string community, mixed object_id, mixed type, mixed value [, int timeout [, int retries]])
|
||||
Set the value of a SNMP object */
|
||||
PHP_FUNCTION(snmp2_set)
|
||||
{
|
||||
@@ -1821,7 +1821,7 @@ PHP_METHOD(snmp, __construct)
|
||||
|
||||
snmp_object = (php_snmp_object *)zend_object_store_get_object(object TSRMLS_CC);
|
||||
zend_replace_error_handling(EH_THROW, NULL, &error_handling TSRMLS_CC);
|
||||
|
||||
|
||||
if (zend_parse_parameters(argc TSRMLS_CC, "lss|ll", &version, &a1, &a1_len, &a2, &a2_len, &timeout, &retries) == FAILURE) {
|
||||
zend_restore_error_handling(&error_handling TSRMLS_CC);
|
||||
return;
|
||||
@@ -1843,7 +1843,7 @@ PHP_METHOD(snmp, __construct)
|
||||
if (snmp_object->session) {
|
||||
netsnmp_session_free(&(snmp_object->session));
|
||||
}
|
||||
|
||||
|
||||
if (netsnmp_session_init(&(snmp_object->session), version, a1, a2, timeout, retries TSRMLS_CC)) {
|
||||
return;
|
||||
}
|
||||
@@ -1857,7 +1857,7 @@ PHP_METHOD(snmp, __construct)
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto bool SNMP::close()
|
||||
/* {{{ proto bool SNMP::close()
|
||||
Close SNMP session */
|
||||
PHP_METHOD(snmp, close)
|
||||
{
|
||||
@@ -1900,7 +1900,7 @@ PHP_METHOD(snmp, walk)
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto bool SNMP::set(mixed object_id, mixed type, mixed value)
|
||||
/* {{{ proto bool SNMP::set(mixed object_id, mixed type, mixed value)
|
||||
Set the value of a SNMP object */
|
||||
PHP_METHOD(snmp, set)
|
||||
{
|
||||
@@ -1918,7 +1918,7 @@ PHP_METHOD(snmp, setSecurity)
|
||||
int argc = ZEND_NUM_ARGS();
|
||||
|
||||
snmp_object = (php_snmp_object *)zend_object_store_get_object(object TSRMLS_CC);
|
||||
|
||||
|
||||
if (zend_parse_parameters(argc TSRMLS_CC, "s|ssssss", &a1, &a1_len, &a2, &a2_len, &a3, &a3_len,
|
||||
&a4, &a4_len, &a5, &a5_len, &a6, &a6_len, &a7, &a7_len) == FAILURE) {
|
||||
RETURN_FALSE;
|
||||
@@ -1932,7 +1932,7 @@ PHP_METHOD(snmp, setSecurity)
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto long SNMP::getErrno()
|
||||
/* {{{ proto long SNMP::getErrno()
|
||||
Get last error code number */
|
||||
PHP_METHOD(snmp, getErrno)
|
||||
{
|
||||
@@ -1946,7 +1946,7 @@ PHP_METHOD(snmp, getErrno)
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto long SNMP::getError()
|
||||
/* {{{ proto long SNMP::getError()
|
||||
Get last error message */
|
||||
PHP_METHOD(snmp, getError)
|
||||
{
|
||||
@@ -2095,6 +2095,14 @@ static int php_snmp_has_property(zval *object, zval *member, int has_set_exists,
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
static HashTable *php_snmp_get_gc(zval *object, zval ***gc_data, int *gc_data_count TSRMLS_DC) /* {{{ */
|
||||
{
|
||||
*gc_data = NULL;
|
||||
*gc_data_count = 0;
|
||||
return zend_std_get_properties(object TSRMLS_CC);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ php_snmp_get_properties(zval *object)
|
||||
Returns all object properties. Injects SNMP properties into object on first call */
|
||||
static HashTable *php_snmp_get_properties(zval *object TSRMLS_DC)
|
||||
@@ -2137,23 +2145,23 @@ static int php_snmp_read_info(php_snmp_object *snmp_object, zval **retval TSRMLS
|
||||
if (snmp_object->session == NULL) {
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
MAKE_STD_ZVAL(val);
|
||||
ZVAL_STRINGL(val, snmp_object->session->peername, strlen(snmp_object->session->peername), 1);
|
||||
add_assoc_zval(*retval, "hostname", val);
|
||||
|
||||
|
||||
MAKE_STD_ZVAL(val);
|
||||
ZVAL_LONG(val, snmp_object->session->remote_port);
|
||||
add_assoc_zval(*retval, "port", val);
|
||||
|
||||
|
||||
MAKE_STD_ZVAL(val);
|
||||
ZVAL_LONG(val, snmp_object->session->timeout);
|
||||
add_assoc_zval(*retval, "timeout", val);
|
||||
|
||||
|
||||
MAKE_STD_ZVAL(val);
|
||||
ZVAL_LONG(val, snmp_object->session->retries);
|
||||
add_assoc_zval(*retval, "retries", val);
|
||||
|
||||
|
||||
return SUCCESS;
|
||||
}
|
||||
/* }}} */
|
||||
@@ -2226,7 +2234,7 @@ static int php_snmp_write_max_oids(php_snmp_object *snmp_object, zval *newval TS
|
||||
} else {
|
||||
php_error_docref(NULL TSRMLS_CC, E_WARNING, "max_oids should be positive integer or NULL, got %ld", Z_LVAL_P(newval));
|
||||
}
|
||||
|
||||
|
||||
if (newval == &ztmp) {
|
||||
zval_dtor(newval);
|
||||
}
|
||||
@@ -2254,7 +2262,7 @@ static int php_snmp_write_valueretrieval(php_snmp_object *snmp_object, zval *new
|
||||
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown SNMP value retrieval method '%ld'", Z_LVAL_P(newval));
|
||||
ret = FAILURE;
|
||||
}
|
||||
|
||||
|
||||
if (newval == &ztmp) {
|
||||
zval_dtor(newval);
|
||||
}
|
||||
@@ -2297,7 +2305,7 @@ static int php_snmp_write_oid_output_format(php_snmp_object *snmp_object, zval *
|
||||
convert_to_long(&ztmp);
|
||||
newval = &ztmp;
|
||||
}
|
||||
|
||||
|
||||
switch(Z_LVAL_P(newval)) {
|
||||
case NETSNMP_OID_OUTPUT_SUFFIX:
|
||||
case NETSNMP_OID_OUTPUT_MODULE:
|
||||
@@ -2332,7 +2340,7 @@ static int php_snmp_write_exceptions_enabled(php_snmp_object *snmp_object, zval
|
||||
newval = &ztmp;
|
||||
}
|
||||
|
||||
snmp_object->exceptions_enabled = Z_LVAL_P(newval);
|
||||
snmp_object->exceptions_enabled = Z_LVAL_P(newval);
|
||||
|
||||
if (newval == &ztmp) {
|
||||
zval_dtor(newval);
|
||||
@@ -2401,6 +2409,7 @@ PHP_MINIT_FUNCTION(snmp)
|
||||
php_snmp_object_handlers.write_property = php_snmp_write_property;
|
||||
php_snmp_object_handlers.has_property = php_snmp_has_property;
|
||||
php_snmp_object_handlers.get_properties = php_snmp_get_properties;
|
||||
php_snmp_object_handlers.get_gc = php_snmp_get_gc;
|
||||
|
||||
/* Register SNMP Class */
|
||||
INIT_CLASS_ENTRY(ce, "SNMP", php_snmp_class_methods);
|
||||
@@ -2467,7 +2476,7 @@ PHP_MINIT_FUNCTION(snmp)
|
||||
PHP_MSHUTDOWN_FUNCTION(snmp)
|
||||
{
|
||||
snmp_shutdown("snmpapp");
|
||||
|
||||
|
||||
zend_hash_destroy(&php_snmp_properties);
|
||||
|
||||
return SUCCESS;
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
--TEST--
|
||||
Bug #72479: Use After Free Vulnerability in SNMP with GC and unserialize()
|
||||
--SKIPIF--
|
||||
<?php
|
||||
require_once(dirname(__FILE__).'/skipif.inc');
|
||||
?>
|
||||
--FILE--
|
||||
<?php
|
||||
$arr = [1, [1, 2, 3, 4, 5], 3, 4, 5];
|
||||
$poc = 'a:3:{i:1;N;i:2;O:4:"snmp":1:{s:11:"quick_print";'.serialize($arr).'}i:1;R:7;}';
|
||||
$out = unserialize($poc);
|
||||
gc_collect_cycles();
|
||||
$fakezval = ptr2str(1122334455);
|
||||
$fakezval .= ptr2str(0);
|
||||
$fakezval .= "\x00\x00\x00\x00";
|
||||
$fakezval .= "\x01";
|
||||
$fakezval .= "\x00";
|
||||
$fakezval .= "\x00\x00";
|
||||
for ($i = 0; $i < 5; $i++) {
|
||||
$v[$i] = $fakezval.$i;
|
||||
}
|
||||
var_dump($out[1]);
|
||||
|
||||
function ptr2str($ptr)
|
||||
{
|
||||
$out = '';
|
||||
for ($i = 0; $i < 8; $i++) {
|
||||
$out .= chr($ptr & 0xff);
|
||||
$ptr >>= 8;
|
||||
}
|
||||
return $out;
|
||||
}
|
||||
?>
|
||||
--EXPECT--
|
||||
int(1)
|
||||
@@ -831,6 +831,16 @@ static HashTable* spl_array_get_debug_info(zval *obj, int *is_temp TSRMLS_DC) /*
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
static HashTable *spl_array_get_gc(zval *object, zval ***gc_data, int *gc_data_count TSRMLS_DC) /* {{{ */
|
||||
{
|
||||
spl_array_object *intern = (spl_array_object*)zend_object_store_get_object(object TSRMLS_CC);
|
||||
|
||||
*gc_data = &intern->array;
|
||||
*gc_data_count = 1;
|
||||
return zend_std_get_properties(object TSRMLS_CC);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
static zval *spl_array_read_property(zval *object, zval *member, int type, const zend_literal *key TSRMLS_DC) /* {{{ */
|
||||
{
|
||||
spl_array_object *intern = (spl_array_object*)zend_object_store_get_object(object TSRMLS_CC);
|
||||
@@ -1961,6 +1971,7 @@ PHP_MINIT_FUNCTION(spl_array)
|
||||
|
||||
spl_handler_ArrayObject.get_properties = spl_array_get_properties;
|
||||
spl_handler_ArrayObject.get_debug_info = spl_array_get_debug_info;
|
||||
spl_handler_ArrayObject.get_gc = spl_array_get_gc;
|
||||
spl_handler_ArrayObject.read_property = spl_array_read_property;
|
||||
spl_handler_ArrayObject.write_property = spl_array_write_property;
|
||||
spl_handler_ArrayObject.get_property_ptr_ptr = spl_array_get_property_ptr_ptr;
|
||||
|
||||
+111
-107
@@ -79,9 +79,9 @@ static void spl_filesystem_object_free_storage(void *object TSRMLS_DC) /* {{{ */
|
||||
if (intern->oth_handler && intern->oth_handler->dtor) {
|
||||
intern->oth_handler->dtor(intern TSRMLS_CC);
|
||||
}
|
||||
|
||||
|
||||
zend_object_std_dtor(&intern->std TSRMLS_CC);
|
||||
|
||||
|
||||
if (intern->_path) {
|
||||
efree(intern->_path);
|
||||
}
|
||||
@@ -98,7 +98,7 @@ static void spl_filesystem_object_free_storage(void *object TSRMLS_DC) /* {{{ */
|
||||
}
|
||||
if (intern->u.dir.sub_path) {
|
||||
efree(intern->u.dir.sub_path);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case SPL_FS_FILE:
|
||||
if (intern->u.file.stream) {
|
||||
@@ -134,13 +134,13 @@ static void spl_filesystem_object_free_storage(void *object TSRMLS_DC) /* {{{ */
|
||||
} /* }}} */
|
||||
|
||||
/* {{{ spl_ce_dir_object_new */
|
||||
/* creates the object by
|
||||
- allocating memory
|
||||
/* creates the object by
|
||||
- allocating memory
|
||||
- initializing the object members
|
||||
- storing the object
|
||||
- setting it's handlers
|
||||
|
||||
called from
|
||||
called from
|
||||
- clone
|
||||
- new
|
||||
*/
|
||||
@@ -313,7 +313,7 @@ static int spl_filesystem_file_open(spl_filesystem_object *intern, int use_inclu
|
||||
/* avoid reference counting in debug mode, thus do it manually */
|
||||
ZVAL_RESOURCE(&intern->u.file.zresource, php_stream_get_resource_id(intern->u.file.stream));
|
||||
Z_SET_REFCOUNT(intern->u.file.zresource, 1);
|
||||
|
||||
|
||||
intern->u.file.delimiter = ',';
|
||||
intern->u.file.enclosure = '"';
|
||||
intern->u.file.escape = '\\';
|
||||
@@ -325,7 +325,7 @@ static int spl_filesystem_file_open(spl_filesystem_object *intern, int use_inclu
|
||||
|
||||
/* {{{ spl_filesystem_object_clone */
|
||||
/* Local zend_object_value creation (on stack)
|
||||
Load the 'other' object
|
||||
Load the 'other' object
|
||||
Create a new empty object (See spl_filesystem_object_new_ex)
|
||||
Open the directory
|
||||
Clone other members (properties)
|
||||
@@ -370,7 +370,7 @@ static zend_object_value spl_filesystem_object_clone(zval *zobject TSRMLS_DC)
|
||||
php_error_docref(NULL TSRMLS_CC, E_ERROR, "An object of class %s cannot be cloned", old_object->ce->name);
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
intern->file_class = source->file_class;
|
||||
intern->info_class = source->info_class;
|
||||
intern->oth = source->oth;
|
||||
@@ -389,7 +389,7 @@ static zend_object_value spl_filesystem_object_clone(zval *zobject TSRMLS_DC)
|
||||
void spl_filesystem_info_set_filename(spl_filesystem_object *intern, char *path, int len, int use_copy TSRMLS_DC) /* {{{ */
|
||||
{
|
||||
char *p1, *p2;
|
||||
|
||||
|
||||
if (intern->file_name) {
|
||||
efree(intern->file_name);
|
||||
}
|
||||
@@ -413,7 +413,7 @@ void spl_filesystem_info_set_filename(spl_filesystem_object *intern, char *path,
|
||||
} else {
|
||||
intern->_path_len = 0;
|
||||
}
|
||||
|
||||
|
||||
if (intern->_path) {
|
||||
efree(intern->_path);
|
||||
}
|
||||
@@ -459,7 +459,7 @@ static spl_filesystem_object * spl_filesystem_object_create_info(spl_filesystem_
|
||||
} else {
|
||||
spl_filesystem_info_set_filename(intern, file_path, file_path_len, use_copy TSRMLS_CC);
|
||||
}
|
||||
|
||||
|
||||
zend_restore_error_handling(&error_handling TSRMLS_CC);
|
||||
return intern;
|
||||
} /* }}} */
|
||||
@@ -514,7 +514,7 @@ static spl_filesystem_object * spl_filesystem_object_create_type(int ht, spl_fil
|
||||
|
||||
return_value->value.obj = spl_filesystem_object_new_ex(ce, &intern TSRMLS_CC);
|
||||
Z_TYPE_P(return_value) = IS_OBJECT;
|
||||
|
||||
|
||||
spl_filesystem_object_get_file_name(source TSRMLS_CC);
|
||||
|
||||
if (ce->constructor->common.scope != spl_ce_SplFileObject) {
|
||||
@@ -530,12 +530,12 @@ static spl_filesystem_object * spl_filesystem_object_create_type(int ht, spl_fil
|
||||
intern->file_name_len = source->file_name_len;
|
||||
intern->_path = spl_filesystem_object_get_path(source, &intern->_path_len TSRMLS_CC);
|
||||
intern->_path = estrndup(intern->_path, intern->_path_len);
|
||||
|
||||
|
||||
intern->u.file.open_mode = "r";
|
||||
intern->u.file.open_mode_len = 1;
|
||||
|
||||
if (ht && zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|sbr",
|
||||
&intern->u.file.open_mode, &intern->u.file.open_mode_len,
|
||||
|
||||
if (ht && zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|sbr",
|
||||
&intern->u.file.open_mode, &intern->u.file.open_mode_len,
|
||||
&use_include_path, &intern->u.file.zcontext) == FAILURE) {
|
||||
zend_restore_error_handling(&error_handling TSRMLS_CC);
|
||||
intern->u.file.open_mode = NULL;
|
||||
@@ -544,7 +544,7 @@ static spl_filesystem_object * spl_filesystem_object_create_type(int ht, spl_fil
|
||||
Z_TYPE_P(return_value) = IS_NULL;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
if (spl_filesystem_file_open(intern, use_include_path, 0 TSRMLS_CC) == FAILURE) {
|
||||
zend_restore_error_handling(&error_handling TSRMLS_CC);
|
||||
zval_dtor(return_value);
|
||||
@@ -553,7 +553,7 @@ static spl_filesystem_object * spl_filesystem_object_create_type(int ht, spl_fil
|
||||
}
|
||||
}
|
||||
break;
|
||||
case SPL_FS_DIR:
|
||||
case SPL_FS_DIR:
|
||||
zend_restore_error_handling(&error_handling TSRMLS_CC);
|
||||
zend_throw_exception_ex(spl_ce_RuntimeException, 0 TSRMLS_CC, "Operation not supported");
|
||||
return NULL;
|
||||
@@ -617,7 +617,7 @@ static HashTable* spl_filesystem_object_get_debug_info(zval *obj, int *is_temp T
|
||||
if (intern->file_name) {
|
||||
pnstr = spl_gen_private_prop_name(spl_ce_SplFileInfo, "fileName", sizeof("fileName")-1, &pnlen TSRMLS_CC);
|
||||
spl_filesystem_object_get_path(intern, &path_len TSRMLS_CC);
|
||||
|
||||
|
||||
if (path_len && path_len < intern->file_name_len) {
|
||||
add_assoc_stringl_ex(&zrv, pnstr, pnlen+1, intern->file_name + path_len + 1, intern->file_name_len - (path_len + 1), 1);
|
||||
} else {
|
||||
@@ -665,13 +665,13 @@ static HashTable* spl_filesystem_object_get_debug_info(zval *obj, int *is_temp T
|
||||
zend_function *spl_filesystem_object_get_method_check(zval **object_ptr, char *method, int method_len, const struct _zend_literal *key TSRMLS_DC) /* {{{ */
|
||||
{
|
||||
spl_filesystem_object *fsobj = zend_object_store_get_object(*object_ptr TSRMLS_CC);
|
||||
|
||||
|
||||
if (fsobj->u.dir.entry.d_name[0] == '\0' && fsobj->orig_path == NULL) {
|
||||
method = "_bad_state_ex";
|
||||
method_len = sizeof("_bad_state_ex") - 1;
|
||||
key = NULL;
|
||||
}
|
||||
|
||||
|
||||
return zend_get_std_object_handlers()->get_method(object_ptr, method, method_len, key TSRMLS_CC);
|
||||
}
|
||||
/* }}} */
|
||||
@@ -751,7 +751,7 @@ SPL_METHOD(DirectoryIterator, __construct)
|
||||
SPL_METHOD(DirectoryIterator, rewind)
|
||||
{
|
||||
spl_filesystem_object *intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
|
||||
|
||||
|
||||
if (zend_parse_parameters_none() == FAILURE) {
|
||||
return;
|
||||
}
|
||||
@@ -769,7 +769,7 @@ SPL_METHOD(DirectoryIterator, rewind)
|
||||
SPL_METHOD(DirectoryIterator, key)
|
||||
{
|
||||
spl_filesystem_object *intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
|
||||
|
||||
|
||||
if (zend_parse_parameters_none() == FAILURE) {
|
||||
return;
|
||||
}
|
||||
@@ -799,7 +799,7 @@ SPL_METHOD(DirectoryIterator, next)
|
||||
{
|
||||
spl_filesystem_object *intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
|
||||
int skip_dots = SPL_HAS_FLAG(intern->flags, SPL_FILE_DIR_SKIPDOTS);
|
||||
|
||||
|
||||
if (zend_parse_parameters_none() == FAILURE) {
|
||||
return;
|
||||
}
|
||||
@@ -859,7 +859,7 @@ SPL_METHOD(DirectoryIterator, seek)
|
||||
SPL_METHOD(DirectoryIterator, valid)
|
||||
{
|
||||
spl_filesystem_object *intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
|
||||
|
||||
|
||||
if (zend_parse_parameters_none() == FAILURE) {
|
||||
return;
|
||||
}
|
||||
@@ -875,7 +875,7 @@ SPL_METHOD(SplFileInfo, getPath)
|
||||
spl_filesystem_object *intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
|
||||
char *path;
|
||||
int path_len;
|
||||
|
||||
|
||||
if (zend_parse_parameters_none() == FAILURE) {
|
||||
return;
|
||||
}
|
||||
@@ -891,13 +891,13 @@ SPL_METHOD(SplFileInfo, getFilename)
|
||||
{
|
||||
spl_filesystem_object *intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
|
||||
int path_len;
|
||||
|
||||
|
||||
if (zend_parse_parameters_none() == FAILURE) {
|
||||
return;
|
||||
}
|
||||
|
||||
spl_filesystem_object_get_path(intern, &path_len TSRMLS_CC);
|
||||
|
||||
|
||||
if (path_len && path_len < intern->file_name_len) {
|
||||
RETURN_STRINGL(intern->file_name + path_len + 1, intern->file_name_len - (path_len + 1), 1);
|
||||
} else {
|
||||
@@ -911,7 +911,7 @@ SPL_METHOD(SplFileInfo, getFilename)
|
||||
SPL_METHOD(DirectoryIterator, getFilename)
|
||||
{
|
||||
spl_filesystem_object *intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
|
||||
|
||||
|
||||
if (zend_parse_parameters_none() == FAILURE) {
|
||||
return;
|
||||
}
|
||||
@@ -1019,7 +1019,7 @@ SPL_METHOD(SplFileInfo, getBasename)
|
||||
|
||||
RETURN_STRINGL(fname, flen, 0);
|
||||
}
|
||||
/* }}}*/
|
||||
/* }}}*/
|
||||
|
||||
/* {{{ proto string DirectoryIterator::getBasename([string $suffix]) U
|
||||
Returns filename component of current dir entry */
|
||||
@@ -1029,7 +1029,7 @@ SPL_METHOD(DirectoryIterator, getBasename)
|
||||
char *suffix = 0, *fname;
|
||||
int slen = 0;
|
||||
size_t flen;
|
||||
|
||||
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s", &suffix, &slen) == FAILURE) {
|
||||
return;
|
||||
}
|
||||
@@ -1065,7 +1065,7 @@ SPL_METHOD(SplFileInfo, getPathname)
|
||||
SPL_METHOD(FilesystemIterator, key)
|
||||
{
|
||||
spl_filesystem_object *intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
|
||||
|
||||
|
||||
if (zend_parse_parameters_none() == FAILURE) {
|
||||
return;
|
||||
}
|
||||
@@ -1084,7 +1084,7 @@ SPL_METHOD(FilesystemIterator, key)
|
||||
SPL_METHOD(FilesystemIterator, current)
|
||||
{
|
||||
spl_filesystem_object *intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
|
||||
|
||||
|
||||
if (zend_parse_parameters_none() == FAILURE) {
|
||||
return;
|
||||
}
|
||||
@@ -1107,7 +1107,7 @@ SPL_METHOD(FilesystemIterator, current)
|
||||
SPL_METHOD(DirectoryIterator, isDot)
|
||||
{
|
||||
spl_filesystem_object *intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
|
||||
|
||||
|
||||
if (zend_parse_parameters_none() == FAILURE) {
|
||||
return;
|
||||
}
|
||||
@@ -1121,8 +1121,8 @@ SPL_METHOD(DirectoryIterator, isDot)
|
||||
/* zend_replace_error_handling() is used to throw exceptions in case
|
||||
the constructor fails. Here we use this to ensure the object
|
||||
has a valid directory resource.
|
||||
|
||||
When the constructor gets called the object is already created
|
||||
|
||||
When the constructor gets called the object is already created
|
||||
by the engine, so we must only call 'additional' initializations.
|
||||
*/
|
||||
SPL_METHOD(SplFileInfo, __construct)
|
||||
@@ -1140,11 +1140,11 @@ SPL_METHOD(SplFileInfo, __construct)
|
||||
}
|
||||
|
||||
intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
|
||||
|
||||
|
||||
spl_filesystem_info_set_filename(intern, path, len, 1 TSRMLS_CC);
|
||||
|
||||
zend_restore_error_handling(&error_handling TSRMLS_CC);
|
||||
|
||||
|
||||
/* intern->type = SPL_FS_INFO; already set */
|
||||
}
|
||||
/* }}} */
|
||||
@@ -1249,7 +1249,7 @@ SPL_METHOD(SplFileInfo, getLinkTarget)
|
||||
int ret;
|
||||
char buff[MAXPATHLEN];
|
||||
zend_error_handling error_handling;
|
||||
|
||||
|
||||
if (zend_parse_parameters_none() == FAILURE) {
|
||||
return;
|
||||
}
|
||||
@@ -1297,7 +1297,7 @@ SPL_METHOD(SplFileInfo, getRealPath)
|
||||
char buff[MAXPATHLEN];
|
||||
char *filename;
|
||||
zend_error_handling error_handling;
|
||||
|
||||
|
||||
if (zend_parse_parameters_none() == FAILURE) {
|
||||
return;
|
||||
}
|
||||
@@ -1307,10 +1307,10 @@ SPL_METHOD(SplFileInfo, getRealPath)
|
||||
if (intern->type == SPL_FS_DIR && !intern->file_name && intern->u.dir.entry.d_name[0]) {
|
||||
spl_filesystem_object_get_file_name(intern TSRMLS_CC);
|
||||
}
|
||||
|
||||
|
||||
if (intern->orig_path) {
|
||||
filename = intern->orig_path;
|
||||
} else {
|
||||
} else {
|
||||
filename = intern->file_name;
|
||||
}
|
||||
|
||||
@@ -1348,7 +1348,7 @@ SPL_METHOD(SplFileInfo, setFileClass)
|
||||
spl_filesystem_object *intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
|
||||
zend_class_entry *ce = spl_ce_SplFileObject;
|
||||
zend_error_handling error_handling;
|
||||
|
||||
|
||||
zend_replace_error_handling(EH_THROW, spl_ce_UnexpectedValueException, &error_handling TSRMLS_CC);
|
||||
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|C", &ce) == SUCCESS) {
|
||||
@@ -1366,7 +1366,7 @@ SPL_METHOD(SplFileInfo, setInfoClass)
|
||||
spl_filesystem_object *intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
|
||||
zend_class_entry *ce = spl_ce_SplFileInfo;
|
||||
zend_error_handling error_handling;
|
||||
|
||||
|
||||
zend_replace_error_handling(EH_THROW, spl_ce_UnexpectedValueException, &error_handling TSRMLS_CC);
|
||||
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|C", &ce) == SUCCESS) {
|
||||
@@ -1384,7 +1384,7 @@ SPL_METHOD(SplFileInfo, getFileInfo)
|
||||
spl_filesystem_object *intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
|
||||
zend_class_entry *ce = intern->info_class;
|
||||
zend_error_handling error_handling;
|
||||
|
||||
|
||||
zend_replace_error_handling(EH_THROW, spl_ce_UnexpectedValueException, &error_handling TSRMLS_CC);
|
||||
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|C", &ce) == SUCCESS) {
|
||||
@@ -1402,7 +1402,7 @@ SPL_METHOD(SplFileInfo, getPathInfo)
|
||||
spl_filesystem_object *intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
|
||||
zend_class_entry *ce = intern->info_class;
|
||||
zend_error_handling error_handling;
|
||||
|
||||
|
||||
zend_replace_error_handling(EH_THROW, spl_ce_UnexpectedValueException, &error_handling TSRMLS_CC);
|
||||
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|C", &ce) == SUCCESS) {
|
||||
@@ -1463,7 +1463,7 @@ SPL_METHOD(FilesystemIterator, rewind)
|
||||
SPL_METHOD(FilesystemIterator, getFlags)
|
||||
{
|
||||
spl_filesystem_object *intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
|
||||
|
||||
|
||||
if (zend_parse_parameters_none() == FAILURE) {
|
||||
return;
|
||||
}
|
||||
@@ -1519,11 +1519,11 @@ SPL_METHOD(RecursiveDirectoryIterator, getChildren)
|
||||
spl_filesystem_object *intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
|
||||
spl_filesystem_object *subdir;
|
||||
char slash = SPL_HAS_FLAG(intern->flags, SPL_FILE_DIR_UNIXPATHS) ? '/' : DEFAULT_SLASH;
|
||||
|
||||
|
||||
if (zend_parse_parameters_none() == FAILURE) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
spl_filesystem_object_get_file_name(intern TSRMLS_CC);
|
||||
|
||||
MAKE_STD_ZVAL(zflags);
|
||||
@@ -1554,7 +1554,7 @@ SPL_METHOD(RecursiveDirectoryIterator, getChildren)
|
||||
SPL_METHOD(RecursiveDirectoryIterator, getSubPath)
|
||||
{
|
||||
spl_filesystem_object *intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
|
||||
|
||||
|
||||
if (zend_parse_parameters_none() == FAILURE) {
|
||||
return;
|
||||
}
|
||||
@@ -1575,7 +1575,7 @@ SPL_METHOD(RecursiveDirectoryIterator, getSubPathname)
|
||||
char *sub_name;
|
||||
int len;
|
||||
char slash = SPL_HAS_FLAG(intern->flags, SPL_FILE_DIR_UNIXPATHS) ? '/' : DEFAULT_SLASH;
|
||||
|
||||
|
||||
if (zend_parse_parameters_none() == FAILURE) {
|
||||
return;
|
||||
}
|
||||
@@ -1611,7 +1611,7 @@ SPL_METHOD(GlobIterator, __construct)
|
||||
SPL_METHOD(GlobIterator, count)
|
||||
{
|
||||
spl_filesystem_object *intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
|
||||
|
||||
|
||||
if (zend_parse_parameters_none() == FAILURE) {
|
||||
return;
|
||||
}
|
||||
@@ -1666,7 +1666,7 @@ zend_object_iterator *spl_filesystem_dir_get_iterator(zend_class_entry *ce, zval
|
||||
iterator->current = object;
|
||||
}
|
||||
zval_add_ref(&object);
|
||||
|
||||
|
||||
return (zend_object_iterator*)iterator;
|
||||
}
|
||||
/* }}} */
|
||||
@@ -1701,7 +1701,7 @@ static int spl_filesystem_dir_it_valid(zend_object_iterator *iter TSRMLS_DC)
|
||||
static void spl_filesystem_dir_it_current_data(zend_object_iterator *iter, zval ***data TSRMLS_DC)
|
||||
{
|
||||
spl_filesystem_iterator *iterator = (spl_filesystem_iterator *)iter;
|
||||
|
||||
|
||||
*data = &iterator->current;
|
||||
}
|
||||
/* }}} */
|
||||
@@ -1719,7 +1719,7 @@ static void spl_filesystem_dir_it_current_key(zend_object_iterator *iter, zval *
|
||||
static void spl_filesystem_dir_it_move_forward(zend_object_iterator *iter TSRMLS_DC)
|
||||
{
|
||||
spl_filesystem_object *object = spl_filesystem_iterator_to_object((spl_filesystem_iterator *)iter);
|
||||
|
||||
|
||||
object->u.dir.index++;
|
||||
spl_filesystem_dir_read(object TSRMLS_CC);
|
||||
if (object->file_name) {
|
||||
@@ -1733,7 +1733,7 @@ static void spl_filesystem_dir_it_move_forward(zend_object_iterator *iter TSRMLS
|
||||
static void spl_filesystem_dir_it_rewind(zend_object_iterator *iter TSRMLS_DC)
|
||||
{
|
||||
spl_filesystem_object *object = spl_filesystem_iterator_to_object((spl_filesystem_iterator *)iter);
|
||||
|
||||
|
||||
object->u.dir.index = 0;
|
||||
if (object->u.dir.dirp) {
|
||||
php_stream_rewinddir(object->u.dir.dirp);
|
||||
@@ -1803,7 +1803,7 @@ static void spl_filesystem_tree_it_move_forward(zend_object_iterator *iter TSRML
|
||||
{
|
||||
spl_filesystem_iterator *iterator = (spl_filesystem_iterator *)iter;
|
||||
spl_filesystem_object *object = spl_filesystem_iterator_to_object(iterator);
|
||||
|
||||
|
||||
object->u.dir.index++;
|
||||
do {
|
||||
spl_filesystem_dir_read(object TSRMLS_CC);
|
||||
@@ -1824,7 +1824,7 @@ static void spl_filesystem_tree_it_rewind(zend_object_iterator *iter TSRMLS_DC)
|
||||
{
|
||||
spl_filesystem_iterator *iterator = (spl_filesystem_iterator *)iter;
|
||||
spl_filesystem_object *object = spl_filesystem_iterator_to_object(iterator);
|
||||
|
||||
|
||||
object->u.dir.index = 0;
|
||||
if (object->u.dir.dirp) {
|
||||
php_stream_rewinddir(object->u.dir.dirp);
|
||||
@@ -1868,7 +1868,7 @@ zend_object_iterator *spl_filesystem_tree_get_iterator(zend_class_entry *ce, zva
|
||||
iterator->intern.funcs = &spl_filesystem_tree_it_funcs;
|
||||
}
|
||||
zval_add_ref(&object);
|
||||
|
||||
|
||||
return (zend_object_iterator*)iterator;
|
||||
}
|
||||
/* }}} */
|
||||
@@ -1924,7 +1924,7 @@ static int spl_filesystem_object_cast(zval *readobj, zval *writeobj, int type TS
|
||||
|
||||
/* {{{ declare method parameters */
|
||||
/* supply a name and default to call by parameter */
|
||||
ZEND_BEGIN_ARG_INFO(arginfo_info___construct, 0)
|
||||
ZEND_BEGIN_ARG_INFO(arginfo_info___construct, 0)
|
||||
ZEND_ARG_INFO(0, file_name)
|
||||
ZEND_END_ARG_INFO()
|
||||
|
||||
@@ -1983,11 +1983,11 @@ static const zend_function_entry spl_SplFileInfo_functions[] = {
|
||||
PHP_FE_END
|
||||
};
|
||||
|
||||
ZEND_BEGIN_ARG_INFO(arginfo_dir___construct, 0)
|
||||
ZEND_BEGIN_ARG_INFO(arginfo_dir___construct, 0)
|
||||
ZEND_ARG_INFO(0, path)
|
||||
ZEND_END_ARG_INFO()
|
||||
|
||||
ZEND_BEGIN_ARG_INFO(arginfo_dir_it_seek, 0)
|
||||
ZEND_BEGIN_ARG_INFO(arginfo_dir_it_seek, 0)
|
||||
ZEND_ARG_INFO(0, position)
|
||||
ZEND_END_ARG_INFO();
|
||||
|
||||
@@ -2009,7 +2009,7 @@ static const zend_function_entry spl_DirectoryIterator_functions[] = {
|
||||
PHP_FE_END
|
||||
};
|
||||
|
||||
ZEND_BEGIN_ARG_INFO_EX(arginfo_r_dir___construct, 0, 0, 1)
|
||||
ZEND_BEGIN_ARG_INFO_EX(arginfo_r_dir___construct, 0, 0, 1)
|
||||
ZEND_ARG_INFO(0, path)
|
||||
ZEND_ARG_INFO(0, flags)
|
||||
ZEND_END_ARG_INFO()
|
||||
@@ -2058,7 +2058,7 @@ static int spl_filesystem_file_read(spl_filesystem_object *intern, int silent TS
|
||||
long line_add = (intern->u.file.current_line || intern->u.file.current_zval) ? 1 : 0;
|
||||
|
||||
spl_filesystem_file_free_line(intern TSRMLS_CC);
|
||||
|
||||
|
||||
if (php_stream_eof(intern->u.file.stream)) {
|
||||
if (!silent) {
|
||||
zend_throw_exception_ex(spl_ce_RuntimeException, 0 TSRMLS_CC, "Cannot read from file %s", intern->file_name);
|
||||
@@ -2086,7 +2086,7 @@ static int spl_filesystem_file_read(spl_filesystem_object *intern, int silent TS
|
||||
line_len = strcspn(buf, "\r\n");
|
||||
buf[line_len] = '\0';
|
||||
}
|
||||
|
||||
|
||||
intern->u.file.current_line = buf;
|
||||
intern->u.file.current_line_len = line_len;
|
||||
}
|
||||
@@ -2107,7 +2107,7 @@ static int spl_filesystem_file_call(spl_filesystem_object *intern, zend_function
|
||||
zval ***params = (zval***)safe_emalloc(num_args, sizeof(zval**), 0);
|
||||
|
||||
params[0] = &zresource_ptr;
|
||||
|
||||
|
||||
if (arg2) {
|
||||
params[1] = &arg2;
|
||||
}
|
||||
@@ -2133,7 +2133,7 @@ static int spl_filesystem_file_call(spl_filesystem_object *intern, zend_function
|
||||
fcic.object_ptr = NULL;
|
||||
|
||||
result = zend_call_function(&fci, &fcic TSRMLS_CC);
|
||||
|
||||
|
||||
if (result == FAILURE) {
|
||||
RETVAL_FALSE;
|
||||
} else {
|
||||
@@ -2159,11 +2159,11 @@ static int spl_filesystem_file_call(spl_filesystem_object *intern, zend_function
|
||||
static int spl_filesystem_file_read_csv(spl_filesystem_object *intern, char delimiter, char enclosure, char escape, zval *return_value TSRMLS_DC) /* {{{ */
|
||||
{
|
||||
int ret = SUCCESS;
|
||||
|
||||
|
||||
do {
|
||||
ret = spl_filesystem_file_read(intern, 1 TSRMLS_CC);
|
||||
} while (ret == SUCCESS && !intern->u.file.current_line_len && SPL_HAS_FLAG(intern->flags, SPL_FILE_OBJECT_SKIP_EMPTY));
|
||||
|
||||
|
||||
if (ret == SUCCESS) {
|
||||
size_t buf_len = intern->u.file.current_line_len;
|
||||
char *buf = estrndup(intern->u.file.current_line, buf_len);
|
||||
@@ -2237,7 +2237,7 @@ static int spl_filesystem_file_is_empty_line(spl_filesystem_object *intern TSRML
|
||||
if (SPL_HAS_FLAG(intern->flags, SPL_FILE_OBJECT_READ_CSV)
|
||||
&& zend_hash_num_elements(Z_ARRVAL_P(intern->u.file.current_zval)) == 1) {
|
||||
zval ** first = Z_ARRVAL_P(intern->u.file.current_zval)->pListHead->pData;
|
||||
|
||||
|
||||
return Z_TYPE_PP(first) == IS_STRING && Z_STRLEN_PP(first) == 0;
|
||||
}
|
||||
return zend_hash_num_elements(Z_ARRVAL_P(intern->u.file.current_zval)) == 0;
|
||||
@@ -2260,7 +2260,7 @@ static int spl_filesystem_file_read_line(zval * this_ptr, spl_filesystem_object
|
||||
spl_filesystem_file_free_line(intern TSRMLS_CC);
|
||||
ret = spl_filesystem_file_read_line_ex(this_ptr, intern, silent TSRMLS_CC);
|
||||
}
|
||||
|
||||
|
||||
return ret;
|
||||
}
|
||||
/* }}} */
|
||||
@@ -2294,16 +2294,16 @@ SPL_METHOD(SplFileObject, __construct)
|
||||
intern->u.file.open_mode = NULL;
|
||||
intern->u.file.open_mode_len = 0;
|
||||
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "p|sbr!",
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "p|sbr!",
|
||||
&intern->file_name, &intern->file_name_len,
|
||||
&intern->u.file.open_mode, &intern->u.file.open_mode_len,
|
||||
&use_include_path, &intern->u.file.zcontext) == FAILURE) {
|
||||
&intern->u.file.open_mode, &intern->u.file.open_mode_len,
|
||||
&use_include_path, &intern->u.file.zcontext) == FAILURE) {
|
||||
intern->u.file.open_mode = NULL;
|
||||
intern->file_name = NULL;
|
||||
zend_restore_error_handling(&error_handling TSRMLS_CC);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if (intern->u.file.open_mode == NULL) {
|
||||
intern->u.file.open_mode = "r";
|
||||
intern->u.file.open_mode_len = 1;
|
||||
@@ -2368,7 +2368,7 @@ SPL_METHOD(SplTempFileObject, __construct)
|
||||
intern->u.file.open_mode = "wb";
|
||||
intern->u.file.open_mode_len = 1;
|
||||
intern->u.file.zcontext = NULL;
|
||||
|
||||
|
||||
if (spl_filesystem_file_open(intern, 0, 0 TSRMLS_CC) == SUCCESS) {
|
||||
intern->_path_len = 0;
|
||||
intern->_path = estrndup("", 0);
|
||||
@@ -2381,7 +2381,7 @@ SPL_METHOD(SplTempFileObject, __construct)
|
||||
SPL_METHOD(SplFileObject, rewind)
|
||||
{
|
||||
spl_filesystem_object *intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
|
||||
|
||||
|
||||
if (zend_parse_parameters_none() == FAILURE) {
|
||||
return;
|
||||
}
|
||||
@@ -2394,7 +2394,7 @@ SPL_METHOD(SplFileObject, rewind)
|
||||
SPL_METHOD(SplFileObject, eof)
|
||||
{
|
||||
spl_filesystem_object *intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
|
||||
|
||||
|
||||
if (zend_parse_parameters_none() == FAILURE) {
|
||||
return;
|
||||
}
|
||||
@@ -2407,7 +2407,7 @@ SPL_METHOD(SplFileObject, eof)
|
||||
SPL_METHOD(SplFileObject, valid)
|
||||
{
|
||||
spl_filesystem_object *intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
|
||||
|
||||
|
||||
if (zend_parse_parameters_none() == FAILURE) {
|
||||
return;
|
||||
}
|
||||
@@ -2424,7 +2424,7 @@ SPL_METHOD(SplFileObject, valid)
|
||||
SPL_METHOD(SplFileObject, fgets)
|
||||
{
|
||||
spl_filesystem_object *intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
|
||||
|
||||
|
||||
if (zend_parse_parameters_none() == FAILURE) {
|
||||
return;
|
||||
}
|
||||
@@ -2440,7 +2440,7 @@ SPL_METHOD(SplFileObject, fgets)
|
||||
SPL_METHOD(SplFileObject, current)
|
||||
{
|
||||
spl_filesystem_object *intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
|
||||
|
||||
|
||||
if (zend_parse_parameters_none() == FAILURE) {
|
||||
return;
|
||||
}
|
||||
@@ -2461,7 +2461,7 @@ SPL_METHOD(SplFileObject, current)
|
||||
SPL_METHOD(SplFileObject, key)
|
||||
{
|
||||
spl_filesystem_object *intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
|
||||
|
||||
|
||||
if (zend_parse_parameters_none() == FAILURE) {
|
||||
return;
|
||||
}
|
||||
@@ -2478,7 +2478,7 @@ SPL_METHOD(SplFileObject, key)
|
||||
SPL_METHOD(SplFileObject, next)
|
||||
{
|
||||
spl_filesystem_object *intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
|
||||
|
||||
|
||||
if (zend_parse_parameters_none() == FAILURE) {
|
||||
return;
|
||||
}
|
||||
@@ -2530,7 +2530,7 @@ SPL_METHOD(SplFileObject, setMaxLineLen)
|
||||
zend_throw_exception_ex(spl_ce_DomainException, 0 TSRMLS_CC, "Maximum line length must be greater than or equal zero");
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
intern->u.file.max_line_len = max_len;
|
||||
} /* }}} */
|
||||
|
||||
@@ -2539,7 +2539,7 @@ SPL_METHOD(SplFileObject, setMaxLineLen)
|
||||
SPL_METHOD(SplFileObject, getMaxLineLen)
|
||||
{
|
||||
spl_filesystem_object *intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
|
||||
|
||||
|
||||
if (zend_parse_parameters_none() == FAILURE) {
|
||||
return;
|
||||
}
|
||||
@@ -2554,7 +2554,7 @@ SPL_METHOD(SplFileObject, hasChildren)
|
||||
if (zend_parse_parameters_none() == FAILURE) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
RETURN_FALSE;
|
||||
} /* }}} */
|
||||
|
||||
@@ -2585,7 +2585,7 @@ SPL_METHOD(SplFileObject, fgetcsv)
|
||||
char delimiter = intern->u.file.delimiter, enclosure = intern->u.file.enclosure, escape = intern->u.file.escape;
|
||||
char *delim = NULL, *enclo = NULL, *esc = NULL;
|
||||
int d_len = 0, e_len = 0, esc_len = 0;
|
||||
|
||||
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|sss", &delim, &d_len, &enclo, &e_len, &esc, &esc_len) == SUCCESS) {
|
||||
switch(ZEND_NUM_ARGS())
|
||||
{
|
||||
@@ -2627,7 +2627,7 @@ SPL_METHOD(SplFileObject, fputcsv)
|
||||
char *delim = NULL, *enclo = NULL, *esc = NULL;
|
||||
int d_len = 0, e_len = 0, esc_len = 0, ret;
|
||||
zval *fields = NULL;
|
||||
|
||||
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a|sss", &fields, &delim, &d_len, &enclo, &e_len, &esc, &esc_len) == SUCCESS) {
|
||||
switch(ZEND_NUM_ARGS())
|
||||
{
|
||||
@@ -2670,7 +2670,7 @@ SPL_METHOD(SplFileObject, setCsvControl)
|
||||
char delimiter = ',', enclosure = '"', escape='\\';
|
||||
char *delim = NULL, *enclo = NULL, *esc = NULL;
|
||||
int d_len = 0, e_len = 0, esc_len = 0;
|
||||
|
||||
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|sss", &delim, &d_len, &enclo, &e_len, &esc, &esc_len) == SUCCESS) {
|
||||
switch(ZEND_NUM_ARGS())
|
||||
{
|
||||
@@ -2713,7 +2713,7 @@ SPL_METHOD(SplFileObject, getCsvControl)
|
||||
char delimiter[2], enclosure[2];
|
||||
|
||||
array_init(return_value);
|
||||
|
||||
|
||||
delimiter[0] = intern->u.file.delimiter;
|
||||
delimiter[1] = '\0';
|
||||
enclosure[0] = intern->u.file.enclosure;
|
||||
@@ -2742,7 +2742,7 @@ SPL_METHOD(SplFileObject, fflush)
|
||||
Return current file position */
|
||||
SPL_METHOD(SplFileObject, ftell)
|
||||
{
|
||||
spl_filesystem_object *intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
|
||||
spl_filesystem_object *intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
|
||||
long ret = php_stream_tell(intern->u.file.stream);
|
||||
|
||||
if (ret == -1) {
|
||||
@@ -2872,6 +2872,10 @@ SPL_METHOD(SplFileObject, fread)
|
||||
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Length parameter must be greater than 0");
|
||||
RETURN_FALSE;
|
||||
}
|
||||
if (length > INT_MAX) {
|
||||
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Length parameter must be no more than %d", INT_MAX);
|
||||
RETURN_FALSE;
|
||||
}
|
||||
|
||||
Z_STRVAL_P(return_value) = emalloc(length + 1);
|
||||
Z_STRLEN_P(return_value) = php_stream_read(intern->u.file.stream, Z_STRVAL_P(return_value), length);
|
||||
@@ -2892,7 +2896,7 @@ SPL_METHOD(SplFileObject, ftruncate)
|
||||
{
|
||||
spl_filesystem_object *intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
|
||||
long size;
|
||||
|
||||
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &size) == FAILURE) {
|
||||
return;
|
||||
}
|
||||
@@ -2901,7 +2905,7 @@ SPL_METHOD(SplFileObject, ftruncate)
|
||||
zend_throw_exception_ex(spl_ce_LogicException, 0 TSRMLS_CC, "Can't truncate file %s", intern->file_name);
|
||||
RETURN_FALSE;
|
||||
}
|
||||
|
||||
|
||||
RETURN_BOOL(0 == php_stream_truncate_set_size(intern->u.file.stream, size));
|
||||
} /* }}} */
|
||||
|
||||
@@ -2911,17 +2915,17 @@ SPL_METHOD(SplFileObject, seek)
|
||||
{
|
||||
spl_filesystem_object *intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
|
||||
long line_pos;
|
||||
|
||||
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &line_pos) == FAILURE) {
|
||||
return;
|
||||
}
|
||||
if (line_pos < 0) {
|
||||
zend_throw_exception_ex(spl_ce_LogicException, 0 TSRMLS_CC, "Can't seek file %s to negative line %ld", intern->file_name, line_pos);
|
||||
RETURN_FALSE;
|
||||
RETURN_FALSE;
|
||||
}
|
||||
|
||||
|
||||
spl_filesystem_file_rewind(getThis(), intern TSRMLS_CC);
|
||||
|
||||
|
||||
while(intern->u.file.current_line_num < line_pos) {
|
||||
if (spl_filesystem_file_read_line(getThis(), intern, 1 TSRMLS_CC) == FAILURE) {
|
||||
break;
|
||||
@@ -2958,25 +2962,25 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_file_object_fputcsv, 0, 0, 1)
|
||||
ZEND_ARG_INFO(0, escape)
|
||||
ZEND_END_ARG_INFO()
|
||||
|
||||
ZEND_BEGIN_ARG_INFO_EX(arginfo_file_object_flock, 0, 0, 1)
|
||||
ZEND_BEGIN_ARG_INFO_EX(arginfo_file_object_flock, 0, 0, 1)
|
||||
ZEND_ARG_INFO(0, operation)
|
||||
ZEND_ARG_INFO(1, wouldblock)
|
||||
ZEND_END_ARG_INFO()
|
||||
|
||||
ZEND_BEGIN_ARG_INFO_EX(arginfo_file_object_fseek, 0, 0, 1)
|
||||
ZEND_BEGIN_ARG_INFO_EX(arginfo_file_object_fseek, 0, 0, 1)
|
||||
ZEND_ARG_INFO(0, pos)
|
||||
ZEND_ARG_INFO(0, whence)
|
||||
ZEND_END_ARG_INFO()
|
||||
|
||||
ZEND_BEGIN_ARG_INFO_EX(arginfo_file_object_fgetss, 0, 0, 0)
|
||||
ZEND_BEGIN_ARG_INFO_EX(arginfo_file_object_fgetss, 0, 0, 0)
|
||||
ZEND_ARG_INFO(0, allowable_tags)
|
||||
ZEND_END_ARG_INFO()
|
||||
|
||||
ZEND_BEGIN_ARG_INFO_EX(arginfo_file_object_fscanf, 1, 0, 1)
|
||||
ZEND_BEGIN_ARG_INFO_EX(arginfo_file_object_fscanf, 1, 0, 1)
|
||||
ZEND_ARG_INFO(0, format)
|
||||
ZEND_END_ARG_INFO()
|
||||
|
||||
ZEND_BEGIN_ARG_INFO_EX(arginfo_file_object_fwrite, 0, 0, 1)
|
||||
ZEND_BEGIN_ARG_INFO_EX(arginfo_file_object_fwrite, 0, 0, 1)
|
||||
ZEND_ARG_INFO(0, str)
|
||||
ZEND_ARG_INFO(0, length)
|
||||
ZEND_END_ARG_INFO()
|
||||
@@ -2985,11 +2989,11 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_file_object_fread, 0, 0, 1)
|
||||
ZEND_ARG_INFO(0, length)
|
||||
ZEND_END_ARG_INFO()
|
||||
|
||||
ZEND_BEGIN_ARG_INFO_EX(arginfo_file_object_ftruncate, 0, 0, 1)
|
||||
ZEND_BEGIN_ARG_INFO_EX(arginfo_file_object_ftruncate, 0, 0, 1)
|
||||
ZEND_ARG_INFO(0, size)
|
||||
ZEND_END_ARG_INFO()
|
||||
|
||||
ZEND_BEGIN_ARG_INFO_EX(arginfo_file_object_seek, 0, 0, 1)
|
||||
ZEND_BEGIN_ARG_INFO_EX(arginfo_file_object_seek, 0, 0, 1)
|
||||
ZEND_ARG_INFO(0, line_pos)
|
||||
ZEND_END_ARG_INFO()
|
||||
|
||||
@@ -3078,7 +3082,7 @@ PHP_MINIT_FUNCTION(spl_directory)
|
||||
|
||||
REGISTER_SPL_SUB_CLASS_EX(RecursiveDirectoryIterator, FilesystemIterator, spl_filesystem_object_new, spl_RecursiveDirectoryIterator_functions);
|
||||
REGISTER_SPL_IMPLEMENTS(RecursiveDirectoryIterator, RecursiveIterator);
|
||||
|
||||
|
||||
memcpy(&spl_filesystem_object_check_handlers, &spl_filesystem_object_handlers, sizeof(zend_object_handlers));
|
||||
spl_filesystem_object_check_handlers.get_method = spl_filesystem_object_get_method_check;
|
||||
|
||||
@@ -3095,7 +3099,7 @@ PHP_MINIT_FUNCTION(spl_directory)
|
||||
REGISTER_SPL_CLASS_CONST_LONG(SplFileObject, "READ_AHEAD", SPL_FILE_OBJECT_READ_AHEAD);
|
||||
REGISTER_SPL_CLASS_CONST_LONG(SplFileObject, "SKIP_EMPTY", SPL_FILE_OBJECT_SKIP_EMPTY);
|
||||
REGISTER_SPL_CLASS_CONST_LONG(SplFileObject, "READ_CSV", SPL_FILE_OBJECT_READ_CSV);
|
||||
|
||||
|
||||
REGISTER_SPL_SUB_CLASS_EX(SplTempFileObject, SplFileObject, spl_filesystem_object_new_check, spl_SplTempFileObject_functions);
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
@@ -3544,7 +3544,7 @@ PHPAPI double php_get_inf(void) /* {{{ */
|
||||
|
||||
#define BASIC_ADD_SUBMODULE(module) \
|
||||
zend_hash_add_empty_element(&basic_submodules, #module, strlen(#module));
|
||||
|
||||
|
||||
#define BASIC_RINIT_SUBMODULE(module) \
|
||||
if (zend_hash_exists(&basic_submodules, #module, strlen(#module))) { \
|
||||
PHP_RINIT(module)(INIT_FUNC_ARGS_PASSTHRU); \
|
||||
@@ -4013,21 +4013,24 @@ PHP_FUNCTION(long2ip)
|
||||
* System Functions *
|
||||
********************/
|
||||
|
||||
/* {{{ proto string getenv(string varname)
|
||||
/* {{{ proto string getenv(string varname[, bool local_only])
|
||||
Get the value of an environment variable */
|
||||
PHP_FUNCTION(getenv)
|
||||
{
|
||||
char *ptr, *str;
|
||||
int str_len;
|
||||
zend_bool local_only = 0;
|
||||
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &str, &str_len) == FAILURE) {
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|b", &str, &str_len, &local_only) == FAILURE) {
|
||||
RETURN_FALSE;
|
||||
}
|
||||
|
||||
/* SAPI method returns an emalloc()'d string */
|
||||
ptr = sapi_getenv(str, str_len TSRMLS_CC);
|
||||
if (ptr) {
|
||||
RETURN_STRING(ptr, 0);
|
||||
if (!local_only) {
|
||||
/* SAPI method returns an emalloc()'d string */
|
||||
ptr = sapi_getenv(str, str_len TSRMLS_CC);
|
||||
if (ptr) {
|
||||
RETURN_STRING(ptr, 0);
|
||||
}
|
||||
}
|
||||
#ifdef PHP_WIN32
|
||||
{
|
||||
|
||||
@@ -1758,6 +1758,12 @@ PHPAPI PHP_FUNCTION(fread)
|
||||
RETURN_FALSE;
|
||||
}
|
||||
|
||||
if (len > INT_MAX) {
|
||||
/* string length is int in 5.x so we can not read more than int */
|
||||
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Length parameter must be no more than %d", INT_MAX);
|
||||
RETURN_FALSE;
|
||||
}
|
||||
|
||||
Z_STRVAL_P(return_value) = emalloc(len + 1);
|
||||
Z_STRLEN_P(return_value) = php_stream_read(stream, Z_STRVAL_P(return_value), len);
|
||||
|
||||
|
||||
+28
-23
@@ -163,7 +163,7 @@ static inline unsigned int get_next_char(
|
||||
else
|
||||
MB_FAILURE(pos, 4);
|
||||
}
|
||||
|
||||
|
||||
this_char = ((c & 0x07) << 18) | ((str[pos + 1] & 0x3f) << 12) | ((str[pos + 2] & 0x3f) << 6) | (str[pos + 3] & 0x3f);
|
||||
if (this_char < 0x10000 || this_char > 0x10FFFF) { /* non-shortest form or outside range */
|
||||
MB_FAILURE(pos, 4);
|
||||
@@ -437,7 +437,7 @@ det_charset:
|
||||
|
||||
if (charset_hint) {
|
||||
int found = 0;
|
||||
|
||||
|
||||
/* now walk the charset map and look for the codeset */
|
||||
for (i = 0; charset_map[i].codeset; i++) {
|
||||
if (len == strlen(charset_map[i].codeset) && strncasecmp(charset_hint, charset_map[i].codeset, len) == 0) {
|
||||
@@ -545,7 +545,7 @@ static inline unsigned char unimap_bsearch(const uni_to_enc *table, unsigned cod
|
||||
return 0;
|
||||
|
||||
code_key = (unsigned short) code_key_a;
|
||||
|
||||
|
||||
while (l <= h) {
|
||||
m = l + (h - l) / 2;
|
||||
if (code_key < m->un_code_point)
|
||||
@@ -571,7 +571,7 @@ static inline int map_from_unicode(unsigned code, enum entity_charset charset, u
|
||||
/* identity mapping of code points to unicode */
|
||||
if (code > 0xFF) {
|
||||
return FAILURE;
|
||||
}
|
||||
}
|
||||
*res = code;
|
||||
break;
|
||||
|
||||
@@ -590,7 +590,7 @@ static inline int map_from_unicode(unsigned code, enum entity_charset charset, u
|
||||
return FAILURE;
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
case cs_8859_15:
|
||||
if (code < 0xA4 || (code > 0xBE && code <= 0xFF)) {
|
||||
*res = code;
|
||||
@@ -634,7 +634,7 @@ static inline int map_from_unicode(unsigned code, enum entity_charset charset, u
|
||||
case cs_cp866:
|
||||
table = unimap_cp866;
|
||||
table_size = sizeof(unimap_cp866) / sizeof(*unimap_cp866);
|
||||
|
||||
|
||||
table_over_7F:
|
||||
if (code <= 0x7F) {
|
||||
*res = code;
|
||||
@@ -710,7 +710,7 @@ static inline int unicode_cp_is_allowed(unsigned uni_cp, int document_type)
|
||||
* Not sure this is the relevant part for HTML 5, though. I opted to
|
||||
* disallow the characters that would result in a parse error when
|
||||
* preprocessing of the input stream. See also section 8.1.3.
|
||||
*
|
||||
*
|
||||
* It's unclear if XHTML 1.0 allows C1 characters. I'll opt to apply to
|
||||
* XHTML 1.0 the same rules as for XML 1.0.
|
||||
* See <http://cmsmcq.com/2007/C1.xml>.
|
||||
@@ -774,7 +774,7 @@ static inline int numeric_entity_is_allowed(unsigned uni_cp, int document_type)
|
||||
/* {{{ process_numeric_entity
|
||||
* Auxiliary function to traverse_for_entities.
|
||||
* On input, *buf should point to the first character after # and on output, it's the last
|
||||
* byte read, no matter if there was success or insuccess.
|
||||
* byte read, no matter if there was success or insuccess.
|
||||
*/
|
||||
static inline int process_numeric_entity(const char **buf, unsigned *code_point)
|
||||
{
|
||||
@@ -784,7 +784,7 @@ static inline int process_numeric_entity(const char **buf, unsigned *code_point)
|
||||
|
||||
if (hexadecimal && (**buf != '\0'))
|
||||
(*buf)++;
|
||||
|
||||
|
||||
/* strtol allows whitespace and other stuff in the beginning
|
||||
* we're not interested */
|
||||
if ((hexadecimal && !isxdigit(**buf)) ||
|
||||
@@ -969,7 +969,7 @@ static void traverse_for_entities(
|
||||
goto invalid_code;
|
||||
|
||||
/* are we allowed to decode this entity in this document type?
|
||||
* HTML 5 is the only that has a character that cannot be used in
|
||||
* HTML 5 is the only that has a character that cannot be used in
|
||||
* a numeric entity but is allowed literally (U+000D). The
|
||||
* unoptimized version would be ... || !numeric_entity_is_allowed(code) */
|
||||
if (!unicode_cp_is_allowed(code, doctype) ||
|
||||
@@ -996,9 +996,9 @@ static void traverse_for_entities(
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
assert(*next == ';');
|
||||
|
||||
|
||||
if (((code == '\'' && !(flags & ENT_HTML_QUOTE_SINGLE)) ||
|
||||
(code == '"' && !(flags & ENT_HTML_QUOTE_DOUBLE)))
|
||||
/* && code2 == '\0' always true for current maps */)
|
||||
@@ -1026,7 +1026,7 @@ invalid_code:
|
||||
*(q++) = *p;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
*q = '\0';
|
||||
*retlen = (size_t)(q - ret);
|
||||
}
|
||||
@@ -1066,7 +1066,7 @@ static entity_table_opt determine_entity_table(int all, int doctype)
|
||||
entity_table_opt retval = {NULL};
|
||||
|
||||
assert(!(doctype == ENT_HTML_DOC_XML1 && all));
|
||||
|
||||
|
||||
if (all) {
|
||||
retval.ms_table = (doctype == ENT_HTML_DOC_HTML5) ?
|
||||
entity_ms_table_html5 : entity_ms_table_html4;
|
||||
@@ -1111,13 +1111,13 @@ PHPAPI char *php_unescape_html_entities(unsigned char *old, size_t oldlen, size_
|
||||
if (retlen == 0) {
|
||||
goto empty_source;
|
||||
}
|
||||
|
||||
|
||||
inverse_map = unescape_inverse_map(all, flags);
|
||||
|
||||
|
||||
/* replace numeric entities */
|
||||
traverse_for_entities(old, oldlen, ret, &retlen, all, flags, inverse_map, charset);
|
||||
|
||||
empty_source:
|
||||
empty_source:
|
||||
*newlen = retlen;
|
||||
return ret;
|
||||
}
|
||||
@@ -1141,7 +1141,7 @@ static inline void find_entity_for_char(
|
||||
{
|
||||
unsigned stage1_idx = ENT_STAGE1_INDEX(k);
|
||||
const entity_stage3_row *c;
|
||||
|
||||
|
||||
if (stage1_idx > 0x1D) {
|
||||
*entity = NULL;
|
||||
*entity_len = 0;
|
||||
@@ -1162,7 +1162,7 @@ static inline void find_entity_for_char(
|
||||
if (!(*cursor < oldlen))
|
||||
goto no_suitable_2nd;
|
||||
|
||||
next_char = get_next_char(charset, old, oldlen, cursor, &status);
|
||||
next_char = get_next_char(charset, old, oldlen, cursor, &status);
|
||||
|
||||
if (status == FAILURE)
|
||||
goto no_suitable_2nd;
|
||||
@@ -1187,7 +1187,7 @@ no_suitable_2nd:
|
||||
*entity = (const unsigned char *)
|
||||
c->data.multicodepoint_table[0].leading_entry.default_entity;
|
||||
*entity_len = c->data.multicodepoint_table[0].leading_entry.default_entity_len;
|
||||
}
|
||||
}
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
@@ -1255,7 +1255,7 @@ PHPAPI char *php_escape_html_entities_ex(unsigned char *old, size_t oldlen, size
|
||||
|
||||
/* initial estimate */
|
||||
if (oldlen < 64) {
|
||||
maxlen = 128;
|
||||
maxlen = 128;
|
||||
} else {
|
||||
maxlen = 2 * oldlen;
|
||||
if (maxlen < oldlen) {
|
||||
@@ -1423,6 +1423,11 @@ encode_amp:
|
||||
}
|
||||
replaced[len] = '\0';
|
||||
*newlen = len;
|
||||
if(len > INT_MAX) {
|
||||
zend_error_noreturn(E_ERROR, "Escaped string is too long");
|
||||
efree(replaced);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return replaced;
|
||||
}
|
||||
@@ -1577,7 +1582,7 @@ static inline void write_s3row_data(
|
||||
} else {
|
||||
spe_cp = uni_cp;
|
||||
}
|
||||
|
||||
|
||||
written_k2 = write_octet_sequence(&key[written_k1], charset, spe_cp);
|
||||
memcpy(&entity[1], mcpr[i].normal_entry.entity, l);
|
||||
entity[l + 1] = ';';
|
||||
@@ -1615,7 +1620,7 @@ PHP_FUNCTION(get_html_translation_table)
|
||||
LIMIT_ALL(all, doctype, charset);
|
||||
|
||||
array_init(return_value);
|
||||
|
||||
|
||||
entity_table = determine_entity_table(all, doctype);
|
||||
if (all && !CHARSET_UNICODE_COMPAT(charset)) {
|
||||
to_uni_table = enc_to_uni_index[charset];
|
||||
|
||||
@@ -63,6 +63,9 @@
|
||||
newlen = (d)->len + (n); \
|
||||
if (newlen >= (d)->a) { \
|
||||
(d)->a = newlen + SMART_STR_PREALLOC; \
|
||||
if (UNEXPECTED((d)->a >= INT_MAX)) { \
|
||||
zend_error(E_ERROR, "String size overflow"); \
|
||||
} \
|
||||
SMART_STR_DO_REALLOC(d, what); \
|
||||
} \
|
||||
} \
|
||||
@@ -148,17 +151,17 @@
|
||||
* for GCC compatible compilers, e.g.
|
||||
*
|
||||
* #define f(..) ({char *r;..;__r;})
|
||||
*/
|
||||
|
||||
*/
|
||||
|
||||
static inline char *smart_str_print_long(char *buf, long num) {
|
||||
char *r;
|
||||
smart_str_print_long4(buf, num, unsigned long, r);
|
||||
char *r;
|
||||
smart_str_print_long4(buf, num, unsigned long, r);
|
||||
return r;
|
||||
}
|
||||
|
||||
static inline char *smart_str_print_unsigned(char *buf, long num) {
|
||||
char *r;
|
||||
smart_str_print_unsigned4(buf, num, unsigned long, r);
|
||||
char *r;
|
||||
smart_str_print_unsigned4(buf, num, unsigned long, r);
|
||||
return r;
|
||||
}
|
||||
|
||||
@@ -168,7 +171,7 @@ static inline char *smart_str_print_unsigned(char *buf, long num) {
|
||||
smart_str_print##func##4 (__b + sizeof(__b) - 1, (num), vartype, __t); \
|
||||
smart_str_appendl_ex((dest), __t, __b + sizeof(__b) - 1 - __t, (type)); \
|
||||
} while (0)
|
||||
|
||||
|
||||
#define smart_str_append_unsigned_ex(dest, num, type) \
|
||||
smart_str_append_generic_ex((dest), (num), (type), unsigned long, _unsigned)
|
||||
|
||||
|
||||
+23
-4
@@ -137,6 +137,9 @@ static char *php_bin2hex(const unsigned char *old, const size_t oldlen, size_t *
|
||||
register unsigned char *result = NULL;
|
||||
size_t i, j;
|
||||
|
||||
if (UNEXPECTED(oldlen * 2 * sizeof(char) > INT_MAX)) {
|
||||
zend_error(E_ERROR, "String size overflow");
|
||||
}
|
||||
result = (unsigned char *) safe_emalloc(oldlen, 2 * sizeof(char), 1);
|
||||
|
||||
for (i = j = 0; i < oldlen; i++) {
|
||||
@@ -2613,6 +2616,7 @@ PHP_FUNCTION(quotemeta)
|
||||
char *p, *q;
|
||||
char c;
|
||||
int old_len;
|
||||
size_t new_len;
|
||||
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &old, &old_len) == FAILURE) {
|
||||
return;
|
||||
@@ -2647,8 +2651,13 @@ PHP_FUNCTION(quotemeta)
|
||||
}
|
||||
}
|
||||
*q = 0;
|
||||
new_len = q - str;
|
||||
if (UNEXPECTED(new_len > INT_MAX)) {
|
||||
efree(str);
|
||||
zend_error(E_ERROR, "String size overflow");
|
||||
}
|
||||
|
||||
RETURN_STRINGL(erealloc(str, q - str + 1), q - str, 0);
|
||||
RETURN_STRINGL(erealloc(str, new_len + 1), new_len, 0);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
@@ -3500,7 +3509,7 @@ PHPAPI char *php_addcslashes(const char *str, int length, int *new_length, int s
|
||||
char *source, *target;
|
||||
char *end;
|
||||
char c;
|
||||
int newlen;
|
||||
size_t newlen;
|
||||
|
||||
if (!wlength) {
|
||||
wlength = strlen(what);
|
||||
@@ -3531,11 +3540,15 @@ PHPAPI char *php_addcslashes(const char *str, int length, int *new_length, int s
|
||||
}
|
||||
*target = 0;
|
||||
newlen = target - new_str;
|
||||
if (UNEXPECTED(newlen > INT_MAX)) {
|
||||
efree(new_str);
|
||||
zend_error(E_ERROR, "String size overflow");
|
||||
}
|
||||
if (target - new_str < length * 4) {
|
||||
new_str = erealloc(new_str, newlen + 1);
|
||||
}
|
||||
if (new_length) {
|
||||
*new_length = newlen;
|
||||
*new_length = (int)newlen;
|
||||
}
|
||||
if (should_free) {
|
||||
STR_FREE((char*)str);
|
||||
@@ -3587,6 +3600,9 @@ PHPAPI char *php_addslashes(char *str, int length, int *new_length, int should_f
|
||||
|
||||
*target = 0;
|
||||
*new_length = target - new_str;
|
||||
if (UNEXPECTED(*new_length < 0)) {
|
||||
zend_error(E_ERROR, "String size overflow");
|
||||
}
|
||||
if (should_free) {
|
||||
STR_FREE(str);
|
||||
}
|
||||
@@ -4251,7 +4267,7 @@ PHP_FUNCTION(nl2br)
|
||||
{
|
||||
/* in brief this inserts <br /> or <br> before matched regexp \n\r?|\r\n? */
|
||||
char *tmp, *str;
|
||||
int new_length;
|
||||
size_t new_length;
|
||||
char *end, *target;
|
||||
int repl_cnt = 0;
|
||||
int str_len;
|
||||
@@ -4290,6 +4306,9 @@ PHP_FUNCTION(nl2br)
|
||||
size_t repl_len = is_xhtml ? (sizeof("<br />") - 1) : (sizeof("<br>") - 1);
|
||||
|
||||
new_length = str_len + repl_cnt * repl_len;
|
||||
if (UNEXPECTED(new_length > INT_MAX)) {
|
||||
zend_error(E_ERROR, "String size overflow");
|
||||
}
|
||||
tmp = target = safe_emalloc(repl_cnt, repl_len, str_len + 1);
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
--TEST--
|
||||
Bug #72114 (Integer underflow / arbitrary null write in fread/gzread)
|
||||
--SKIPIF--
|
||||
<?php if (PHP_INT_SIZE != 8) die("skip this test is for 64bit platform only"); ?>
|
||||
--FILE--
|
||||
<?php
|
||||
ini_set('memory_limit', "2500M");
|
||||
$fp = fopen("/dev/zero", "r");
|
||||
fread($fp, 2147483648);
|
||||
?>
|
||||
Done
|
||||
--EXPECTF--
|
||||
Warning: fread(): Length parameter must be no more than 2147483647 in %s/bug72114.php on line %d
|
||||
Done
|
||||
@@ -0,0 +1,32 @@
|
||||
--TEST--
|
||||
Bug #72433: Use After Free Vulnerability in PHP's GC algorithm and unserialize
|
||||
--FILE--
|
||||
<?php
|
||||
// Fill any potential freed spaces until now.
|
||||
$filler = array();
|
||||
for($i = 0; $i < 100; $i++)
|
||||
$filler[] = "";
|
||||
// Create our payload and unserialize it.
|
||||
$serialized_payload = 'a:3:{i:0;r:1;i:1;r:1;i:2;C:11:"ArrayObject":19:{x:i:0;r:1;;m:a:0:{}}}';
|
||||
$free_me = unserialize($serialized_payload);
|
||||
// We need to increment the reference counter of our ArrayObject s.t. all reference counters of our unserialized array become 0.
|
||||
$inc_ref_by_one = $free_me[2];
|
||||
// The call to gc_collect_cycles will free '$free_me'.
|
||||
gc_collect_cycles();
|
||||
// We now have multiple freed spaces. Fill all of them.
|
||||
$fill_freed_space_1 = "filler_zval_1";
|
||||
$fill_freed_space_2 = "filler_zval_2";
|
||||
var_dump($free_me);
|
||||
?>
|
||||
--EXPECTF--
|
||||
array(3) {
|
||||
[0]=>
|
||||
*RECURSION*
|
||||
[1]=>
|
||||
*RECURSION*
|
||||
[2]=>
|
||||
object(ArrayObject)#%d (1) {
|
||||
["storage":"ArrayObject":private]=>
|
||||
*RECURSION*
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
--TEST--
|
||||
Bug #72434: ZipArchive class Use After Free Vulnerability in PHP's GC algorithm and unserialize
|
||||
--SKIPIF--
|
||||
<?php
|
||||
if(!class_exists('zip')) die('ZipArchive');
|
||||
?>
|
||||
--FILE--
|
||||
<?php
|
||||
// The following array will be serialized and this representation will be freed later on.
|
||||
$free_me = array(new StdClass());
|
||||
// Create our payload and unserialize it.
|
||||
$serialized_payload = 'a:3:{i:1;N;i:2;O:10:"ZipArchive":1:{s:8:"filename";'.serialize($free_me).'}i:1;R:4;}';
|
||||
$unserialized_payload = unserialize($serialized_payload);
|
||||
gc_collect_cycles();
|
||||
// The reference counter for $free_me is at -1 for PHP 7 right now.
|
||||
// Increment the reference counter by 1 -> rc is 0
|
||||
$a = $unserialized_payload[1];
|
||||
// Increment the reference counter by 1 again -> rc is 1
|
||||
$b = $a;
|
||||
// Trigger free of $free_me (referenced by $m[1]).
|
||||
unset($b);
|
||||
$fill_freed_space_1 = "filler_zval_1";
|
||||
$fill_freed_space_2 = "filler_zval_2";
|
||||
$fill_freed_space_3 = "filler_zval_3";
|
||||
$fill_freed_space_4 = "filler_zval_4";
|
||||
debug_zval_dump($unserialized_payload[1]);
|
||||
?>
|
||||
--EXPECTF--
|
||||
array(1) refcount(1){
|
||||
[0]=>
|
||||
object(stdClass)#%d (0) refcount(3){
|
||||
}
|
||||
}
|
||||
+52
-48
@@ -65,27 +65,27 @@ PHPAPI char *php_replace_controlchars_ex(char *str, int len)
|
||||
{
|
||||
unsigned char *s = (unsigned char *)str;
|
||||
unsigned char *e = (unsigned char *)str + len;
|
||||
|
||||
|
||||
if (!str) {
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
|
||||
while (s < e) {
|
||||
|
||||
|
||||
if (iscntrl(*s)) {
|
||||
*s='_';
|
||||
}
|
||||
}
|
||||
s++;
|
||||
}
|
||||
|
||||
|
||||
return (str);
|
||||
}
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
PHPAPI char *php_replace_controlchars(char *str)
|
||||
{
|
||||
return php_replace_controlchars_ex(str, strlen(str));
|
||||
}
|
||||
}
|
||||
|
||||
PHPAPI php_url *php_url_parse(char const *str)
|
||||
{
|
||||
@@ -99,7 +99,7 @@ PHPAPI php_url *php_url_parse_ex(char const *str, int length)
|
||||
char port_buf[6];
|
||||
php_url *ret = ecalloc(1, sizeof(php_url));
|
||||
char const *s, *e, *p, *pp, *ue;
|
||||
|
||||
|
||||
s = str;
|
||||
ue = s + length;
|
||||
|
||||
@@ -118,40 +118,40 @@ PHPAPI php_url *php_url_parse_ex(char const *str, int length)
|
||||
}
|
||||
p++;
|
||||
}
|
||||
|
||||
|
||||
if (*(e + 1) == '\0') { /* only scheme is available */
|
||||
ret->scheme = estrndup(s, (e - s));
|
||||
php_replace_controlchars_ex(ret->scheme, (e - s));
|
||||
goto end;
|
||||
}
|
||||
|
||||
/*
|
||||
/*
|
||||
* certain schemas like mailto: and zlib: may not have any / after them
|
||||
* this check ensures we support those.
|
||||
*/
|
||||
if (*(e+1) != '/') {
|
||||
/* check if the data we get is a port this allows us to
|
||||
/* check if the data we get is a port this allows us to
|
||||
* correctly parse things like a.com:80
|
||||
*/
|
||||
p = e + 1;
|
||||
while (isdigit(*p)) {
|
||||
p++;
|
||||
}
|
||||
|
||||
|
||||
if ((*p == '\0' || *p == '/') && (p - e) < 7) {
|
||||
goto parse_port;
|
||||
}
|
||||
|
||||
|
||||
ret->scheme = estrndup(s, (e-s));
|
||||
php_replace_controlchars_ex(ret->scheme, (e - s));
|
||||
|
||||
|
||||
length -= ++e - s;
|
||||
s = e;
|
||||
goto just_path;
|
||||
} else {
|
||||
ret->scheme = estrndup(s, (e-s));
|
||||
php_replace_controlchars_ex(ret->scheme, (e - s));
|
||||
|
||||
|
||||
if (*(e+2) == '/') {
|
||||
s = e + 3;
|
||||
if (!strncasecmp("file", ret->scheme, sizeof("file"))) {
|
||||
@@ -173,9 +173,9 @@ PHPAPI php_url *php_url_parse_ex(char const *str, int length)
|
||||
length -= ++e - s;
|
||||
s = e;
|
||||
goto just_path;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if (e) { /* no scheme; starts with colon: look for port */
|
||||
parse_port:
|
||||
p = e + 1;
|
||||
@@ -216,9 +216,9 @@ PHPAPI php_url *php_url_parse_ex(char const *str, int length)
|
||||
ue = s + length;
|
||||
goto nohost;
|
||||
}
|
||||
|
||||
|
||||
e = ue;
|
||||
|
||||
|
||||
if (!(p = memchr(s, '/', (ue - s)))) {
|
||||
char *query, *fragment;
|
||||
|
||||
@@ -238,14 +238,14 @@ PHPAPI php_url *php_url_parse_ex(char const *str, int length)
|
||||
}
|
||||
} else {
|
||||
e = p;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/* check for login and password */
|
||||
if ((p = zend_memrchr(s, '@', (e-s)))) {
|
||||
if ((pp = memchr(s, ':', (p-s)))) {
|
||||
ret->user = estrndup(s, (pp-s));
|
||||
php_replace_controlchars_ex(ret->user, (pp - s));
|
||||
|
||||
|
||||
pp++;
|
||||
ret->pass = estrndup(pp, (p-pp));
|
||||
php_replace_controlchars_ex(ret->pass, (p-pp));
|
||||
@@ -253,14 +253,14 @@ PHPAPI php_url *php_url_parse_ex(char const *str, int length)
|
||||
ret->user = estrndup(s, (p-s));
|
||||
php_replace_controlchars_ex(ret->user, (p-s));
|
||||
}
|
||||
|
||||
|
||||
s = p + 1;
|
||||
}
|
||||
|
||||
/* check for port */
|
||||
if (*s == '[' && *(e-1) == ']') {
|
||||
/* Short circuit portscan,
|
||||
we're dealing with an
|
||||
/* Short circuit portscan,
|
||||
we're dealing with an
|
||||
IPv6 embedded address */
|
||||
p = s;
|
||||
} else {
|
||||
@@ -294,11 +294,11 @@ PHPAPI php_url *php_url_parse_ex(char const *str, int length)
|
||||
}
|
||||
}
|
||||
p--;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
p = e;
|
||||
}
|
||||
|
||||
|
||||
/* check if we have a valid host, if we don't reject the string as url */
|
||||
if ((p-s) < 1) {
|
||||
STR_FREE(ret->scheme);
|
||||
@@ -310,17 +310,17 @@ PHPAPI php_url *php_url_parse_ex(char const *str, int length)
|
||||
|
||||
ret->host = estrndup(s, (p-s));
|
||||
php_replace_controlchars_ex(ret->host, (p - s));
|
||||
|
||||
|
||||
if (e == ue) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
s = e;
|
||||
|
||||
|
||||
nohost:
|
||||
|
||||
|
||||
if ((p = memchr(s, '?', (ue - s)))) {
|
||||
pp = strchr(s, '#');
|
||||
pp = memchr(s, '#', (ue - s));
|
||||
|
||||
if (pp && pp < p) {
|
||||
if (pp - s) {
|
||||
@@ -330,14 +330,14 @@ PHPAPI php_url *php_url_parse_ex(char const *str, int length)
|
||||
p = pp;
|
||||
goto label_parse;
|
||||
}
|
||||
|
||||
|
||||
if (p - s) {
|
||||
ret->path = estrndup(s, (p-s));
|
||||
php_replace_controlchars_ex(ret->path, (p - s));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (pp) {
|
||||
if (pp - ++p) {
|
||||
if (pp - ++p) {
|
||||
ret->query = estrndup(p, (pp-p));
|
||||
php_replace_controlchars_ex(ret->query, (pp - p));
|
||||
}
|
||||
@@ -351,15 +351,15 @@ PHPAPI php_url *php_url_parse_ex(char const *str, int length)
|
||||
if (p - s) {
|
||||
ret->path = estrndup(s, (p-s));
|
||||
php_replace_controlchars_ex(ret->path, (p - s));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
label_parse:
|
||||
p++;
|
||||
|
||||
|
||||
if (ue - p) {
|
||||
ret->fragment = estrndup(p, (ue-p));
|
||||
php_replace_controlchars_ex(ret->fragment, (ue - p));
|
||||
}
|
||||
}
|
||||
} else {
|
||||
ret->path = estrndup(s, (ue-s));
|
||||
php_replace_controlchars_ex(ret->path, (ue - s));
|
||||
@@ -441,7 +441,7 @@ PHP_FUNCTION(parse_url)
|
||||
add_assoc_string(return_value, "query", resource->query, 1);
|
||||
if (resource->fragment != NULL)
|
||||
add_assoc_string(return_value, "fragment", resource->fragment, 1);
|
||||
done:
|
||||
done:
|
||||
php_url_free(resource);
|
||||
}
|
||||
/* }}} */
|
||||
@@ -489,7 +489,7 @@ PHPAPI char *php_url_encode(char const *s, int len, int *new_length)
|
||||
register unsigned char c;
|
||||
unsigned char *to, *start;
|
||||
unsigned char const *from, *end;
|
||||
|
||||
|
||||
from = (unsigned char *)s;
|
||||
end = (unsigned char *)s + len;
|
||||
start = to = (unsigned char *) safe_emalloc(3, len, 1);
|
||||
@@ -575,7 +575,7 @@ PHPAPI int php_url_decode(char *str, int len)
|
||||
if (*data == '+') {
|
||||
*dest = ' ';
|
||||
}
|
||||
else if (*data == '%' && len >= 2 && isxdigit((int) *(data + 1))
|
||||
else if (*data == '%' && len >= 2 && isxdigit((int) *(data + 1))
|
||||
&& isxdigit((int) *(data + 2))) {
|
||||
#ifndef CHARSET_EBCDIC
|
||||
*dest = (char) php_htoi(data + 1);
|
||||
@@ -599,7 +599,7 @@ PHPAPI int php_url_decode(char *str, int len)
|
||||
*/
|
||||
PHPAPI char *php_raw_url_encode(char const *s, int len, int *new_length)
|
||||
{
|
||||
register int x, y;
|
||||
register size_t x, y;
|
||||
unsigned char *str;
|
||||
|
||||
str = (unsigned char *) safe_emalloc(3, len, 1);
|
||||
@@ -625,6 +625,10 @@ PHPAPI char *php_raw_url_encode(char const *s, int len, int *new_length)
|
||||
if (new_length) {
|
||||
*new_length = y;
|
||||
}
|
||||
if (UNEXPECTED(y > INT_MAX)) {
|
||||
efree(str);
|
||||
zend_error(E_ERROR, "String size overflow");
|
||||
}
|
||||
return ((char *) str);
|
||||
}
|
||||
/* }}} */
|
||||
@@ -673,7 +677,7 @@ PHPAPI int php_raw_url_decode(char *str, int len)
|
||||
char *data = str;
|
||||
|
||||
while (len--) {
|
||||
if (*data == '%' && len >= 2 && isxdigit((int) *(data + 1))
|
||||
if (*data == '%' && len >= 2 && isxdigit((int) *(data + 1))
|
||||
&& isxdigit((int) *(data + 2))) {
|
||||
#ifndef CHARSET_EBCDIC
|
||||
*dest = (char) php_htoi(data + 1);
|
||||
@@ -705,7 +709,7 @@ PHP_FUNCTION(get_headers)
|
||||
HashPosition pos;
|
||||
HashTable *hashT;
|
||||
long format = 0;
|
||||
|
||||
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|l", &url, &url_len, &format) == FAILURE) {
|
||||
return;
|
||||
}
|
||||
@@ -724,12 +728,12 @@ PHP_FUNCTION(get_headers)
|
||||
|
||||
/* check for curl-wrappers that provide headers via a special "headers" element */
|
||||
if (zend_hash_find(HASH_OF(stream->wrapperdata), "headers", sizeof("headers"), (void **)&h) != FAILURE && Z_TYPE_PP(h) == IS_ARRAY) {
|
||||
/* curl-wrappers don't load data until the 1st read */
|
||||
/* curl-wrappers don't load data until the 1st read */
|
||||
if (!Z_ARRVAL_PP(h)->nNumOfElements) {
|
||||
php_stream_getc(stream);
|
||||
}
|
||||
zend_hash_find(HASH_OF(stream->wrapperdata), "headers", sizeof("headers"), (void **)&h);
|
||||
hashT = Z_ARRVAL_PP(h);
|
||||
hashT = Z_ARRVAL_PP(h);
|
||||
} else {
|
||||
hashT = HASH_OF(stream->wrapperdata);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
--TEST--
|
||||
Bug #72340: Double Free Courruption in wddx_deserialize
|
||||
--SKIPIF--
|
||||
<?php
|
||||
if (!extension_loaded("wddx")) print "skip";
|
||||
?>
|
||||
--FILE--
|
||||
<?php
|
||||
$xml = <<<EOF
|
||||
<?xml version='1.0' ?>
|
||||
<!DOCTYPE wddxPacket SYSTEM 'wddx_0100.dtd'>
|
||||
<wddxPacket version='1.0'>
|
||||
<array><var name="XXXXXXXX"><boolean value="none">TEST</boolean></var>
|
||||
<var name="YYYYYYYY"><var name="ZZZZZZZZ"><var name="EZEZEZEZ">
|
||||
</var></var></var>
|
||||
</array>
|
||||
</wddxPacket>
|
||||
EOF;
|
||||
$array = wddx_deserialize($xml);
|
||||
var_dump($array);
|
||||
?>
|
||||
--EXPECT--
|
||||
array(0) {
|
||||
}
|
||||
@@ -1096,6 +1096,9 @@ static void php_wddx_process_data(void *user_data, const XML_Char *s, int len)
|
||||
break;
|
||||
|
||||
case ST_BOOLEAN:
|
||||
if(!ent->data) {
|
||||
break;
|
||||
}
|
||||
if (!strcmp(s, "true")) {
|
||||
Z_LVAL_P(ent->data) = 1;
|
||||
} else if (!strcmp(s, "false")) {
|
||||
@@ -1104,6 +1107,7 @@ static void php_wddx_process_data(void *user_data, const XML_Char *s, int len)
|
||||
zval_ptr_dtor(&ent->data);
|
||||
if (ent->varname) {
|
||||
efree(ent->varname);
|
||||
ent->varname = NULL;
|
||||
}
|
||||
ent->data = NULL;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
--TEST--
|
||||
Bug #72099: xml_parse_into_struct segmentation fault
|
||||
--SKIPIF--
|
||||
<?php
|
||||
require_once("skipif.inc");
|
||||
?>
|
||||
--FILE--
|
||||
<?php
|
||||
$var1=xml_parser_create_ns();
|
||||
$var2=str_repeat("a", 10);
|
||||
$var3=[];
|
||||
$var4=[];
|
||||
xml_parse_into_struct($var1, $var2, $var3, $var4);
|
||||
var_dump($var3);
|
||||
--EXPECT--
|
||||
array(0) {
|
||||
}
|
||||
+53
-53
@@ -283,7 +283,7 @@ xml_encoding xml_encodings[] = {
|
||||
static XML_Memory_Handling_Suite php_xml_mem_hdlrs;
|
||||
|
||||
/* True globals, no need for thread safety */
|
||||
static int le_xml_parser;
|
||||
static int le_xml_parser;
|
||||
|
||||
/* }}} */
|
||||
|
||||
@@ -343,7 +343,7 @@ PHP_MINIT_FUNCTION(xml)
|
||||
REGISTER_LONG_CONSTANT("XML_OPTION_SKIP_WHITE", PHP_XML_OPTION_SKIP_WHITE, CONST_CS|CONST_PERSISTENT);
|
||||
|
||||
/* this object should not be pre-initialised at compile time,
|
||||
as the order of members may vary */
|
||||
as the order of members may vary */
|
||||
|
||||
php_xml_mem_hdlrs.malloc_fcn = php_xml_malloc_wrapper;
|
||||
php_xml_mem_hdlrs.realloc_fcn = php_xml_realloc_wrapper;
|
||||
@@ -404,7 +404,7 @@ static zval *_xml_xmlchar_zval(const XML_Char *s, int len, const XML_Char *encod
|
||||
{
|
||||
zval *ret;
|
||||
MAKE_STD_ZVAL(ret);
|
||||
|
||||
|
||||
if (s == NULL) {
|
||||
ZVAL_FALSE(ret);
|
||||
return ret;
|
||||
@@ -422,7 +422,7 @@ static zval *_xml_xmlchar_zval(const XML_Char *s, int len, const XML_Char *encod
|
||||
static void xml_parser_dtor(zend_rsrc_list_entry *rsrc TSRMLS_DC)
|
||||
{
|
||||
xml_parser *parser = (xml_parser *)rsrc->ptr;
|
||||
|
||||
|
||||
if (parser->parser) {
|
||||
XML_ParserFree(parser->parser);
|
||||
}
|
||||
@@ -503,7 +503,7 @@ static void xml_set_handler(zval **handler, zval **data)
|
||||
/* {{{ xml_call_handler() */
|
||||
static zval *xml_call_handler(xml_parser *parser, zval *handler, zend_function *function_ptr, int argc, zval **argv)
|
||||
{
|
||||
int i;
|
||||
int i;
|
||||
TSRMLS_FETCH();
|
||||
|
||||
if (parser && handler && !EG(exception)) {
|
||||
@@ -516,7 +516,7 @@ static zval *xml_call_handler(xml_parser *parser, zval *handler, zend_function *
|
||||
for (i = 0; i < argc; i++) {
|
||||
args[i] = &argv[i];
|
||||
}
|
||||
|
||||
|
||||
fci.size = sizeof(fci);
|
||||
fci.function_table = EG(function_table);
|
||||
fci.function_name = handler;
|
||||
@@ -540,7 +540,7 @@ static zval *xml_call_handler(xml_parser *parser, zval *handler, zend_function *
|
||||
Z_TYPE_PP(obj) == IS_OBJECT &&
|
||||
Z_TYPE_PP(method) == IS_STRING) {
|
||||
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to call handler %s::%s()", Z_OBJCE_PP(obj)->name, Z_STRVAL_PP(method));
|
||||
} else
|
||||
} else
|
||||
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to call handler");
|
||||
}
|
||||
|
||||
@@ -739,14 +739,14 @@ static void _xml_add_to_info(xml_parser *parser,char *name)
|
||||
|
||||
if (zend_hash_find(Z_ARRVAL_P(parser->info),name,strlen(name) + 1,(void **) &element) == FAILURE) {
|
||||
MAKE_STD_ZVAL(values);
|
||||
|
||||
|
||||
array_init(values);
|
||||
|
||||
|
||||
zend_hash_update(Z_ARRVAL_P(parser->info), name, strlen(name)+1, (void *) &values, sizeof(zval*), (void **) &element);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
add_next_index_long(*element,parser->curtag);
|
||||
|
||||
|
||||
parser->curtag++;
|
||||
}
|
||||
/* }}} */
|
||||
@@ -798,11 +798,11 @@ void _xml_startElementHandler(void *userData, const XML_Char *name, const XML_Ch
|
||||
|
||||
efree(att);
|
||||
}
|
||||
|
||||
|
||||
if ((retval = xml_call_handler(parser, parser->startElementHandler, parser->startElementPtr, 3, args))) {
|
||||
zval_ptr_dtor(&retval);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (parser->data) {
|
||||
if (parser->level <= XML_MAXLEVEL) {
|
||||
@@ -874,7 +874,7 @@ void _xml_endElementHandler(void *userData, const XML_Char *name)
|
||||
if ((retval = xml_call_handler(parser, parser->endElementHandler, parser->endElementPtr, 2, args))) {
|
||||
zval_ptr_dtor(&retval);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (parser->data) {
|
||||
zval *tag;
|
||||
@@ -885,13 +885,13 @@ void _xml_endElementHandler(void *userData, const XML_Char *name)
|
||||
MAKE_STD_ZVAL(tag);
|
||||
|
||||
array_init(tag);
|
||||
|
||||
|
||||
_xml_add_to_info(parser,((char *) tag_name) + parser->toffset);
|
||||
|
||||
add_assoc_string(tag,"tag",((char *) tag_name) + parser->toffset,1); /* cast to avoid gcc-warning */
|
||||
add_assoc_string(tag,"type","close",1);
|
||||
add_assoc_long(tag,"level",parser->level);
|
||||
|
||||
|
||||
zend_hash_next_index_insert(Z_ARRVAL_P(parser->data),&tag,sizeof(zval*),NULL);
|
||||
}
|
||||
|
||||
@@ -923,7 +923,7 @@ void _xml_characterDataHandler(void *userData, const XML_Char *s, int len)
|
||||
if ((retval = xml_call_handler(parser, parser->characterDataHandler, parser->characterDataPtr, 2, args))) {
|
||||
zval_ptr_dtor(&retval);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (parser->data) {
|
||||
int i;
|
||||
@@ -931,7 +931,7 @@ void _xml_characterDataHandler(void *userData, const XML_Char *s, int len)
|
||||
|
||||
char *decoded_value;
|
||||
int decoded_len;
|
||||
|
||||
|
||||
decoded_value = xml_utf8_decode(s,len,&decoded_len,parser->target_encoding);
|
||||
for (i = 0; i < decoded_len; i++) {
|
||||
switch (decoded_value[i]) {
|
||||
@@ -950,7 +950,7 @@ void _xml_characterDataHandler(void *userData, const XML_Char *s, int len)
|
||||
if (doprint || (! parser->skipwhite)) {
|
||||
if (parser->lastwasopen) {
|
||||
zval **myval;
|
||||
|
||||
|
||||
/* check if the current tag already has a value - if yes append to that! */
|
||||
if (zend_hash_find(Z_ARRVAL_PP(parser->ctag),"value",sizeof("value"),(void **) &myval) == SUCCESS) {
|
||||
int newlen = Z_STRLEN_PP(myval) + decoded_len;
|
||||
@@ -961,7 +961,7 @@ void _xml_characterDataHandler(void *userData, const XML_Char *s, int len)
|
||||
} else {
|
||||
add_assoc_string(*(parser->ctag),"value",decoded_value,0);
|
||||
}
|
||||
|
||||
|
||||
} else {
|
||||
zval *tag;
|
||||
zval **curtag, **mytype, **myval;
|
||||
@@ -984,7 +984,7 @@ void _xml_characterDataHandler(void *userData, const XML_Char *s, int len)
|
||||
}
|
||||
}
|
||||
|
||||
if (parser->level <= XML_MAXLEVEL) {
|
||||
if (parser->level <= XML_MAXLEVEL && parser->level > 0) {
|
||||
MAKE_STD_ZVAL(tag);
|
||||
|
||||
array_init(tag);
|
||||
@@ -1046,8 +1046,8 @@ void _xml_defaultHandler(void *userData, const XML_Char *s, int len)
|
||||
/* }}} */
|
||||
|
||||
/* {{{ _xml_unparsedEntityDeclHandler() */
|
||||
void _xml_unparsedEntityDeclHandler(void *userData,
|
||||
const XML_Char *entityName,
|
||||
void _xml_unparsedEntityDeclHandler(void *userData,
|
||||
const XML_Char *entityName,
|
||||
const XML_Char *base,
|
||||
const XML_Char *systemId,
|
||||
const XML_Char *publicId,
|
||||
@@ -1172,9 +1172,9 @@ static void php_xml_parser_create_impl(INTERNAL_FUNCTION_PARAMETERS, int ns_supp
|
||||
|
||||
char *ns_param = NULL;
|
||||
int ns_param_len = 0;
|
||||
|
||||
|
||||
XML_Char *encoding;
|
||||
|
||||
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, (ns_support ? "|ss": "|s"), &encoding_param, &encoding_param_len, &ns_param, &ns_param_len) == FAILURE) {
|
||||
RETURN_FALSE;
|
||||
}
|
||||
@@ -1220,15 +1220,15 @@ static void php_xml_parser_create_impl(INTERNAL_FUNCTION_PARAMETERS, int ns_supp
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto resource xml_parser_create([string encoding])
|
||||
/* {{{ proto resource xml_parser_create([string encoding])
|
||||
Create an XML parser */
|
||||
PHP_FUNCTION(xml_parser_create)
|
||||
{
|
||||
php_xml_parser_create_impl(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0);
|
||||
php_xml_parser_create_impl(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto resource xml_parser_create_ns([string encoding [, string sep]])
|
||||
/* {{{ proto resource xml_parser_create_ns([string encoding [, string sep]])
|
||||
Create an XML parser */
|
||||
PHP_FUNCTION(xml_parser_create_ns)
|
||||
{
|
||||
@@ -1236,7 +1236,7 @@ PHP_FUNCTION(xml_parser_create_ns)
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto int xml_set_object(resource parser, object &obj)
|
||||
/* {{{ proto int xml_set_object(resource parser, object &obj)
|
||||
Set up object which should be used for callbacks */
|
||||
PHP_FUNCTION(xml_set_object)
|
||||
{
|
||||
@@ -1256,7 +1256,7 @@ PHP_FUNCTION(xml_set_object)
|
||||
|
||||
/* please leave this commented - or ask thies@thieso.net before doing it (again) */
|
||||
/* #ifdef ZEND_ENGINE_2
|
||||
zval_add_ref(&parser->object);
|
||||
zval_add_ref(&parser->object);
|
||||
#endif */
|
||||
|
||||
ALLOC_ZVAL(parser->object);
|
||||
@@ -1266,7 +1266,7 @@ PHP_FUNCTION(xml_set_object)
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto int xml_set_element_handler(resource parser, string shdl, string ehdl)
|
||||
/* {{{ proto int xml_set_element_handler(resource parser, string shdl, string ehdl)
|
||||
Set up start and end element handlers */
|
||||
PHP_FUNCTION(xml_set_element_handler)
|
||||
{
|
||||
@@ -1286,7 +1286,7 @@ PHP_FUNCTION(xml_set_element_handler)
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto int xml_set_character_data_handler(resource parser, string hdl)
|
||||
/* {{{ proto int xml_set_character_data_handler(resource parser, string hdl)
|
||||
Set up character data handler */
|
||||
PHP_FUNCTION(xml_set_character_data_handler)
|
||||
{
|
||||
@@ -1305,7 +1305,7 @@ PHP_FUNCTION(xml_set_character_data_handler)
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto int xml_set_processing_instruction_handler(resource parser, string hdl)
|
||||
/* {{{ proto int xml_set_processing_instruction_handler(resource parser, string hdl)
|
||||
Set up processing instruction (PI) handler */
|
||||
PHP_FUNCTION(xml_set_processing_instruction_handler)
|
||||
{
|
||||
@@ -1324,7 +1324,7 @@ PHP_FUNCTION(xml_set_processing_instruction_handler)
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto int xml_set_default_handler(resource parser, string hdl)
|
||||
/* {{{ proto int xml_set_default_handler(resource parser, string hdl)
|
||||
Set up default handler */
|
||||
PHP_FUNCTION(xml_set_default_handler)
|
||||
{
|
||||
@@ -1342,7 +1342,7 @@ PHP_FUNCTION(xml_set_default_handler)
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto int xml_set_unparsed_entity_decl_handler(resource parser, string hdl)
|
||||
/* {{{ proto int xml_set_unparsed_entity_decl_handler(resource parser, string hdl)
|
||||
Set up unparsed entity declaration handler */
|
||||
PHP_FUNCTION(xml_set_unparsed_entity_decl_handler)
|
||||
{
|
||||
@@ -1361,7 +1361,7 @@ PHP_FUNCTION(xml_set_unparsed_entity_decl_handler)
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto int xml_set_notation_decl_handler(resource parser, string hdl)
|
||||
/* {{{ proto int xml_set_notation_decl_handler(resource parser, string hdl)
|
||||
Set up notation declaration handler */
|
||||
PHP_FUNCTION(xml_set_notation_decl_handler)
|
||||
{
|
||||
@@ -1379,7 +1379,7 @@ PHP_FUNCTION(xml_set_notation_decl_handler)
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto int xml_set_external_entity_ref_handler(resource parser, string hdl)
|
||||
/* {{{ proto int xml_set_external_entity_ref_handler(resource parser, string hdl)
|
||||
Set up external entity reference handler */
|
||||
PHP_FUNCTION(xml_set_external_entity_ref_handler)
|
||||
{
|
||||
@@ -1397,7 +1397,7 @@ PHP_FUNCTION(xml_set_external_entity_ref_handler)
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto int xml_set_start_namespace_decl_handler(resource parser, string hdl)
|
||||
/* {{{ proto int xml_set_start_namespace_decl_handler(resource parser, string hdl)
|
||||
Set up character data handler */
|
||||
PHP_FUNCTION(xml_set_start_namespace_decl_handler)
|
||||
{
|
||||
@@ -1416,7 +1416,7 @@ PHP_FUNCTION(xml_set_start_namespace_decl_handler)
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto int xml_set_end_namespace_decl_handler(resource parser, string hdl)
|
||||
/* {{{ proto int xml_set_end_namespace_decl_handler(resource parser, string hdl)
|
||||
Set up character data handler */
|
||||
PHP_FUNCTION(xml_set_end_namespace_decl_handler)
|
||||
{
|
||||
@@ -1435,7 +1435,7 @@ PHP_FUNCTION(xml_set_end_namespace_decl_handler)
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto int xml_parse(resource parser, string data [, int isFinal])
|
||||
/* {{{ proto int xml_parse(resource parser, string data [, int isFinal])
|
||||
Start parsing an XML document */
|
||||
PHP_FUNCTION(xml_parse)
|
||||
{
|
||||
@@ -1471,8 +1471,8 @@ PHP_FUNCTION(xml_parse_into_struct)
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rsZ|Z", &pind, &data, &data_len, &xdata, &info) == FAILURE) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (info) {
|
||||
|
||||
if (info) {
|
||||
zval_dtor(*info);
|
||||
array_init(*info);
|
||||
}
|
||||
@@ -1483,11 +1483,11 @@ PHP_FUNCTION(xml_parse_into_struct)
|
||||
array_init(*xdata);
|
||||
|
||||
parser->data = *xdata;
|
||||
|
||||
|
||||
if (info) {
|
||||
parser->info = *info;
|
||||
}
|
||||
|
||||
|
||||
parser->level = 0;
|
||||
parser->ltags = safe_emalloc(XML_MAXLEVEL, sizeof(char *), 0);
|
||||
|
||||
@@ -1503,7 +1503,7 @@ PHP_FUNCTION(xml_parse_into_struct)
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto int xml_get_error_code(resource parser)
|
||||
/* {{{ proto int xml_get_error_code(resource parser)
|
||||
Get XML parser error code */
|
||||
PHP_FUNCTION(xml_get_error_code)
|
||||
{
|
||||
@@ -1537,7 +1537,7 @@ PHP_FUNCTION(xml_error_string)
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto int xml_get_current_line_number(resource parser)
|
||||
/* {{{ proto int xml_get_current_line_number(resource parser)
|
||||
Get current line number for an XML parser */
|
||||
PHP_FUNCTION(xml_get_current_line_number)
|
||||
{
|
||||
@@ -1569,7 +1569,7 @@ PHP_FUNCTION(xml_get_current_column_number)
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto int xml_get_current_byte_index(resource parser)
|
||||
/* {{{ proto int xml_get_current_byte_index(resource parser)
|
||||
Get current byte index for an XML parser */
|
||||
PHP_FUNCTION(xml_get_current_byte_index)
|
||||
{
|
||||
@@ -1585,7 +1585,7 @@ PHP_FUNCTION(xml_get_current_byte_index)
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto int xml_parser_free(resource parser)
|
||||
/* {{{ proto int xml_parser_free(resource parser)
|
||||
Free an XML parser */
|
||||
PHP_FUNCTION(xml_parser_free)
|
||||
{
|
||||
@@ -1611,7 +1611,7 @@ PHP_FUNCTION(xml_parser_free)
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto int xml_parser_set_option(resource parser, int option, mixed value)
|
||||
/* {{{ proto int xml_parser_set_option(resource parser, int option, mixed value)
|
||||
Set options in an XML parser */
|
||||
PHP_FUNCTION(xml_parser_set_option)
|
||||
{
|
||||
@@ -1657,7 +1657,7 @@ PHP_FUNCTION(xml_parser_set_option)
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto int xml_parser_get_option(resource parser, int option)
|
||||
/* {{{ proto int xml_parser_get_option(resource parser, int option)
|
||||
Get options from an XML parser */
|
||||
PHP_FUNCTION(xml_parser_get_option)
|
||||
{
|
||||
@@ -1687,7 +1687,7 @@ PHP_FUNCTION(xml_parser_get_option)
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto string utf8_encode(string data)
|
||||
/* {{{ proto string utf8_encode(string data)
|
||||
Encodes an ISO-8859-1 string to UTF-8 */
|
||||
PHP_FUNCTION(utf8_encode)
|
||||
{
|
||||
@@ -1707,7 +1707,7 @@ PHP_FUNCTION(utf8_encode)
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto string utf8_decode(string data)
|
||||
/* {{{ proto string utf8_decode(string data)
|
||||
Converts a UTF-8 encoded string to ISO-8859-1 */
|
||||
PHP_FUNCTION(utf8_decode)
|
||||
{
|
||||
|
||||
@@ -5,28 +5,28 @@
|
||||
Epinions.com may be contacted at feedback@epinions-inc.com
|
||||
*/
|
||||
|
||||
/*
|
||||
Copyright 2000 Epinions, Inc.
|
||||
/*
|
||||
Copyright 2000 Epinions, Inc.
|
||||
|
||||
Subject to the following 3 conditions, Epinions, Inc. permits you, free
|
||||
of charge, to (a) use, copy, distribute, modify, perform and display this
|
||||
software and associated documentation files (the "Software"), and (b)
|
||||
permit others to whom the Software is furnished to do so as well.
|
||||
Subject to the following 3 conditions, Epinions, Inc. permits you, free
|
||||
of charge, to (a) use, copy, distribute, modify, perform and display this
|
||||
software and associated documentation files (the "Software"), and (b)
|
||||
permit others to whom the Software is furnished to do so as well.
|
||||
|
||||
1) The above copyright notice and this permission notice shall be included
|
||||
without modification in all copies or substantial portions of the
|
||||
Software.
|
||||
1) The above copyright notice and this permission notice shall be included
|
||||
without modification in all copies or substantial portions of the
|
||||
Software.
|
||||
|
||||
2) THE SOFTWARE IS PROVIDED "AS IS", WITHOUT ANY WARRANTY OR CONDITION OF
|
||||
ANY KIND, EXPRESS, IMPLIED OR STATUTORY, INCLUDING WITHOUT LIMITATION ANY
|
||||
IMPLIED WARRANTIES OF ACCURACY, MERCHANTABILITY, FITNESS FOR A PARTICULAR
|
||||
PURPOSE OR NONINFRINGEMENT.
|
||||
2) THE SOFTWARE IS PROVIDED "AS IS", WITHOUT ANY WARRANTY OR CONDITION OF
|
||||
ANY KIND, EXPRESS, IMPLIED OR STATUTORY, INCLUDING WITHOUT LIMITATION ANY
|
||||
IMPLIED WARRANTIES OF ACCURACY, MERCHANTABILITY, FITNESS FOR A PARTICULAR
|
||||
PURPOSE OR NONINFRINGEMENT.
|
||||
|
||||
3) IN NO EVENT SHALL EPINIONS, INC. BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT
|
||||
OF OR IN CONNECTION WITH THE SOFTWARE (HOWEVER ARISING, INCLUDING
|
||||
NEGLIGENCE), EVEN IF EPINIONS, INC. IS AWARE OF THE POSSIBILITY OF SUCH
|
||||
DAMAGES.
|
||||
3) IN NO EVENT SHALL EPINIONS, INC. BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT
|
||||
OF OR IN CONNECTION WITH THE SOFTWARE (HOWEVER ARISING, INCLUDING
|
||||
NEGLIGENCE), EVEN IF EPINIONS, INC. IS AWARE OF THE POSSIBILITY OF SUCH
|
||||
DAMAGES.
|
||||
|
||||
*/
|
||||
|
||||
@@ -71,7 +71,7 @@ static const char rcsid[] = "#(@) $Id$";
|
||||
*
|
||||
* Oh, and it is also binary safe, ie it can handle strings with embedded NULLs,
|
||||
* so long as the real length is passed in.
|
||||
*
|
||||
*
|
||||
* And the masses rejoiced.
|
||||
*
|
||||
* BUGS
|
||||
@@ -136,7 +136,7 @@ static void simplestring_init_str(simplestring* string) {
|
||||
* NOTES
|
||||
* This function is very fast as it does not de-allocate any memory.
|
||||
* SEE ALSO
|
||||
*
|
||||
*
|
||||
* SOURCE
|
||||
*/
|
||||
void simplestring_clear(simplestring* string) {
|
||||
@@ -172,6 +172,9 @@ void simplestring_free(simplestring* string) {
|
||||
}
|
||||
/******/
|
||||
|
||||
#ifndef SIZE_MAX
|
||||
#define SIZE_MAX ((size_t)-1)
|
||||
#endif
|
||||
/****f* FUNC/simplestring_addn
|
||||
* NAME
|
||||
* simplestring_addn
|
||||
@@ -190,18 +193,31 @@ void simplestring_free(simplestring* string) {
|
||||
* simplestring_add ()
|
||||
* SOURCE
|
||||
*/
|
||||
void simplestring_addn(simplestring* target, const char* source, int add_len) {
|
||||
void simplestring_addn(simplestring* target, const char* source, size_t add_len) {
|
||||
size_t newsize = target->size, incr = 0;
|
||||
if(target && source) {
|
||||
if(!target->str) {
|
||||
simplestring_init_str(target);
|
||||
}
|
||||
|
||||
if((SIZE_MAX - add_len) < target->len || (SIZE_MAX - add_len - 1) < target->len) {
|
||||
/* check for overflows, if there's a potential overflow do nothing */
|
||||
return;
|
||||
}
|
||||
|
||||
if(target->len + add_len + 1 > target->size) {
|
||||
/* newsize is current length + new length */
|
||||
int newsize = target->len + add_len + 1;
|
||||
int incr = target->size * 2;
|
||||
newsize = target->len + add_len + 1;
|
||||
incr = target->size * 2;
|
||||
|
||||
/* align to SIMPLESTRING_INCR increments */
|
||||
newsize = newsize - (newsize % incr) + incr;
|
||||
if (incr) {
|
||||
newsize = newsize - (newsize % incr) + incr;
|
||||
}
|
||||
if(newsize < (target->len + add_len + 1)) {
|
||||
/* some kind of overflow happened */
|
||||
return;
|
||||
}
|
||||
target->str = (char*)realloc(target->str, newsize);
|
||||
|
||||
target->size = target->str ? newsize : 0;
|
||||
|
||||
@@ -63,7 +63,7 @@ void simplestring_init(simplestring* string);
|
||||
void simplestring_clear(simplestring* string);
|
||||
void simplestring_free(simplestring* string);
|
||||
void simplestring_add(simplestring* string, const char* add);
|
||||
void simplestring_addn(simplestring* string, const char* add, int add_len);
|
||||
void simplestring_addn(simplestring* string, const char* add, size_t add_len);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
@@ -1015,6 +1015,14 @@ static int php_zip_has_property(zval *object, zval *member, int type, const zend
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
static HashTable *php_zip_get_gc(zval *object, zval ***gc_data, int *gc_data_count TSRMLS_DC) /* {{{ */
|
||||
{
|
||||
*gc_data = NULL;
|
||||
*gc_data_count = 0;
|
||||
return zend_std_get_properties(object TSRMLS_CC);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
static HashTable *php_zip_get_properties(zval *object TSRMLS_DC)/* {{{ */
|
||||
{
|
||||
ze_zip_object *obj;
|
||||
@@ -2777,6 +2785,7 @@ static PHP_MINIT_FUNCTION(zip)
|
||||
zip_object_handlers.clone_obj = NULL;
|
||||
zip_object_handlers.get_property_ptr_ptr = php_zip_get_property_ptr_ptr;
|
||||
|
||||
zip_object_handlers.get_gc = php_zip_get_gc;
|
||||
zip_object_handlers.get_properties = php_zip_get_properties;
|
||||
zip_object_handlers.read_property = php_zip_read_property;
|
||||
zip_object_handlers.has_property = php_zip_has_property;
|
||||
|
||||
@@ -101,13 +101,13 @@ static int php_zip_ops_stat(php_stream *stream, php_stream_statbuf *ssb TSRMLS_D
|
||||
{
|
||||
struct zip_stat sb;
|
||||
const char *path = stream->orig_path;
|
||||
int path_len = strlen(stream->orig_path);
|
||||
size_t path_len = strlen(stream->orig_path);
|
||||
char *file_basename;
|
||||
size_t file_basename_len;
|
||||
char file_dirname[MAXPATHLEN];
|
||||
struct zip *za;
|
||||
char *fragment;
|
||||
int fragment_len;
|
||||
size_t fragment_len;
|
||||
int err;
|
||||
|
||||
fragment = strchr(path, '#');
|
||||
@@ -214,7 +214,7 @@ php_stream *php_stream_zip_open(char *filename, char *path, char *mode STREAMS_D
|
||||
self = emalloc(sizeof(*self));
|
||||
|
||||
self->za = stream_za;
|
||||
self->zf = zf;
|
||||
self->zf = zf;
|
||||
self->stream = NULL;
|
||||
self->cursor = 0;
|
||||
stream = php_stream_alloc(&php_stream_zipio_ops, self, NULL, mode);
|
||||
@@ -241,7 +241,7 @@ php_stream *php_stream_zip_opener(php_stream_wrapper *wrapper,
|
||||
char **opened_path,
|
||||
php_stream_context *context STREAMS_DC TSRMLS_DC)
|
||||
{
|
||||
int path_len;
|
||||
size_t path_len;
|
||||
|
||||
char *file_basename;
|
||||
size_t file_basename_len;
|
||||
@@ -250,7 +250,7 @@ php_stream *php_stream_zip_opener(php_stream_wrapper *wrapper,
|
||||
struct zip *za;
|
||||
struct zip_file *zf = NULL;
|
||||
char *fragment;
|
||||
int fragment_len;
|
||||
size_t fragment_len;
|
||||
int err;
|
||||
|
||||
php_stream *stream = NULL;
|
||||
@@ -293,7 +293,7 @@ php_stream *php_stream_zip_opener(php_stream_wrapper *wrapper,
|
||||
self = emalloc(sizeof(*self));
|
||||
|
||||
self->za = za;
|
||||
self->zf = zf;
|
||||
self->zf = zf;
|
||||
self->stream = NULL;
|
||||
self->cursor = 0;
|
||||
stream = php_stream_alloc(&php_stream_zipio_ops, self, NULL, mode);
|
||||
|
||||
+26
-22
@@ -1,4 +1,4 @@
|
||||
/*
|
||||
/*
|
||||
+----------------------------------------------------------------------+
|
||||
| PHP Version 5 |
|
||||
+----------------------------------------------------------------------+
|
||||
@@ -132,7 +132,7 @@ PHP_FUNCTION(header_register_callback)
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &callback_func) == FAILURE) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if (!zend_is_callable(callback_func, 0, &callback_name TSRMLS_CC)) {
|
||||
efree(callback_name);
|
||||
RETURN_FALSE;
|
||||
@@ -160,10 +160,10 @@ static void sapi_run_header_callback(TSRMLS_D)
|
||||
char *callback_name = NULL;
|
||||
char *callback_error = NULL;
|
||||
zval *retval_ptr = NULL;
|
||||
|
||||
|
||||
if (zend_fcall_info_init(SG(callback_func), 0, &fci, &SG(fci_cache), &callback_name, &callback_error TSRMLS_CC) == SUCCESS) {
|
||||
fci.retval_ptr_ptr = &retval_ptr;
|
||||
|
||||
|
||||
error = zend_call_function(&fci, &SG(fci_cache) TSRMLS_CC);
|
||||
if (error == FAILURE) {
|
||||
goto callback_failed;
|
||||
@@ -174,13 +174,13 @@ static void sapi_run_header_callback(TSRMLS_D)
|
||||
callback_failed:
|
||||
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Could not call the sapi_header_callback");
|
||||
}
|
||||
|
||||
|
||||
if (callback_name) {
|
||||
efree(callback_name);
|
||||
}
|
||||
if (callback_error) {
|
||||
efree(callback_error);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
SAPI_API void sapi_handle_post(void *arg TSRMLS_DC)
|
||||
@@ -386,11 +386,11 @@ SAPI_API void sapi_activate_headers_only(TSRMLS_D)
|
||||
if (SG(request_info).headers_read == 1)
|
||||
return;
|
||||
SG(request_info).headers_read = 1;
|
||||
zend_llist_init(&SG(sapi_headers).headers, sizeof(sapi_header_struct),
|
||||
zend_llist_init(&SG(sapi_headers).headers, sizeof(sapi_header_struct),
|
||||
(void (*)(void *)) sapi_free_header, 0);
|
||||
SG(sapi_headers).send_default_content_type = 1;
|
||||
|
||||
/* SG(sapi_headers).http_response_code = 200; */
|
||||
/* SG(sapi_headers).http_response_code = 200; */
|
||||
SG(sapi_headers).http_status_line = NULL;
|
||||
SG(sapi_headers).mimetype = NULL;
|
||||
SG(read_post_bytes) = 0;
|
||||
@@ -403,7 +403,7 @@ SAPI_API void sapi_activate_headers_only(TSRMLS_D)
|
||||
SG(global_request_time) = 0;
|
||||
|
||||
/*
|
||||
* It's possible to override this general case in the activate() callback,
|
||||
* It's possible to override this general case in the activate() callback,
|
||||
* if necessary.
|
||||
*/
|
||||
if (SG(request_info).request_method && !strcmp(SG(request_info).request_method, "HEAD")) {
|
||||
@@ -465,8 +465,8 @@ SAPI_API void sapi_activate(TSRMLS_D)
|
||||
* depending on given content type */
|
||||
sapi_read_post_data(TSRMLS_C);
|
||||
} else {
|
||||
/* Any other method with content payload will fill $HTTP_RAW_POST_DATA
|
||||
* if it is enabled by always_populate_raw_post_data.
|
||||
/* Any other method with content payload will fill $HTTP_RAW_POST_DATA
|
||||
* if it is enabled by always_populate_raw_post_data.
|
||||
* It's up to the webserver to decide whether to allow a method or not. */
|
||||
SG(request_info).content_type_dup = NULL;
|
||||
if (sapi_module.default_post_reader) {
|
||||
@@ -497,14 +497,14 @@ static void sapi_send_headers_free(TSRMLS_D)
|
||||
SG(sapi_headers).http_status_line = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
SAPI_API void sapi_deactivate(TSRMLS_D)
|
||||
{
|
||||
zend_llist_destroy(&SG(sapi_headers).headers);
|
||||
if (SG(request_info).post_data) {
|
||||
efree(SG(request_info).post_data);
|
||||
} else if (SG(server_context)) {
|
||||
if(sapi_module.read_post) {
|
||||
if(sapi_module.read_post) {
|
||||
/* make sure we've consumed all request input data */
|
||||
char dummy[SAPI_POST_BLOCK_SIZE];
|
||||
int read_bytes;
|
||||
@@ -516,7 +516,7 @@ SAPI_API void sapi_deactivate(TSRMLS_D)
|
||||
}
|
||||
if (SG(request_info).raw_post_data) {
|
||||
efree(SG(request_info).raw_post_data);
|
||||
}
|
||||
}
|
||||
if (SG(request_info).auth_user) {
|
||||
efree(SG(request_info).auth_user);
|
||||
}
|
||||
@@ -574,7 +574,7 @@ static int sapi_extract_response_code(const char *header_line)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return code;
|
||||
}
|
||||
|
||||
@@ -594,7 +594,7 @@ static void sapi_update_response_code(int ncode TSRMLS_DC)
|
||||
SG(sapi_headers).http_response_code = ncode;
|
||||
}
|
||||
|
||||
/*
|
||||
/*
|
||||
* since zend_llist_del_element only remove one matched item once,
|
||||
* we should remove them by ourself
|
||||
*/
|
||||
@@ -630,7 +630,7 @@ SAPI_API int sapi_add_header_ex(char *header_line, uint header_line_len, zend_bo
|
||||
{
|
||||
sapi_header_line ctr = {0};
|
||||
int r;
|
||||
|
||||
|
||||
ctr.line = header_line;
|
||||
ctr.line_len = header_line_len;
|
||||
|
||||
@@ -724,7 +724,7 @@ SAPI_API int sapi_header_op(sapi_header_op_enum op, void *arg TSRMLS_DC)
|
||||
} while(header_line_len && isspace(header_line[header_line_len-1]));
|
||||
header_line[header_line_len]='\0';
|
||||
}
|
||||
|
||||
|
||||
if (op == SAPI_HEADER_DELETE) {
|
||||
if (strchr(header_line, ':')) {
|
||||
efree(header_line);
|
||||
@@ -762,7 +762,7 @@ SAPI_API int sapi_header_op(sapi_header_op_enum op, void *arg TSRMLS_DC)
|
||||
sapi_header.header_len = header_line_len;
|
||||
|
||||
/* Check the header for a few cases that we have special support for in SAPI */
|
||||
if (header_line_len>=5
|
||||
if (header_line_len>=5
|
||||
&& !strncasecmp(header_line, "HTTP/", 5)) {
|
||||
/* filter out the response code */
|
||||
sapi_update_response_code(sapi_extract_response_code(header_line) TSRMLS_CC);
|
||||
@@ -821,8 +821,8 @@ SAPI_API int sapi_header_op(sapi_header_op_enum op, void *arg TSRMLS_DC)
|
||||
/* Return a Found Redirect if one is not already specified */
|
||||
if (http_response_code) { /* user specified redirect code */
|
||||
sapi_update_response_code(http_response_code TSRMLS_CC);
|
||||
} else if (SG(request_info).proto_num > 1000 &&
|
||||
SG(request_info).request_method &&
|
||||
} else if (SG(request_info).proto_num > 1000 &&
|
||||
SG(request_info).request_method &&
|
||||
strcmp(SG(request_info).request_method, "HEAD") &&
|
||||
strcmp(SG(request_info).request_method, "GET")) {
|
||||
sapi_update_response_code(303 TSRMLS_CC);
|
||||
@@ -1011,7 +1011,11 @@ SAPI_API struct stat *sapi_get_stat(TSRMLS_D)
|
||||
|
||||
SAPI_API char *sapi_getenv(char *name, size_t name_len TSRMLS_DC)
|
||||
{
|
||||
if (sapi_module.getenv) {
|
||||
if (!strncasecmp(name, "HTTP_PROXY", name_len)) {
|
||||
/* Ugly fix for HTTP_PROXY issue, see bug #72573 */
|
||||
return NULL;
|
||||
}
|
||||
if (sapi_module.getenv) {
|
||||
char *value, *tmp = sapi_module.getenv(name, name_len TSRMLS_CC);
|
||||
if (tmp) {
|
||||
value = estrdup(tmp);
|
||||
|
||||
+38
-19
@@ -43,7 +43,7 @@ PHPAPI void php_register_variable_safe(char *var, char *strval, int str_len, zva
|
||||
{
|
||||
zval new_entry;
|
||||
assert(strval != NULL);
|
||||
|
||||
|
||||
/* Prepare value */
|
||||
Z_STRLEN(new_entry) = str_len;
|
||||
Z_STRVAL(new_entry) = estrndup(strval, Z_STRLEN(new_entry));
|
||||
@@ -81,7 +81,7 @@ PHPAPI void php_register_variable_ex(char *var_name, zval *val, zval *track_vars
|
||||
while (*var_name && *var_name==' ') {
|
||||
var_name++;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Prepare variable name
|
||||
*/
|
||||
@@ -167,7 +167,7 @@ PHPAPI void php_register_variable_ex(char *var_name, zval *val, zval *track_vars
|
||||
return;
|
||||
}
|
||||
*ip = 0;
|
||||
new_idx_len = strlen(index_s);
|
||||
new_idx_len = strlen(index_s);
|
||||
}
|
||||
|
||||
if (!index) {
|
||||
@@ -210,7 +210,7 @@ plain_var:
|
||||
zval_ptr_dtor(&gpc_element);
|
||||
}
|
||||
} else {
|
||||
/*
|
||||
/*
|
||||
* According to rfc2965, more specific paths are listed above the less specific ones.
|
||||
* If we encounter a duplicate cookie name, we should skip it, since it is not possible
|
||||
* to have the same (plain text) cookie name for the same path and we should not overwrite
|
||||
@@ -236,7 +236,7 @@ SAPI_API SAPI_POST_HANDLER_FUNC(php_std_post_handler)
|
||||
|
||||
if (SG(request_info).post_data == NULL) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
s = SG(request_info).post_data;
|
||||
e = s + SG(request_info).post_data_length;
|
||||
@@ -284,7 +284,7 @@ SAPI_API SAPI_TREAT_DATA_FUNC(php_default_treat_data)
|
||||
int free_buffer = 0;
|
||||
char *strtok_buf = NULL;
|
||||
long count = 0;
|
||||
|
||||
|
||||
switch (arg) {
|
||||
case PARSE_POST:
|
||||
case PARSE_GET:
|
||||
@@ -357,9 +357,9 @@ SAPI_API SAPI_TREAT_DATA_FUNC(php_default_treat_data)
|
||||
separator = ";\0";
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
var = php_strtok_r(res, separator, &strtok_buf);
|
||||
|
||||
|
||||
while (var) {
|
||||
val = strchr(var, '=');
|
||||
|
||||
@@ -454,11 +454,11 @@ static void php_build_argv(char *s, zval *track_vars_array TSRMLS_DC)
|
||||
zval *arr, *argc, *tmp;
|
||||
int count = 0;
|
||||
char *ss, *space;
|
||||
|
||||
|
||||
if (!(SG(request_info).argc || track_vars_array)) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
ALLOC_INIT_ZVAL(arr);
|
||||
array_init(arr);
|
||||
|
||||
@@ -519,7 +519,7 @@ static void php_build_argv(char *s, zval *track_vars_array TSRMLS_DC)
|
||||
Z_ADDREF_P(argc);
|
||||
zend_hash_update(&EG(symbol_table), "argv", sizeof("argv"), &arr, sizeof(zval *), NULL);
|
||||
zend_hash_update(&EG(symbol_table), "argc", sizeof("argc"), &argc, sizeof(zval *), NULL);
|
||||
}
|
||||
}
|
||||
if (track_vars_array) {
|
||||
Z_ADDREF_P(arr);
|
||||
Z_ADDREF_P(argc);
|
||||
@@ -649,7 +649,7 @@ static zend_bool php_auto_globals_create_get(const char *name, uint name_len TSR
|
||||
|
||||
zend_hash_update(&EG(symbol_table), name, name_len + 1, &vars, sizeof(zval *), NULL);
|
||||
Z_ADDREF_P(vars);
|
||||
|
||||
|
||||
return 0; /* don't rearm */
|
||||
}
|
||||
|
||||
@@ -676,7 +676,7 @@ static zend_bool php_auto_globals_create_post(const char *name, uint name_len TS
|
||||
|
||||
zend_hash_update(&EG(symbol_table), name, name_len + 1, &vars, sizeof(zval *), NULL);
|
||||
Z_ADDREF_P(vars);
|
||||
|
||||
|
||||
return 0; /* don't rearm */
|
||||
}
|
||||
|
||||
@@ -699,7 +699,7 @@ static zend_bool php_auto_globals_create_cookie(const char *name, uint name_len
|
||||
|
||||
zend_hash_update(&EG(symbol_table), name, name_len + 1, &vars, sizeof(zval *), NULL);
|
||||
Z_ADDREF_P(vars);
|
||||
|
||||
|
||||
return 0; /* don't rearm */
|
||||
}
|
||||
|
||||
@@ -718,10 +718,27 @@ static zend_bool php_auto_globals_create_files(const char *name, uint name_len T
|
||||
|
||||
zend_hash_update(&EG(symbol_table), name, name_len + 1, &vars, sizeof(zval *), NULL);
|
||||
Z_ADDREF_P(vars);
|
||||
|
||||
|
||||
return 0; /* don't rearm */
|
||||
}
|
||||
|
||||
/* Upgly hack to fix HTTP_PROXY issue, see bug #72573 */
|
||||
static void check_http_proxy(HashTable *var_table)
|
||||
{
|
||||
if (zend_hash_exists(var_table, "HTTP_PROXY", sizeof("HTTP_PROXY"))) {
|
||||
char *local_proxy = getenv("HTTP_PROXY");
|
||||
|
||||
if (!local_proxy) {
|
||||
zend_hash_del(var_table, "HTTP_PROXY", sizeof("HTTP_PROXY"));
|
||||
} else {
|
||||
zval *local_zval;
|
||||
ALLOC_INIT_ZVAL(local_zval);
|
||||
ZVAL_STRING(local_zval, local_proxy, 1);
|
||||
zend_hash_update(var_table, "HTTP_PROXY", sizeof("HTTP_PROXY"), &local_zval, sizeof(zval **), NULL);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static zend_bool php_auto_globals_create_server(const char *name, uint name_len TSRMLS_DC)
|
||||
{
|
||||
if (PG(variables_order) && (strchr(PG(variables_order),'S') || strchr(PG(variables_order),'s'))) {
|
||||
@@ -730,7 +747,7 @@ static zend_bool php_auto_globals_create_server(const char *name, uint name_len
|
||||
if (PG(register_argc_argv)) {
|
||||
if (SG(request_info).argc) {
|
||||
zval **argc, **argv;
|
||||
|
||||
|
||||
if (zend_hash_find(&EG(symbol_table), "argc", sizeof("argc"), (void**)&argc) == SUCCESS &&
|
||||
zend_hash_find(&EG(symbol_table), "argv", sizeof("argv"), (void**)&argv) == SUCCESS) {
|
||||
Z_ADDREF_PP(argc);
|
||||
@@ -742,7 +759,7 @@ static zend_bool php_auto_globals_create_server(const char *name, uint name_len
|
||||
php_build_argv(SG(request_info).query_string, PG(http_globals)[TRACK_VARS_SERVER] TSRMLS_CC);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
} else {
|
||||
zval *server_vars=NULL;
|
||||
ALLOC_ZVAL(server_vars);
|
||||
@@ -754,9 +771,10 @@ static zend_bool php_auto_globals_create_server(const char *name, uint name_len
|
||||
PG(http_globals)[TRACK_VARS_SERVER] = server_vars;
|
||||
}
|
||||
|
||||
check_http_proxy(Z_ARRVAL_P(PG(http_globals)[TRACK_VARS_SERVER]));
|
||||
zend_hash_update(&EG(symbol_table), name, name_len + 1, &PG(http_globals)[TRACK_VARS_SERVER], sizeof(zval *), NULL);
|
||||
Z_ADDREF_P(PG(http_globals)[TRACK_VARS_SERVER]);
|
||||
|
||||
|
||||
return 0; /* don't rearm */
|
||||
}
|
||||
|
||||
@@ -770,11 +788,12 @@ static zend_bool php_auto_globals_create_env(const char *name, uint name_len TSR
|
||||
zval_ptr_dtor(&PG(http_globals)[TRACK_VARS_ENV]);
|
||||
}
|
||||
PG(http_globals)[TRACK_VARS_ENV] = env_vars;
|
||||
|
||||
|
||||
if (PG(variables_order) && (strchr(PG(variables_order),'E') || strchr(PG(variables_order),'e'))) {
|
||||
php_import_environment_variables(PG(http_globals)[TRACK_VARS_ENV] TSRMLS_CC);
|
||||
}
|
||||
|
||||
check_http_proxy(Z_ARRVAL_P(PG(http_globals)[TRACK_VARS_ENV]));
|
||||
zend_hash_update(&EG(symbol_table), name, name_len + 1, &PG(http_globals)[TRACK_VARS_ENV], sizeof(zval *), NULL);
|
||||
Z_ADDREF_P(PG(http_globals)[TRACK_VARS_ENV]);
|
||||
|
||||
|
||||
+4
-4
@@ -2,7 +2,7 @@
|
||||
/* edit configure.in to change version number */
|
||||
#define PHP_MAJOR_VERSION 5
|
||||
#define PHP_MINOR_VERSION 5
|
||||
#define PHP_RELEASE_VERSION 33
|
||||
#define PHP_EXTRA_VERSION "-dev"
|
||||
#define PHP_VERSION "5.5.33-dev"
|
||||
#define PHP_VERSION_ID 50533
|
||||
#define PHP_RELEASE_VERSION 38
|
||||
#define PHP_EXTRA_VERSION ""
|
||||
#define PHP_VERSION "5.5.38"
|
||||
#define PHP_VERSION_ID 50538
|
||||
Reference in new issue
Block a user