[PECL-CVS] [pecl-web_services-oauth] memory-safety-audit: memory audit fixes

[email protected] (Rasmus Lerdorf) Sun, 5 Apr 2026 00:40:26 +0000
Newsgroups php.pecl.cvs
Message-ID <[email protected]>
Author: Rasmus Lerdorf (rlerdorf)
Date: 2026-04-04T20:40:00-04:00

Commit: https://github.com/php/pecl-web_services-oauth/commit/a6ad8dc30239dd31e6008197117038051d139104
Raw diff: https://github.com/php/pecl-web_services-oauth/commit/a6ad8dc30239dd31e6008197117038051d139104.diff

memory audit fixes

Changed paths:
  M  oauth.c
  M  provider.c


Diff:

diff --git a/oauth.c b/oauth.c
index f1c1c35..af2acfd 100644
--- a/oauth.c
+++ b/oauth.c
@@ -158,10 +158,6 @@ static void so_object_free_storage(zend_object *obj) /* {{{ */
 		soo->debug_info = NULL;
 	}
 
-	smart_string_free(&soo->headers_in);
-	if (soo->headers_out.c) {
-		smart_string_free(&soo->headers_out);
-	}
 	if(Z_TYPE(soo->debugArr) != IS_UNDEF) {
 		zval_ptr_dtor(&soo->debugArr);
 	}
@@ -172,6 +168,15 @@ static void so_object_free_storage(zend_object *obj) /* {{{ */
 	if (soo->timestamp) {
 		efree(soo->timestamp);
 	}
+	if (soo->multipart_files_num) {
+		int mi;
+		for (mi = 0; mi < soo->multipart_files_num; mi++) {
+			efree(soo->multipart_files[mi]);
+			efree(soo->multipart_params[mi]);
+		}
+		efree(soo->multipart_files);
+		efree(soo->multipart_params);
+	}
 
 }
 /* }}} */
@@ -482,8 +487,8 @@ int oauth_http_build_query(php_so_object *soo, smart_string *s, HashTable *args,
 						soo->multipart_params = erealloc(soo->multipart_params, sizeof(char *) * (soo->multipart_files_num + 1));
 
 						convert_to_string_ex(cur_val);
-						soo->multipart_files[soo->multipart_files_num] = Z_STRVAL_P(cur_val);
-						soo->multipart_params[soo->multipart_files_num] = ZSTR_VAL(cur_key);
+						soo->multipart_files[soo->multipart_files_num] = estrdup(Z_STRVAL_P(cur_val));
+						soo->multipart_params[soo->multipart_files_num] = estrdup(ZSTR_VAL(cur_key));
 
 						++soo->multipart_files_num;
 						/* we don't add multipart files to the params */
@@ -1714,8 +1719,15 @@ static long oauth_fetch(php_so_object *soo, const char *url, const char *method,
 			case OAUTH_REQENGINE_CURL:
 				http_response_code = make_req_curl(soo, surl.c, &payload, final_http_method, &rheaders);
 				if (soo->multipart_files_num) {
+					int mi;
+					for (mi = 0; mi < soo->multipart_files_num; mi++) {
+						efree(soo->multipart_files[mi]);
+						efree(soo->multipart_params[mi]);
+					}
 					efree(soo->multipart_files);
 					efree(soo->multipart_params);
+					soo->multipart_files = NULL;
+					soo->multipart_params = NULL;
 					soo->multipart_files_num = 0;
 					soo->is_multipart = 0;
 				}
diff --git a/provider.c b/provider.c
index da09647..757f965 100644
--- a/provider.c
+++ b/provider.c
@@ -271,11 +271,15 @@ static int oauth_provider_parse_auth_header(php_oauth_provider *sop, char *auth_
 			tmp = estrndup(Z_STRVAL_P(current_val), Z_STRLEN_P(current_val));
 			decoded_len = php_url_decode(tmp, Z_STRLEN_P(current_val));
 			ZVAL_STRINGL(&decoded_val, tmp, decoded_len);
+			efree(tmp);
 
 			if (oauth_provider_set_param_value(sop->oauth_params, Z_STRVAL_P(current_param), &decoded_val)==FAILURE) {
+				zval_ptr_dtor(&decoded_val);
+				zval_ptr_dtor(&return_value);
+				zval_ptr_dtor(&subpats);
 				return FAILURE;
 			}
-			Z_DELREF(decoded_val);
+			zval_ptr_dtor(&decoded_val);
 		}
 	} while (SUCCESS==zend_hash_move_forward_ex(Z_ARRVAL(subpats), &hpos));
 
@@ -318,6 +322,9 @@ static void oauth_provider_register_cb(INTERNAL_FUNCTION_PARAMETERS, int type) /
 			tgt_cb = &sop->tsnonce_handler;
 			break;
 		default:
+			zval_ptr_dtor(&cb->fcall_info->function_name);
+			efree(cb->fcall_info);
+			efree(cb);
 			php_error_docref(NULL, E_ERROR, "Invalid callback type for OAuthProvider");
 			return;
 	}