@@ -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 */
14781485static 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)
27672758PHP_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