Skip to content

Commit e0b17ba

Browse files
committed
Use a subrountine to check for valid OID strings
Closes 6260
1 parent dfa6d1c commit e0b17ba

File tree

1 file changed

+27
-40
lines changed

1 file changed

+27
-40
lines changed

ext/pgsql/pgsql.c

Lines changed: 27 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1474,6 +1474,13 @@ PHP_FUNCTION(pg_last_notice)
14741474
}
14751475
/* }}} */
14761476

1477+
static inline bool is_valid_oid_string(zend_string *oid, Oid *return_oid)
1478+
{
1479+
char *end_ptr;
1480+
*return_oid = (Oid) strtoul(ZSTR_VAL(oid), &end_ptr, 10);
1481+
return ZSTR_VAL(oid) + ZSTR_LEN(oid) == end_ptr;
1482+
}
1483+
14771484
/* {{{ get_field_name */
14781485
static char *get_field_name(PGconn *pgsql, Oid oid, HashTable *list)
14791486
{
@@ -2323,10 +2330,7 @@ PHP_FUNCTION(pg_lo_create)
23232330
switch (Z_TYPE_P(oid)) {
23242331
case IS_STRING:
23252332
{
2326-
/* TODO: Use subroutine? */
2327-
char *end_ptr;
2328-
wanted_oid = (Oid)strtoul(Z_STRVAL_P(oid), &end_ptr, 10);
2329-
if ((Z_STRVAL_P(oid)+Z_STRLEN_P(oid)) != end_ptr) {
2333+
if (!is_valid_oid_string(Z_STR_P(oid), &wanted_oid)) {
23302334
/* wrong integer format */
23312335
zend_value_error("Invalid OID value passed");
23322336
RETURN_THROWS();
@@ -2366,19 +2370,15 @@ PHP_FUNCTION(pg_lo_unlink)
23662370
{
23672371
zval *pgsql_link = NULL;
23682372
zend_long oid_long;
2369-
char *oid_string, *end_ptr;
2370-
size_t oid_strlen;
2373+
zend_string *oid_string;
23712374
PGconn *pgsql;
23722375
Oid oid;
23732376
zend_resource *link;
23742377
int argc = ZEND_NUM_ARGS();
23752378

23762379
/* accept string type since Oid type is unsigned int */
2377-
if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, argc,
2378-
"rs", &pgsql_link, &oid_string, &oid_strlen) == SUCCESS) {
2379-
/* TODO: Use subroutine? */
2380-
oid = (Oid)strtoul(oid_string, &end_ptr, 10);
2381-
if ((oid_string+oid_strlen) != end_ptr) {
2380+
if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, argc, "rS", &pgsql_link, &oid_string) == SUCCESS) {
2381+
if (!is_valid_oid_string(oid_string, &oid)) {
23822382
/* wrong integer format */
23832383
zend_value_error("Invalid OID value passed");
23842384
RETURN_THROWS();
@@ -2394,11 +2394,8 @@ PHP_FUNCTION(pg_lo_unlink)
23942394
oid = (Oid)oid_long;
23952395
link = Z_RES_P(pgsql_link);
23962396
}
2397-
else if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, argc,
2398-
"s", &oid_string, &oid_strlen) == SUCCESS) {
2399-
/* TODO: subroutine? */
2400-
oid = (Oid)strtoul(oid_string, &end_ptr, 10);
2401-
if ((oid_string+oid_strlen) != end_ptr) {
2397+
else if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, argc, "S", &oid_string) == SUCCESS) {
2398+
if (!is_valid_oid_string(oid_string, &oid)) {
24022399
/* wrong integer format */
24032400
zend_value_error("Invalid OID value passed");
24042401
RETURN_THROWS();
@@ -2438,8 +2435,9 @@ PHP_FUNCTION(pg_lo_open)
24382435
{
24392436
zval *pgsql_link = NULL;
24402437
zend_long oid_long;
2441-
char *oid_string, *end_ptr, *mode_string;
2442-
size_t oid_strlen, mode_strlen;
2438+
zend_string *oid_string;
2439+
char *mode_string;
2440+
size_t mode_strlen;
24432441
PGconn *pgsql;
24442442
Oid oid;
24452443
int pgsql_mode=0, pgsql_lofd;
@@ -2450,10 +2448,8 @@ PHP_FUNCTION(pg_lo_open)
24502448

24512449
/* accept string type since Oid is unsigned int */
24522450
if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, argc,
2453-
"rss", &pgsql_link, &oid_string, &oid_strlen, &mode_string, &mode_strlen) == SUCCESS) {
2454-
/* TODO: Use subroutine? */
2455-
oid = (Oid)strtoul(oid_string, &end_ptr, 10);
2456-
if ((oid_string+oid_strlen) != end_ptr) {
2451+
"rSs", &pgsql_link, &oid_string, &mode_string, &mode_strlen) == SUCCESS) {
2452+
if (!is_valid_oid_string(oid_string, &oid)) {
24572453
/* wrong integer format */
24582454
zend_value_error("Invalid OID value passed");
24592455
RETURN_THROWS();
@@ -2470,10 +2466,8 @@ PHP_FUNCTION(pg_lo_open)
24702466
link = Z_RES_P(pgsql_link);
24712467
}
24722468
else if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, argc,
2473-
"ss", &oid_string, &oid_strlen, &mode_string, &mode_strlen) == SUCCESS) {
2474-
/* TODO: Use subroutine? */
2475-
oid = (Oid)strtoul(oid_string, &end_ptr, 10);
2476-
if ((oid_string+oid_strlen) != end_ptr) {
2469+
"Ss", &oid_string, &mode_string, &mode_strlen) == SUCCESS) {
2470+
if (!is_valid_oid_string(oid_string, &oid)) {
24772471
/* wrong integer format */
24782472
zend_value_error("Invalid OID value passed");
24792473
RETURN_THROWS();
@@ -2723,10 +2717,7 @@ PHP_FUNCTION(pg_lo_import)
27232717
switch (Z_TYPE_P(oid)) {
27242718
case IS_STRING:
27252719
{
2726-
/* TODO: Use subroutine? */
2727-
char *end_ptr;
2728-
wanted_oid = (Oid)strtoul(Z_STRVAL_P(oid), &end_ptr, 10);
2729-
if ((Z_STRVAL_P(oid)+Z_STRLEN_P(oid)) != end_ptr) {
2720+
if (!is_valid_oid_string(Z_STR_P(oid), &wanted_oid)) {
27302721
/* wrong integer format */
27312722
zend_value_error("Invalid OID value passed");
27322723
RETURN_THROWS();
@@ -2767,8 +2758,8 @@ PHP_FUNCTION(pg_lo_import)
27672758
PHP_FUNCTION(pg_lo_export)
27682759
{
27692760
zval *pgsql_link = NULL;
2770-
char *file_out, *oid_string, *end_ptr;
2771-
size_t oid_strlen;
2761+
zend_string *oid_string;
2762+
char *file_out;
27722763
size_t name_len;
27732764
zend_long oid_long;
27742765
Oid oid;
@@ -2787,10 +2778,8 @@ PHP_FUNCTION(pg_lo_export)
27872778
link = Z_RES_P(pgsql_link);
27882779
}
27892780
else if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, argc,
2790-
"rsp", &pgsql_link, &oid_string, &oid_strlen, &file_out, &name_len) == SUCCESS) {
2791-
/* TODO: Use subroutine? */
2792-
oid = (Oid)strtoul(oid_string, &end_ptr, 10);
2793-
if ((oid_string+oid_strlen) != end_ptr) {
2781+
"rSp", &pgsql_link, &oid_string, &file_out, &name_len) == SUCCESS) {
2782+
if (!is_valid_oid_string(oid_string, &oid)) {
27942783
/* wrong integer format */
27952784
zend_value_error("Invalid OID value passed");
27962785
RETURN_THROWS();
@@ -2808,10 +2797,8 @@ PHP_FUNCTION(pg_lo_export)
28082797
CHECK_DEFAULT_LINK(link);
28092798
}
28102799
else if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, argc,
2811-
"sp", &oid_string, &oid_strlen, &file_out, &name_len) == SUCCESS) {
2812-
/* TODO: Use subroutine? */
2813-
oid = (Oid)strtoul(oid_string, &end_ptr, 10);
2814-
if ((oid_string+oid_strlen) != end_ptr) {
2800+
"Sp", &oid_string, &file_out, &name_len) == SUCCESS) {
2801+
if (!is_valid_oid_string(oid_string, &oid)) {
28152802
/* wrong integer format */
28162803
zend_value_error("Invalid OID value passed");
28172804
RETURN_THROWS();

0 commit comments

Comments
 (0)