diff options
Diffstat (limited to 'ext/pgsql/pgsql.c')
-rw-r--r-- | ext/pgsql/pgsql.c | 133 |
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", ¶m, &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 { |