@@ -626,6 +626,26 @@ static void php_snmp_internal(INTERNAL_FUNCTION_PARAMETERS, int st,
626
626
}
627
627
/* }}} */
628
628
629
+ static void php_snmp_zend_string_release_from_char_pointer (char * ptr ) {
630
+ zend_string * pptr = (zend_string * )(ptr - XtOffsetOf (zend_string , val ));
631
+ zend_string_release (pptr );
632
+ }
633
+
634
+ static void php_free_objid_query (struct objid_query * objid_query , zend_string * oid_str , zend_string * value_str , HashTable * value_ht , int st ) {
635
+ if (!oid_str ) {
636
+ for (int i = 0 ; i < objid_query -> count ; i ++ ) {
637
+ snmpobjarg * arg = & objid_query -> vars [i ];
638
+ if (st & SNMP_CMD_SET ) {
639
+ if (!value_str && value_ht ) {
640
+ php_snmp_zend_string_release_from_char_pointer (arg -> value );
641
+ }
642
+ }
643
+ php_snmp_zend_string_release_from_char_pointer (arg -> oid );
644
+ }
645
+ }
646
+ efree (objid_query -> vars );
647
+ }
648
+
629
649
/* {{{ php_snmp_parse_oid
630
650
*
631
651
* OID parser (and type, value for SNMP_SET command)
@@ -682,7 +702,6 @@ static bool php_snmp_parse_oid(
682
702
return false;
683
703
}
684
704
objid_query -> vars [objid_query -> count ].oid = ZSTR_VAL (tmp );
685
- zend_string_release (tmp );
686
705
if (st & SNMP_CMD_SET ) {
687
706
if (type_str ) {
688
707
pptr = ZSTR_VAL (type_str );
@@ -706,18 +725,23 @@ static bool php_snmp_parse_oid(
706
725
}
707
726
}
708
727
if (idx_type < type_ht -> nNumUsed ) {
709
- convert_to_string (tmp_type );
710
- if (Z_STRLEN_P (tmp_type ) != 1 ) {
728
+ zval new ;
729
+ ZVAL_COPY_VALUE (& new , tmp_type );
730
+ if (!try_convert_to_string (& new )) {
731
+ php_free_objid_query (objid_query , oid_str , value_str , value_ht , st );
732
+ return false;
733
+ }
734
+ if (Z_STRLEN (new ) != 1 ) {
711
735
zend_value_error ("Type must be a single character" );
712
- efree (objid_query -> vars );
736
+ php_free_objid_query (objid_query , oid_str , value_str , value_ht , st );
713
737
return false;
714
738
}
715
- pptr = Z_STRVAL_P ( tmp_type );
739
+ pptr = Z_STRVAL ( new );
716
740
objid_query -> vars [objid_query -> count ].type = * pptr ;
717
741
idx_type ++ ;
718
742
} else {
719
743
php_error_docref (NULL , E_WARNING , "'%s': no type set" , Z_STRVAL_P (tmp_oid ));
720
- efree (objid_query -> vars );
744
+ php_free_objid_query (objid_query , oid_str , value_str , value_ht , st );
721
745
return false;
722
746
}
723
747
}
@@ -743,12 +767,16 @@ static bool php_snmp_parse_oid(
743
767
}
744
768
}
745
769
if (idx_value < value_ht -> nNumUsed ) {
746
- convert_to_string (tmp_value );
747
- objid_query -> vars [objid_query -> count ].value = Z_STRVAL_P (tmp_value );
770
+ zend_string * tmp = zval_try_get_string (tmp_value );
771
+ if (!tmp ) {
772
+ php_free_objid_query (objid_query , oid_str , value_str , value_ht , st );
773
+ return false;
774
+ }
775
+ objid_query -> vars [objid_query -> count ].value = ZSTR_VAL (tmp );
748
776
idx_value ++ ;
749
777
} else {
750
778
php_error_docref (NULL , E_WARNING , "'%s': no value set" , Z_STRVAL_P (tmp_oid ));
751
- efree (objid_query -> vars );
779
+ php_free_objid_query (objid_query , oid_str , value_str , value_ht , st );
752
780
return false;
753
781
}
754
782
}
@@ -761,14 +789,14 @@ static bool php_snmp_parse_oid(
761
789
if (st & SNMP_CMD_WALK ) {
762
790
if (objid_query -> count > 1 ) {
763
791
php_snmp_error (object , PHP_SNMP_ERRNO_OID_PARSING_ERROR , "Multi OID walks are not supported!" );
764
- efree (objid_query -> vars );
792
+ php_free_objid_query (objid_query , oid_str , value_str , value_ht , st );
765
793
return false;
766
794
}
767
795
objid_query -> vars [0 ].name_length = MAX_NAME_LEN ;
768
796
if (strlen (objid_query -> vars [0 ].oid )) { /* on a walk, an empty string means top of tree - no error */
769
797
if (!snmp_parse_oid (objid_query -> vars [0 ].oid , objid_query -> vars [0 ].name , & (objid_query -> vars [0 ].name_length ))) {
770
798
php_snmp_error (object , PHP_SNMP_ERRNO_OID_PARSING_ERROR , "Invalid object identifier: %s" , objid_query -> vars [0 ].oid );
771
- efree (objid_query -> vars );
799
+ php_free_objid_query (objid_query , oid_str , value_str , value_ht , st );
772
800
return false;
773
801
}
774
802
} else {
@@ -780,7 +808,7 @@ static bool php_snmp_parse_oid(
780
808
objid_query -> vars [objid_query -> offset ].name_length = MAX_OID_LEN ;
781
809
if (!snmp_parse_oid (objid_query -> vars [objid_query -> offset ].oid , objid_query -> vars [objid_query -> offset ].name , & (objid_query -> vars [objid_query -> offset ].name_length ))) {
782
810
php_snmp_error (object , PHP_SNMP_ERRNO_OID_PARSING_ERROR , "Invalid object identifier: %s" , objid_query -> vars [objid_query -> offset ].oid );
783
- efree (objid_query -> vars );
811
+ php_free_objid_query (objid_query , oid_str , value_str , value_ht , st );
784
812
return false;
785
813
}
786
814
}
@@ -1257,12 +1285,12 @@ static void php_snmp(INTERNAL_FUNCTION_PARAMETERS, int st, int version)
1257
1285
1258
1286
if (session_less_mode ) {
1259
1287
if (!netsnmp_session_init (& session , version , a1 , a2 , timeout , retries )) {
1260
- efree ( objid_query . vars );
1288
+ php_free_objid_query ( & objid_query , oid_str , value_str , value_ht , st );
1261
1289
netsnmp_session_free (& session );
1262
1290
RETURN_FALSE ;
1263
1291
}
1264
1292
if (version == SNMP_VERSION_3 && !netsnmp_session_set_security (session , a3 , a4 , a5 , a6 , a7 , NULL , NULL )) {
1265
- efree ( objid_query . vars );
1293
+ php_free_objid_query ( & objid_query , oid_str , value_str , value_ht , st );
1266
1294
netsnmp_session_free (& session );
1267
1295
/* Warning message sent already, just bail out */
1268
1296
RETURN_FALSE ;
@@ -1273,7 +1301,7 @@ static void php_snmp(INTERNAL_FUNCTION_PARAMETERS, int st, int version)
1273
1301
session = snmp_object -> session ;
1274
1302
if (!session ) {
1275
1303
zend_throw_error (NULL , "Invalid or uninitialized SNMP object" );
1276
- efree ( objid_query . vars );
1304
+ php_free_objid_query ( & objid_query , oid_str , value_str , value_ht , st );
1277
1305
RETURN_THROWS ();
1278
1306
}
1279
1307
@@ -1299,15 +1327,15 @@ static void php_snmp(INTERNAL_FUNCTION_PARAMETERS, int st, int version)
1299
1327
1300
1328
php_snmp_internal (INTERNAL_FUNCTION_PARAM_PASSTHRU , st , session , & objid_query );
1301
1329
1302
- efree (objid_query .vars );
1303
-
1304
1330
if (session_less_mode ) {
1305
1331
netsnmp_session_free (& session );
1306
1332
} else {
1307
1333
netsnmp_ds_set_boolean (NETSNMP_DS_LIBRARY_ID , NETSNMP_DS_LIB_PRINT_NUMERIC_ENUM , glob_snmp_object .enum_print );
1308
1334
netsnmp_ds_set_boolean (NETSNMP_DS_LIBRARY_ID , NETSNMP_DS_LIB_QUICK_PRINT , glob_snmp_object .quick_print );
1309
1335
netsnmp_ds_set_int (NETSNMP_DS_LIBRARY_ID , NETSNMP_DS_LIB_OID_OUTPUT_FORMAT , glob_snmp_object .oid_output_format );
1310
1336
}
1337
+
1338
+ php_free_objid_query (& objid_query , oid_str , value_str , value_ht , st );
1311
1339
}
1312
1340
/* }}} */
1313
1341
0 commit comments