summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2020-09-21 15:46:55 +0200
committerNikita Popov <nikita.ppv@gmail.com>2020-09-21 15:46:55 +0200
commitd1bbc39e4cbf3068ac64e8b107814e0bb8ddc762 (patch)
treeee05af3988e27052eac0d7a3c4706c7cbe045afb
parent5bb41fa63cec0b25470c8202c58f019929dc29a6 (diff)
downloadphp-git-d1bbc39e4cbf3068ac64e8b107814e0bb8ddc762.tar.gz
pg_unescape_bytea() can only fail on OOM
The implementation did not check for PQunescapeBytea failure correctly, because it checked for a null pointer after estrndup, which certainly cannot happen. Inspection of the PGunescapeBytea implementation has shown that this function can only fail on OOM, so let's check for that explicitly and remove false as a possible return type. While we're here, avoid an unnecessary copy of the result.
-rw-r--r--ext/opcache/Optimizer/zend_func_info.c2
-rw-r--r--ext/pgsql/pgsql.c15
-rw-r--r--ext/pgsql/pgsql.stub.php2
-rw-r--r--ext/pgsql/pgsql_arginfo.h4
4 files changed, 11 insertions, 12 deletions
diff --git a/ext/opcache/Optimizer/zend_func_info.c b/ext/opcache/Optimizer/zend_func_info.c
index 6b8cb33f56..7471da8220 100644
--- a/ext/opcache/Optimizer/zend_func_info.c
+++ b/ext/opcache/Optimizer/zend_func_info.c
@@ -720,7 +720,7 @@ static const func_info_t func_infos[] = {
F1("pg_copy_to", MAY_BE_FALSE | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_LONG | MAY_BE_ARRAY_OF_STRING),
F1("pg_escape_string", MAY_BE_STRING),
F1("pg_escape_bytea", MAY_BE_STRING),
- F1("pg_unescape_bytea", MAY_BE_FALSE | MAY_BE_STRING),
+ F1("pg_unescape_bytea", MAY_BE_STRING),
F1("pg_escape_literal", MAY_BE_FALSE | MAY_BE_STRING),
F1("pg_escape_identifier", MAY_BE_FALSE | MAY_BE_STRING),
F1("pg_result_error", MAY_BE_FALSE | MAY_BE_STRING),
diff --git a/ext/pgsql/pgsql.c b/ext/pgsql/pgsql.c
index 31bb834314..0112bcc7b6 100644
--- a/ext/pgsql/pgsql.c
+++ b/ext/pgsql/pgsql.c
@@ -3362,7 +3362,7 @@ PHP_FUNCTION(pg_escape_bytea)
/* {{{ Unescape binary for bytea type */
PHP_FUNCTION(pg_unescape_bytea)
{
- char *from = NULL, *to = NULL, *tmp = NULL;
+ char *from, *tmp;
size_t to_len;
size_t from_len;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "s!",
@@ -3371,14 +3371,13 @@ PHP_FUNCTION(pg_unescape_bytea)
}
tmp = (char *)PQunescapeBytea((unsigned char*)from, &to_len);
- to = estrndup(tmp, to_len);
- PQfreemem(tmp);
- if (!to) {
- php_error_docref(NULL, E_WARNING,"Invalid parameter");
- RETURN_FALSE;
+ if (!tmp) {
+ zend_error(E_ERROR, "Out of memory");
+ return;
}
- RETVAL_STRINGL(to, to_len);
- efree(to);
+
+ RETVAL_STRINGL(tmp, to_len);
+ PQfreemem(tmp);
}
/* }}} */
diff --git a/ext/pgsql/pgsql.stub.php b/ext/pgsql/pgsql.stub.php
index e5e5300056..181d62c9cd 100644
--- a/ext/pgsql/pgsql.stub.php
+++ b/ext/pgsql/pgsql.stub.php
@@ -425,7 +425,7 @@ function pg_escape_string($connection, string $data = UNKNOWN): string {}
/** @param resource|string $connection */
function pg_escape_bytea($connection, string $data = UNKNOWN): string {}
-function pg_unescape_bytea(?string $data = null): string|false {}
+function pg_unescape_bytea(?string $data = null): string {}
/** @param resource|string $connection */
function pg_escape_literal($connection, string $data = UNKNOWN): string|false {}
diff --git a/ext/pgsql/pgsql_arginfo.h b/ext/pgsql/pgsql_arginfo.h
index a6adbb7582..c2b2387154 100644
--- a/ext/pgsql/pgsql_arginfo.h
+++ b/ext/pgsql/pgsql_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: e5f2c8b3b23876a05a48500f626e81549e5d2ab1 */
+ * Stub hash: 87152e947ab7bfb3a9d7df30dd6fbccac504504e */
ZEND_BEGIN_ARG_INFO_EX(arginfo_pg_connect, 0, 0, 1)
ZEND_ARG_TYPE_INFO(0, connection_string, IS_STRING, 0)
@@ -325,7 +325,7 @@ ZEND_END_ARG_INFO()
#define arginfo_pg_escape_bytea arginfo_pg_escape_string
-ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_pg_unescape_bytea, 0, 0, MAY_BE_STRING|MAY_BE_FALSE)
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_pg_unescape_bytea, 0, 0, IS_STRING, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, data, IS_STRING, 1, "null")
ZEND_END_ARG_INFO()