summaryrefslogtreecommitdiff
path: root/ext/pgsql/pgsql.c
diff options
context:
space:
mode:
authorAnatol Belski <ab@php.net>2014-11-18 21:18:52 +0100
committerAnatol Belski <ab@php.net>2014-11-18 21:18:52 +0100
commitc6bad96f306df8e8b656472e618283ced5083cdb (patch)
tree7e5b52aa07777f0336b0944a228bf66f8f56b31f /ext/pgsql/pgsql.c
parent4262663e4caa82ba17666781a95bdcb872b4e109 (diff)
parent64a39dc7b07d4b54d050a3a5c15045fe91c0b651 (diff)
downloadphp-git-c6bad96f306df8e8b656472e618283ced5083cdb.tar.gz
Merge remote-tracking branch 'origin/master' into native-tls
* origin/master: (398 commits) NEWS add test for bug #68381 Fixed bug #68381 Set FPM log level earlier during init proper dllexport move to size_t where zend_string is used internally fix some datatype mismatches return after the warning, to fix uninitialized salt usage fix datatype mismatches add missing type specifier fix datatype mismatches fix unsigned check "extern" shouldn't be used for definitions joined identical conditional blocks simplify fpm tests SEND_VAR_NO_REF optimization Add test for bug #68442 Add various tests for FPM - covering recent bugs (68420, 68421, 68423, 68428) - for UDS - for ping and status URI - for multi pool and multi mode Include small MIT FastCGI client library from https://github.com/adoy/PHP-FastCGI-Client Get rid of zend_free_op structure (use zval* instead). Get rid of useless TSRMLS arguments. Add new FPM test for IPv4/IPv6 ... Conflicts: win32/build/config.w32
Diffstat (limited to 'ext/pgsql/pgsql.c')
-rw-r--r--ext/pgsql/pgsql.c133
1 files changed, 72 insertions, 61 deletions
diff --git a/ext/pgsql/pgsql.c b/ext/pgsql/pgsql.c
index 3645e0a897..63cca9fc1c 100644
--- a/ext/pgsql/pgsql.c
+++ b/ext/pgsql/pgsql.c
@@ -87,6 +87,7 @@
#endif
#define CHECK_DEFAULT_LINK(x) if ((x) == -1) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "No PostgreSQL link opened yet"); }
+#define FETCH_DEFAULT_LINK() PGG(default_link) ? (int)PGG(default_link)->handle : -1
#ifndef HAVE_PQFREEMEM
#define PQfreemem free
@@ -1278,7 +1279,8 @@ static void php_pgsql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent)
PGconn *pgsql;
smart_str str = {0};
zval *args;
- int i, connect_type = 0;
+ uint32_t i;
+ int connect_type = 0;
PGresult *pg_result;
args = (zval *)safe_emalloc(ZEND_NUM_ARGS(), sizeof(zval), 0);
@@ -1313,7 +1315,7 @@ static void php_pgsql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent)
} else if (ZEND_NUM_ARGS() == 2 ) { /* Safe to add conntype_option, since 2 args was illegal */
connstring = Z_STRVAL(args[0]);
convert_to_long_ex(&args[1]);
- connect_type = Z_LVAL(args[1]);
+ connect_type = (int)Z_LVAL(args[1]);
} else {
host = Z_STRVAL(args[0]);
port = Z_STRVAL(args[1]);
@@ -1566,7 +1568,7 @@ PHP_FUNCTION(pg_close)
}
if (argc == 0) {
- id = PGG(default_link)? PGG(default_link)->handle : -1;
+ id = FETCH_DEFAULT_LINK();
CHECK_DEFAULT_LINK(id);
}
@@ -1613,7 +1615,7 @@ static void php_pgsql_get_link_info(INTERNAL_FUNCTION_PARAMETERS, int entry_type
}
if (argc == 0) {
- id = PGG(default_link)? PGG(default_link)->handle : -1;
+ id = FETCH_DEFAULT_LINK();
CHECK_DEFAULT_LINK(id);
}
@@ -1760,7 +1762,7 @@ PHP_FUNCTION(pg_parameter_status)
id = -1;
} else if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &param, &len) == SUCCESS) {
pgsql_link = NULL;
- id = PGG(default_link)? PGG(default_link)->handle : -1;
+ id = FETCH_DEFAULT_LINK();
} else {
RETURN_FALSE;
}
@@ -1793,7 +1795,7 @@ PHP_FUNCTION(pg_ping)
id = -1;
} else {
pgsql_link = NULL;
- id = PGG(default_link)? PGG(default_link)->handle : -1;
+ id = FETCH_DEFAULT_LINK();
}
if (pgsql_link == NULL && id == -1) {
RETURN_FALSE;
@@ -1836,7 +1838,7 @@ PHP_FUNCTION(pg_query)
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &query, &query_len) == FAILURE) {
return;
}
- id = PGG(default_link)? PGG(default_link)->handle : -1;
+ id = FETCH_DEFAULT_LINK();
CHECK_DEFAULT_LINK(id);
} else {
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &pgsql_link, &query, &query_len) == FAILURE) {
@@ -1939,7 +1941,7 @@ PHP_FUNCTION(pg_query_params)
if (zend_parse_parameters(argc TSRMLS_CC, "sa", &query, &query_len, &pv_param_arr) == FAILURE) {
return;
}
- id = PGG(default_link)? PGG(default_link)->handle : -1;
+ id = FETCH_DEFAULT_LINK();
CHECK_DEFAULT_LINK(id);
} else {
if (zend_parse_parameters(argc TSRMLS_CC, "rsa", &pgsql_link, &query, &query_len, &pv_param_arr) == FAILURE) {
@@ -2055,7 +2057,7 @@ PHP_FUNCTION(pg_prepare)
if (zend_parse_parameters(argc TSRMLS_CC, "ss", &stmtname, &stmtname_len, &query, &query_len) == FAILURE) {
return;
}
- id = PGG(default_link)? PGG(default_link)->handle : -1;
+ id = FETCH_DEFAULT_LINK();
CHECK_DEFAULT_LINK(id);
} else {
if (zend_parse_parameters(argc TSRMLS_CC, "rss", &pgsql_link, &stmtname, &stmtname_len, &query, &query_len) == FAILURE) {
@@ -2142,7 +2144,7 @@ PHP_FUNCTION(pg_execute)
if (zend_parse_parameters(argc TSRMLS_CC, "sa/", &stmtname, &stmtname_len, &pv_param_arr)==FAILURE) {
return;
}
- id = PGG(default_link)? PGG(default_link)->handle : -1;
+ id = FETCH_DEFAULT_LINK();
CHECK_DEFAULT_LINK(id);
} else {
if (zend_parse_parameters(argc TSRMLS_CC, "rsa/", &pgsql_link, &stmtname, &stmtname_len, &pv_param_arr) == FAILURE) {
@@ -2420,7 +2422,7 @@ PHP_FUNCTION(pg_field_table)
RETURN_FALSE;
}
- oid = PQftable(pg_result->result, fnum);
+ oid = PQftable(pg_result->result, (int)fnum);
if (InvalidOid == oid) {
RETURN_FALSE;
@@ -2515,20 +2517,20 @@ static void php_pgsql_get_field_info(INTERNAL_FUNCTION_PARAMETERS, int entry_typ
switch (entry_type) {
case PHP_PG_FIELD_NAME:
- RETURN_STRING(PQfname(pgsql_result, field));
+ RETURN_STRING(PQfname(pgsql_result, (int)field));
break;
case PHP_PG_FIELD_SIZE:
- RETURN_LONG(PQfsize(pgsql_result, field));
+ RETURN_LONG(PQfsize(pgsql_result, (int)field));
break;
case PHP_PG_FIELD_TYPE: {
- char *name = get_field_name(pg_result->conn, PQftype(pgsql_result, field), &EG(regular_list) TSRMLS_CC);
+ char *name = get_field_name(pg_result->conn, PQftype(pgsql_result, (int)field), &EG(regular_list) TSRMLS_CC);
RETVAL_STRING(name);
efree(name);
}
break;
case PHP_PG_FIELD_TYPE_OID:
- oid = PQftype(pgsql_result, field);
+ oid = PQftype(pgsql_result, (int)field);
#if UINT_MAX > ZEND_LONG_MAX
if (oid > ZEND_LONG_MAX) {
smart_str s = {0};
@@ -2633,26 +2635,30 @@ PHP_FUNCTION(pg_fetch_result)
RETURN_FALSE;
}
} else {
- pgsql_row = row;
- if (pgsql_row < 0 || pgsql_row >= PQntuples(pgsql_result)) {
+ if (row < 0 || row >= PQntuples(pgsql_result)) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to jump to row %pd on PostgreSQL result index %pd",
row, Z_LVAL_P(result));
RETURN_FALSE;
}
+ pgsql_row = (int)row;
}
switch (Z_TYPE_P(field)) {
case IS_STRING:
field_offset = PQfnumber(pgsql_result, Z_STRVAL_P(field));
+ if (field_offset < 0 || field_offset >= PQnfields(pgsql_result)) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Bad column offset specified");
+ RETURN_FALSE;
+ }
break;
default:
convert_to_long_ex(field);
- field_offset = Z_LVAL_P(field);
+ if (Z_LVAL_P(field) < 0 || Z_LVAL_P(field) >= PQnfields(pgsql_result)) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Bad column offset specified");
+ RETURN_FALSE;
+ }
+ field_offset = (int)Z_LVAL_P(field);
break;
}
- if (field_offset < 0 || field_offset >= PQnfields(pgsql_result)) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Bad column offset specified");
- RETURN_FALSE;
- }
if (PQgetisnull(pgsql_result, pgsql_row, field_offset)) {
RETVAL_NULL();
@@ -2718,13 +2724,13 @@ static void php_pgsql_fetch_hash(INTERNAL_FUNCTION_PARAMETERS, zend_long result_
pgsql_result = pg_result->result;
if (use_row) {
- pgsql_row = row;
- pg_result->row = pgsql_row;
- if (pgsql_row < 0 || pgsql_row >= PQntuples(pgsql_result)) {
+ if (row < 0 || row >= PQntuples(pgsql_result)) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to jump to row %pd on PostgreSQL result index %pd",
row, Z_LVAL_P(result));
RETURN_FALSE;
}
+ pgsql_row = (int)row;
+ pg_result->row = pgsql_row;
} else {
/* If 2nd param is NULL, use internal row counter to access next row */
pgsql_row = pg_result->row;
@@ -2904,7 +2910,7 @@ PHP_FUNCTION(pg_fetch_all_columns)
pgsql_result = pg_result->result;
num_fields = PQnfields(pgsql_result);
- if (colno >= num_fields || colno < 0) {
+ if (colno >= (zend_long)num_fields || colno < 0) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid column number '%pd'", colno);
RETURN_FALSE;
}
@@ -2916,10 +2922,10 @@ PHP_FUNCTION(pg_fetch_all_columns)
}
for (pg_row = 0; pg_row < pg_numrows; pg_row++) {
- if (PQgetisnull(pgsql_result, pg_row, colno)) {
+ if (PQgetisnull(pgsql_result, pg_row, (int)colno)) {
add_next_index_null(return_value);
} else {
- add_next_index_string(return_value, PQgetvalue(pgsql_result, pg_row, colno));
+ add_next_index_string(return_value, PQgetvalue(pgsql_result, pg_row, (int)colno));
}
}
}
@@ -2944,7 +2950,7 @@ PHP_FUNCTION(pg_result_seek)
}
/* seek to offset */
- pg_result->row = row;
+ pg_result->row = (int)row;
RETURN_TRUE;
}
/* }}} */
@@ -2984,28 +2990,32 @@ static void php_pgsql_data_info(INTERNAL_FUNCTION_PARAMETERS, int entry_type)
RETURN_FALSE;
}
} else {
- pgsql_row = row;
- if (pgsql_row < 0 || pgsql_row >= PQntuples(pgsql_result)) {
+ if (row < 0 || row >= PQntuples(pgsql_result)) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to jump to row %pd on PostgreSQL result index %pd",
row, Z_LVAL_P(result));
RETURN_FALSE;
}
+ pgsql_row = (int)row;
}
switch (Z_TYPE_P(field)) {
case IS_STRING:
convert_to_string_ex(field);
field_offset = PQfnumber(pgsql_result, Z_STRVAL_P(field));
+ if (field_offset < 0 || field_offset >= PQnfields(pgsql_result)) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Bad column offset specified");
+ RETURN_FALSE;
+ }
break;
default:
convert_to_long_ex(field);
- field_offset = Z_LVAL_P(field);
+ if (Z_LVAL_P(field) < 0 || Z_LVAL_P(field) >= PQnfields(pgsql_result)) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Bad column offset specified");
+ RETURN_FALSE;
+ }
+ field_offset = (int)Z_LVAL_P(field);
break;
}
- if (field_offset < 0 || field_offset >= PQnfields(pgsql_result)) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Bad column offset specified");
- RETURN_FALSE;
- }
switch (entry_type) {
case PHP_PG_DATA_LENGTH:
@@ -3098,7 +3108,7 @@ PHP_FUNCTION(pg_trace)
PGconn *pgsql;
FILE *fp = NULL;
php_stream *stream;
- id = PGG(default_link)? PGG(default_link)->handle : -1;
+ id = FETCH_DEFAULT_LINK();
if (zend_parse_parameters(argc TSRMLS_CC, "s|sr", &z_filename, &z_filename_len, &mode, &mode_len, &pgsql_link) == FAILURE) {
return;
@@ -3143,7 +3153,7 @@ PHP_FUNCTION(pg_untrace)
}
if (argc == 0) {
- id = PGG(default_link)? PGG(default_link)->handle : -1;
+ id = FETCH_DEFAULT_LINK();
CHECK_DEFAULT_LINK(id);
}
@@ -3176,7 +3186,7 @@ PHP_FUNCTION(pg_lo_create)
}
if (pgsql_link == NULL) {
- id = PGG(default_link)? PGG(default_link)->handle : -1;
+ id = FETCH_DEFAULT_LINK();
CHECK_DEFAULT_LINK(id);
if (id == -1) {
RETURN_FALSE;
@@ -3269,7 +3279,7 @@ PHP_FUNCTION(pg_lo_unlink)
php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Wrong OID value passed");
RETURN_FALSE;
}
- id = PGG(default_link)? PGG(default_link)->handle : -1;
+ id = FETCH_DEFAULT_LINK();
CHECK_DEFAULT_LINK(id);
}
else if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, argc TSRMLS_CC,
@@ -3279,7 +3289,7 @@ PHP_FUNCTION(pg_lo_unlink)
RETURN_FALSE;
}
oid = (Oid)oid_long;
- id = PGG(default_link)? PGG(default_link)->handle : -1;
+ id = FETCH_DEFAULT_LINK();
CHECK_DEFAULT_LINK(id);
}
else {
@@ -3341,7 +3351,7 @@ PHP_FUNCTION(pg_lo_open)
php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Wrong OID value passed");
RETURN_FALSE;
}
- id = PGG(default_link)? PGG(default_link)->handle : -1;
+ id = FETCH_DEFAULT_LINK();
CHECK_DEFAULT_LINK(id);
}
else if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, argc TSRMLS_CC,
@@ -3351,7 +3361,7 @@ PHP_FUNCTION(pg_lo_open)
RETURN_FALSE;
}
oid = (Oid)oid_long;
- id = PGG(default_link)? PGG(default_link)->handle : -1;
+ id = FETCH_DEFAULT_LINK();
CHECK_DEFAULT_LINK(id);
}
else {
@@ -3453,7 +3463,8 @@ PHP_FUNCTION(pg_lo_read)
{
zval *pgsql_id;
zend_long len;
- int buf_len = PGSQL_LO_READ_BUF_SIZE, nbytes, argc = ZEND_NUM_ARGS();
+ size_t buf_len = PGSQL_LO_READ_BUF_SIZE;
+ int nbytes, argc = ZEND_NUM_ARGS();
zend_string *buf;
pgLofp *pgsql;
@@ -3464,7 +3475,7 @@ PHP_FUNCTION(pg_lo_read)
ZEND_FETCH_RESOURCE(pgsql, pgLofp *, pgsql_id, -1, "PostgreSQL large object", le_lofp);
if (argc > 1) {
- buf_len = len;
+ buf_len = len < 0 ? 0 : len;
}
buf = zend_string_alloc(buf_len, 0);
@@ -3496,7 +3507,7 @@ PHP_FUNCTION(pg_lo_write)
}
if (argc > 2) {
- if (z_len > str_len) {
+ if (z_len > (zend_long)str_len) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot write more than buffer size %d. Tried to write %pd", str_len, z_len);
RETURN_FALSE;
}
@@ -3563,7 +3574,7 @@ PHP_FUNCTION(pg_lo_import)
}
else if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, argc TSRMLS_CC,
"p|z", &file_in, &name_len, &oid) == SUCCESS) {
- id = PGG(default_link)? PGG(default_link)->handle : -1;
+ id = FETCH_DEFAULT_LINK();
CHECK_DEFAULT_LINK(id);
}
/* old calling convention, deprecated since PHP 4.2 */
@@ -3672,7 +3683,7 @@ PHP_FUNCTION(pg_lo_export)
RETURN_FALSE;
}
oid = (Oid)oid_long;
- id = PGG(default_link)? PGG(default_link)->handle : -1;
+ id = FETCH_DEFAULT_LINK();
CHECK_DEFAULT_LINK(id);
}
else if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, argc TSRMLS_CC,
@@ -3683,7 +3694,7 @@ PHP_FUNCTION(pg_lo_export)
php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Wrong OID value passed");
RETURN_FALSE;
}
- id = PGG(default_link)? PGG(default_link)->handle : -1;
+ id = FETCH_DEFAULT_LINK();
CHECK_DEFAULT_LINK(id);
}
else if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, argc TSRMLS_CC,
@@ -3747,9 +3758,9 @@ PHP_FUNCTION(pg_lo_seek)
#if HAVE_PG_LO64
if (PQserverVersion((PGconn *)pgsql->conn) >= 90300) {
- result = lo_lseek64((PGconn *)pgsql->conn, pgsql->lofd, offset, whence);
+ result = lo_lseek64((PGconn *)pgsql->conn, pgsql->lofd, offset, (int)whence);
} else {
- result = lo_lseek((PGconn *)pgsql->conn, pgsql->lofd, offset, whence);
+ result = lo_lseek((PGconn *)pgsql->conn, pgsql->lofd, (int)offset, (int)whence);
}
#else
result = lo_lseek((PGconn *)pgsql->conn, pgsql->lofd, offset, whence);
@@ -3839,7 +3850,7 @@ PHP_FUNCTION(pg_set_error_verbosity)
if (zend_parse_parameters(argc TSRMLS_CC, "l", &verbosity) == FAILURE) {
return;
}
- id = PGG(default_link)? PGG(default_link)->handle : -1;
+ id = FETCH_DEFAULT_LINK();
CHECK_DEFAULT_LINK(id);
} else {
if (zend_parse_parameters(argc TSRMLS_CC, "rl", &pgsql_link, &verbosity) == FAILURE) {
@@ -3877,7 +3888,7 @@ PHP_FUNCTION(pg_set_client_encoding)
if (zend_parse_parameters(argc TSRMLS_CC, "s", &encoding, &encoding_len) == FAILURE) {
return;
}
- id = PGG(default_link)? PGG(default_link)->handle : -1;
+ id = FETCH_DEFAULT_LINK();
CHECK_DEFAULT_LINK(id);
} else {
if (zend_parse_parameters(argc TSRMLS_CC, "rs", &pgsql_link, &encoding, &encoding_len) == FAILURE) {
@@ -3908,7 +3919,7 @@ PHP_FUNCTION(pg_client_encoding)
}
if (argc == 0) {
- id = PGG(default_link)? PGG(default_link)->handle : -1;
+ id = FETCH_DEFAULT_LINK();
CHECK_DEFAULT_LINK(id);
}
@@ -3943,7 +3954,7 @@ PHP_FUNCTION(pg_end_copy)
}
if (argc == 0) {
- id = PGG(default_link)? PGG(default_link)->handle : -1;
+ id = FETCH_DEFAULT_LINK();
CHECK_DEFAULT_LINK(id);
}
@@ -3978,7 +3989,7 @@ PHP_FUNCTION(pg_put_line)
if (zend_parse_parameters(argc TSRMLS_CC, "s", &query, &query_len) == FAILURE) {
return;
}
- id = PGG(default_link) ? PGG(default_link)->handle : -1;
+ id = FETCH_DEFAULT_LINK();
CHECK_DEFAULT_LINK(id);
} else {
if (zend_parse_parameters(argc TSRMLS_CC, "rs", &pgsql_link, &query, &query_len) == FAILURE) {
@@ -4198,7 +4209,7 @@ PHP_FUNCTION(pg_copy_from)
if(Z_STRLEN_P(tmp) > 0 && *(query + Z_STRLEN_P(tmp) - 1) != '\n') {
strlcat(query, "\n", Z_STRLEN_P(tmp) + 2);
}
- if (PQputCopyData(pgsql, query, strlen(query)) != 1) {
+ if (PQputCopyData(pgsql, query, (int)strlen(query)) != 1) {
efree(query);
PHP_PQ_ERROR("copy failed: %s", pgsql);
RETURN_FALSE;
@@ -4276,7 +4287,7 @@ PHP_FUNCTION(pg_escape_string)
return;
}
pgsql_link = NULL;
- id = PGG(default_link)? PGG(default_link)->handle : -1;
+ id = FETCH_DEFAULT_LINK();
break;
default:
@@ -4321,7 +4332,7 @@ PHP_FUNCTION(pg_escape_bytea)
return;
}
pgsql_link = NULL;
- id = PGG(default_link)? PGG(default_link)->handle : -1;
+ id = FETCH_DEFAULT_LINK();
break;
default:
@@ -4494,7 +4505,7 @@ static void php_pgsql_escape_internal(INTERNAL_FUNCTION_PARAMETERS, int escape_l
return;
}
pgsql_link = NULL;
- id = PGG(default_link)? PGG(default_link)->handle : - 1;
+ id = FETCH_DEFAULT_LINK();
break;
default:
@@ -4604,7 +4615,7 @@ PHP_FUNCTION(pg_result_error_field)
#endif
|PG_DIAG_CONTEXT|PG_DIAG_SOURCE_FILE|PG_DIAG_SOURCE_LINE
|PG_DIAG_SOURCE_FUNCTION)) {
- field = (char *)PQresultErrorField(pgsql_result, fieldcode);
+ field = (char *)PQresultErrorField(pgsql_result, (int)fieldcode);
if (field == NULL) {
RETURN_NULL();
} else {