summaryrefslogtreecommitdiff
path: root/ext/pgsql/pgsql.c
diff options
context:
space:
mode:
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 {