diff --git a/SPECS/iperf3/CVE-2024-53580.patch b/SPECS/iperf3/CVE-2024-53580.patch deleted file mode 100644 index a91c612e31a..00000000000 --- a/SPECS/iperf3/CVE-2024-53580.patch +++ /dev/null @@ -1,287 +0,0 @@ -From 837c1f9389fc64938a6081517c34a749a11692b0 Mon Sep 17 00:00:00 2001 -From: Kanishk-Bansal -Date: Tue, 31 Dec 2024 09:23:23 +0000 -Subject: [PATCH] Fix CVE-2024-53580 - ---- - src/iperf_api.c | 98 +++++++++++++++++++++++------------------------ - src/iperf_error.c | 6 +-- - src/iperf_util.c | 36 +++++++++++++++++ - src/iperf_util.h | 1 + - 4 files changed, 89 insertions(+), 52 deletions(-) - -diff --git a/src/iperf_api.c b/src/iperf_api.c -index 7fb741e..bb3be92 100644 ---- a/src/iperf_api.c -+++ b/src/iperf_api.c -@@ -2308,72 +2308,72 @@ get_parameters(struct iperf_test *test) - cJSON_free(str); - } - -- if ((j_p = cJSON_GetObjectItem(j, "tcp")) != NULL) -+ if ((j_p = iperf_cJSON_GetObjectItemType(j, "tcp", cJSON_True)) != NULL) - set_protocol(test, Ptcp); -- if ((j_p = cJSON_GetObjectItem(j, "udp")) != NULL) -+ if ((j_p = iperf_cJSON_GetObjectItemType(j, "udp", cJSON_True)) != NULL) - set_protocol(test, Pudp); -- if ((j_p = cJSON_GetObjectItem(j, "sctp")) != NULL) -+ if ((j_p = iperf_cJSON_GetObjectItemType(j, "sctp", cJSON_True)) != NULL) - set_protocol(test, Psctp); -- if ((j_p = cJSON_GetObjectItem(j, "omit")) != NULL) -+ if ((j_p = iperf_cJSON_GetObjectItemType(j, "omit", cJSON_Number)) != NULL) - test->omit = j_p->valueint; -- if ((j_p = cJSON_GetObjectItem(j, "server_affinity")) != NULL) -+ if ((j_p = iperf_cJSON_GetObjectItemType(j, "server_affinity", cJSON_Number)) != NULL) - test->server_affinity = j_p->valueint; -- if ((j_p = cJSON_GetObjectItem(j, "time")) != NULL) -+ if ((j_p = iperf_cJSON_GetObjectItemType(j, "time", cJSON_Number)) != NULL) - test->duration = j_p->valueint; - test->settings->bytes = 0; -- if ((j_p = cJSON_GetObjectItem(j, "num")) != NULL) -+ if ((j_p = iperf_cJSON_GetObjectItemType(j, "num", cJSON_Number)) != NULL) - test->settings->bytes = j_p->valueint; - test->settings->blocks = 0; -- if ((j_p = cJSON_GetObjectItem(j, "blockcount")) != NULL) -+ if ((j_p = iperf_cJSON_GetObjectItemType(j, "blockcount", cJSON_Number)) != NULL) - test->settings->blocks = j_p->valueint; -- if ((j_p = cJSON_GetObjectItem(j, "MSS")) != NULL) -+ if ((j_p = iperf_cJSON_GetObjectItemType(j, "MSS", cJSON_Number)) != NULL) - test->settings->mss = j_p->valueint; -- if ((j_p = cJSON_GetObjectItem(j, "nodelay")) != NULL) -+ if ((j_p = iperf_cJSON_GetObjectItemType(j, "nodelay", cJSON_True)) != NULL) - test->no_delay = 1; -- if ((j_p = cJSON_GetObjectItem(j, "parallel")) != NULL) -+ if ((j_p = iperf_cJSON_GetObjectItemType(j, "parallel", cJSON_Number)) != NULL) - test->num_streams = j_p->valueint; -- if ((j_p = cJSON_GetObjectItem(j, "reverse")) != NULL) -+ if ((j_p = iperf_cJSON_GetObjectItemType(j, "reverse", cJSON_True)) != NULL) - iperf_set_test_reverse(test, 1); -- if ((j_p = cJSON_GetObjectItem(j, "bidirectional")) != NULL) -+ if ((j_p = iperf_cJSON_GetObjectItemType(j, "bidirectional", cJSON_True)) != NULL) - iperf_set_test_bidirectional(test, 1); -- if ((j_p = cJSON_GetObjectItem(j, "window")) != NULL) -+ if ((j_p = iperf_cJSON_GetObjectItemType(j, "window", cJSON_Number)) != NULL) - test->settings->socket_bufsize = j_p->valueint; -- if ((j_p = cJSON_GetObjectItem(j, "len")) != NULL) -+ if ((j_p = iperf_cJSON_GetObjectItemType(j, "len", cJSON_Number)) != NULL) - test->settings->blksize = j_p->valueint; -- if ((j_p = cJSON_GetObjectItem(j, "bandwidth")) != NULL) -+ if ((j_p = iperf_cJSON_GetObjectItemType(j, "bandwidth", cJSON_Number)) != NULL) - test->settings->rate = j_p->valueint; -- if ((j_p = cJSON_GetObjectItem(j, "fqrate")) != NULL) -+ if ((j_p = iperf_cJSON_GetObjectItemType(j, "fqrate", cJSON_Number)) != NULL) - test->settings->fqrate = j_p->valueint; -- if ((j_p = cJSON_GetObjectItem(j, "pacing_timer")) != NULL) -+ if ((j_p = iperf_cJSON_GetObjectItemType(j, "pacing_timer", cJSON_Number)) != NULL) - test->settings->pacing_timer = j_p->valueint; -- if ((j_p = cJSON_GetObjectItem(j, "burst")) != NULL) -+ if ((j_p = iperf_cJSON_GetObjectItemType(j, "burst", cJSON_Number)) != NULL) - test->settings->burst = j_p->valueint; -- if ((j_p = cJSON_GetObjectItem(j, "TOS")) != NULL) -+ if ((j_p = iperf_cJSON_GetObjectItemType(j, "TOS", cJSON_Number)) != NULL) - test->settings->tos = j_p->valueint; -- if ((j_p = cJSON_GetObjectItem(j, "flowlabel")) != NULL) -+ if ((j_p = iperf_cJSON_GetObjectItemType(j, "flowlabel", cJSON_Number)) != NULL) - test->settings->flowlabel = j_p->valueint; -- if ((j_p = cJSON_GetObjectItem(j, "title")) != NULL) -+ if ((j_p = iperf_cJSON_GetObjectItemType(j, "title", cJSON_String)) != NULL) - test->title = strdup(j_p->valuestring); -- if ((j_p = cJSON_GetObjectItem(j, "extra_data")) != NULL) -+ if ((j_p = iperf_cJSON_GetObjectItemType(j, "extra_data", cJSON_String)) != NULL) - test->extra_data = strdup(j_p->valuestring); -- if ((j_p = cJSON_GetObjectItem(j, "congestion")) != NULL) -+ if ((j_p = iperf_cJSON_GetObjectItemType(j, "congestion", cJSON_String)) != NULL) - test->congestion = strdup(j_p->valuestring); -- if ((j_p = cJSON_GetObjectItem(j, "congestion_used")) != NULL) -+ if ((j_p = iperf_cJSON_GetObjectItemType(j, "congestion_used", cJSON_String)) != NULL) - test->congestion_used = strdup(j_p->valuestring); -- if ((j_p = cJSON_GetObjectItem(j, "get_server_output")) != NULL) -+ if ((j_p = iperf_cJSON_GetObjectItemType(j, "get_server_output", cJSON_Number)) != NULL) - iperf_set_test_get_server_output(test, 1); -- if ((j_p = cJSON_GetObjectItem(j, "udp_counters_64bit")) != NULL) -+ if ((j_p = iperf_cJSON_GetObjectItemType(j, "udp_counters_64bit", cJSON_Number)) != NULL) - iperf_set_test_udp_counters_64bit(test, 1); -- if ((j_p = cJSON_GetObjectItem(j, "repeating_payload")) != NULL) -+ if ((j_p = iperf_cJSON_GetObjectItemType(j, "repeating_payload", cJSON_Number)) != NULL) - test->repeating_payload = 1; -- if ((j_p = cJSON_GetObjectItem(j, "zerocopy")) != NULL) -+ if ((j_p = iperf_cJSON_GetObjectItemType(j, "zerocopy", cJSON_Number)) != NULL) - test->zerocopy = j_p->valueint; - #if defined(HAVE_DONT_FRAGMENT) -- if ((j_p = cJSON_GetObjectItem(j, "dont_fragment")) != NULL) -+ if ((j_p = iperf_cJSON_GetObjectItemType(j, "dont_fragment", cJSON_Number)) != NULL) - test->settings->dont_fragment = j_p->valueint; - #endif /* HAVE_DONT_FRAGMENT */ - #if defined(HAVE_SSL) -- if ((j_p = cJSON_GetObjectItem(j, "authtoken")) != NULL) -+ if ((j_p = iperf_cJSON_GetObjectItemType(j, "authtoken", cJSON_String)) != NULL) - test->settings->authtoken = strdup(j_p->valuestring); - #endif //HAVE_SSL - if (test->mode && test->protocol->id == Ptcp && has_tcpinfo_retransmits()) -@@ -2532,10 +2532,10 @@ get_results(struct iperf_test *test) - i_errno = IERECVRESULTS; - r = -1; - } else { -- j_cpu_util_total = cJSON_GetObjectItem(j, "cpu_util_total"); -- j_cpu_util_user = cJSON_GetObjectItem(j, "cpu_util_user"); -- j_cpu_util_system = cJSON_GetObjectItem(j, "cpu_util_system"); -- j_sender_has_retransmits = cJSON_GetObjectItem(j, "sender_has_retransmits"); -+ j_cpu_util_total = iperf_cJSON_GetObjectItemType(j, "cpu_util_total", cJSON_Number); -+ j_cpu_util_user = iperf_cJSON_GetObjectItemType(j, "cpu_util_user", cJSON_Number); -+ j_cpu_util_system = iperf_cJSON_GetObjectItemType(j, "cpu_util_system", cJSON_Number); -+ j_sender_has_retransmits = iperf_cJSON_GetObjectItemType(j, "sender_has_retransmits", cJSON_Number); - if (j_cpu_util_total == NULL || j_cpu_util_user == NULL || j_cpu_util_system == NULL || j_sender_has_retransmits == NULL) { - i_errno = IERECVRESULTS; - r = -1; -@@ -2557,7 +2557,7 @@ get_results(struct iperf_test *test) - else if ( test->mode == BIDIRECTIONAL ) - test->other_side_has_retransmits = result_has_retransmits; - -- j_streams = cJSON_GetObjectItem(j, "streams"); -+ j_streams = iperf_cJSON_GetObjectItemType(j, "streams", cJSON_Array); - if (j_streams == NULL) { - i_errno = IERECVRESULTS; - r = -1; -@@ -2569,16 +2569,16 @@ get_results(struct iperf_test *test) - i_errno = IERECVRESULTS; - r = -1; - } else { -- j_id = cJSON_GetObjectItem(j_stream, "id"); -- j_bytes = cJSON_GetObjectItem(j_stream, "bytes"); -- j_retransmits = cJSON_GetObjectItem(j_stream, "retransmits"); -- j_jitter = cJSON_GetObjectItem(j_stream, "jitter"); -- j_errors = cJSON_GetObjectItem(j_stream, "errors"); -- j_omitted_errors = cJSON_GetObjectItem(j_stream, "omitted_errors"); -- j_packets = cJSON_GetObjectItem(j_stream, "packets"); -- j_omitted_packets = cJSON_GetObjectItem(j_stream, "omitted_packets"); -- j_start_time = cJSON_GetObjectItem(j_stream, "start_time"); -- j_end_time = cJSON_GetObjectItem(j_stream, "end_time"); -+ j_id = iperf_cJSON_GetObjectItemType(j_stream, "id", cJSON_Number); -+ j_bytes = iperf_cJSON_GetObjectItemType(j_stream, "bytes", cJSON_Number); -+ j_retransmits = iperf_cJSON_GetObjectItemType(j_stream, "retransmits", cJSON_Number); -+ j_jitter = iperf_cJSON_GetObjectItemType(j_stream, "jitter", cJSON_Number); -+ j_errors = iperf_cJSON_GetObjectItemType(j_stream, "errors", cJSON_Number); -+ j_omitted_errors = iperf_cJSON_GetObjectItemType(j_stream, "omitted_errors", cJSON_Number); -+ j_packets = iperf_cJSON_GetObjectItemType(j_stream, "packets", cJSON_Number); -+ j_omitted_packets = iperf_cJSON_GetObjectItemType(j_stream, "omitted_packets", cJSON_Number); -+ j_start_time = iperf_cJSON_GetObjectItemType(j_stream, "start_time", cJSON_Number); -+ j_end_time = iperf_cJSON_GetObjectItemType(j_stream, "end_time", cJSON_Number); - if (j_id == NULL || j_bytes == NULL || j_retransmits == NULL || j_jitter == NULL || j_errors == NULL || j_packets == NULL) { - i_errno = IERECVRESULTS; - r = -1; -@@ -2667,7 +2667,7 @@ get_results(struct iperf_test *test) - } - else { - /* No JSON, look for textual output. Make a copy of the text for later. */ -- j_server_output = cJSON_GetObjectItem(j, "server_output_text"); -+ j_server_output = iperf_cJSON_GetObjectItemType(j, "server_output_text", cJSON_String); - if (j_server_output != NULL) { - test->server_output_text = strdup(j_server_output->valuestring); - } -@@ -2676,7 +2676,7 @@ get_results(struct iperf_test *test) - } - } - -- j_remote_congestion_used = cJSON_GetObjectItem(j, "congestion_used"); -+ j_remote_congestion_used = iperf_cJSON_GetObjectItemType(j, "congestion_used", cJSON_String); - if (j_remote_congestion_used != NULL) { - test->remote_congestion_used = strdup(j_remote_congestion_used->valuestring); - } -@@ -4878,7 +4878,7 @@ iperf_json_finish(struct iperf_test *test) - - /* --json-stream, so we print various individual objects */ - if (test->json_stream) { -- cJSON *error = cJSON_GetObjectItem(test->json_top, "error"); -+ cJSON *error = iperf_cJSON_GetObjectItemType(test->json_top, "error", cJSON_String); - if (error) { - JSONStream_Output(test, "error", error); - } -diff --git a/src/iperf_error.c b/src/iperf_error.c -index 0fedf31..3cb9b45 100644 ---- a/src/iperf_error.c -+++ b/src/iperf_error.c -@@ -60,11 +60,11 @@ iperf_err(struct iperf_test *test, const char *format, ...) - if (test != NULL && test->json_output && test->json_top != NULL) - cJSON_AddStringToObject(test->json_top, "error", str); - else { -- if (pthread_mutex_lock(&(test->print_mutex)) != 0) { -+ if (test != NULL && pthread_mutex_lock(&(test->print_mutex)) != 0) { - perror("iperf_err: pthread_mutex_lock"); - } - -- if (test && test->outfile && test->outfile != stdout) { -+ if (test != NULL && test->outfile != NULL && test->outfile != stdout) { - if (ct) { - fprintf(test->outfile, "%s", ct); - } -@@ -77,7 +77,7 @@ iperf_err(struct iperf_test *test, const char *format, ...) - fprintf(stderr, "iperf3: %s\n", str); - } - -- if (pthread_mutex_unlock(&(test->print_mutex)) != 0) { -+ if (test != NULL && pthread_mutex_unlock(&(test->print_mutex)) != 0) { - perror("iperf_err: pthread_mutex_unlock"); - } - -diff --git a/src/iperf_util.c b/src/iperf_util.c -index 81e8da1..a8a32e1 100644 ---- a/src/iperf_util.c -+++ b/src/iperf_util.c -@@ -430,6 +430,42 @@ iperf_json_printf(const char *format, ...) - return o; - } - -+/********************** cJSON GetObjectItem w/ Type Helper ********************/ -+cJSON * iperf_cJSON_GetObjectItemType(cJSON * j, char * item_string, int expected_type){ -+ cJSON *j_p; -+ if((j_p = cJSON_GetObjectItem(j, item_string)) != NULL) -+ switch(expected_type){ -+ case cJSON_True: -+ if(cJSON_IsBool(j_p)) -+ return j_p; -+ else -+ iperf_err(NULL, "iperf_cJSON_GetObjectItemType mismatch %s", item_string); -+ break; -+ case cJSON_String: -+ if(cJSON_IsString(j_p)) -+ return j_p; -+ else -+ iperf_err(NULL, "iperf_cJSON_GetObjectItemType mismatch %s", item_string); -+ break; -+ case cJSON_Number: -+ if(cJSON_IsNumber(j_p)) -+ return j_p; -+ else -+ iperf_err(NULL, "iperf_cJSON_GetObjectItemType mismatch %s", item_string); -+ break; -+ case cJSON_Array: -+ if(cJSON_IsArray(j_p)) -+ return j_p; -+ else -+ iperf_err(NULL, "iperf_cJSON_GetObjectItemType mismatch %s", item_string); -+ break; -+ default: -+ iperf_err(NULL, "unsupported type"); -+ } -+ -+ return NULL; -+} -+ - /* Debugging routine to dump out an fd_set. */ - void - iperf_dump_fdset(FILE *fp, const char *str, int nfds, fd_set *fds) -diff --git a/src/iperf_util.h b/src/iperf_util.h -index b109af2..c39a1f7 100644 ---- a/src/iperf_util.h -+++ b/src/iperf_util.h -@@ -53,6 +53,7 @@ const char* get_system_info(void); - const char* get_optional_features(void); - - cJSON* iperf_json_printf(const char *format, ...); -+cJSON * iperf_cJSON_GetObjectItemType(cJSON * j_p, char * item_string, int expected_type); - - void iperf_dump_fdset(FILE *fp, const char *str, int nfds, fd_set *fds); - --- -2.45.2 - diff --git a/SPECS/iperf3/CVE-2025-54349.patch b/SPECS/iperf3/CVE-2025-54349.patch deleted file mode 100644 index 7867866f99d..00000000000 --- a/SPECS/iperf3/CVE-2025-54349.patch +++ /dev/null @@ -1,93 +0,0 @@ -From 79d560d64d50497717847bb2c12ede1f4a8ea7e9 Mon Sep 17 00:00:00 2001 -From: Sarah Larsen -Date: Wed, 25 Jun 2025 15:11:03 +0000 -Subject: [PATCH] Fix off-by-one heap overflow in auth. - -Reported by Han Lee (Apple Information Security) -CVE-2025-54349 ---- - src/iperf_auth.c | 18 +++++++++++++----- - 1 file changed, 13 insertions(+), 5 deletions(-) - -diff --git a/src/iperf_auth.c b/src/iperf_auth.c -index 72e85fc..86b4eba 100644 ---- a/src/iperf_auth.c -+++ b/src/iperf_auth.c -@@ -288,6 +288,7 @@ int encrypt_rsa_message(const char *plaintext, EVP_PKEY *public_key, unsigned ch - } - - int decrypt_rsa_message(const unsigned char *encryptedtext, const int encryptedtext_len, EVP_PKEY *private_key, unsigned char **plaintext, int use_pkcs1_padding) { -+ int ret =0; - #if OPENSSL_VERSION_MAJOR >= 3 - EVP_PKEY_CTX *ctx; - #else -@@ -310,7 +311,8 @@ int decrypt_rsa_message(const unsigned char *encryptedtext, const int encryptedt - keysize = RSA_size(rsa); - #endif - rsa_buffer = OPENSSL_malloc(keysize * 2); -- *plaintext = (unsigned char*)OPENSSL_malloc(keysize); -+ // Note: +1 for NULL -+ *plaintext = (unsigned char*)OPENSSL_malloc(keysize + 1); - - BIO *bioBuff = BIO_new_mem_buf((void*)encryptedtext, encryptedtext_len); - rsa_buffer_len = BIO_read(bioBuff, rsa_buffer, keysize * 2); -@@ -320,13 +322,15 @@ int decrypt_rsa_message(const unsigned char *encryptedtext, const int encryptedt - padding = RSA_PKCS1_PADDING; - } - #if OPENSSL_VERSION_MAJOR >= 3 -+ - plaintext_len = keysize; - EVP_PKEY_decrypt_init(ctx); -- int ret = EVP_PKEY_CTX_set_rsa_padding(ctx, padding); -+ -+ ret = EVP_PKEY_CTX_set_rsa_padding(ctx, padding); - if (ret < 0){ - goto errreturn; - } -- EVP_PKEY_decrypt(ctx, *plaintext, &plaintext_len, rsa_buffer, rsa_buffer_len); -+ ret = EVP_PKEY_decrypt(ctx, *plaintext, &plaintext_len, rsa_buffer, rsa_buffer_len); - EVP_PKEY_CTX_free(ctx); - #else - plaintext_len = RSA_private_decrypt(rsa_buffer_len, rsa_buffer, *plaintext, rsa, padding); -@@ -337,7 +341,7 @@ int decrypt_rsa_message(const unsigned char *encryptedtext, const int encryptedt - BIO_free(bioBuff); - - /* Treat a decryption error as an empty string. */ -- if (plaintext_len < 0) { -+ if (plaintext_len <= 0) { - plaintext_len = 0; - } - -@@ -386,24 +390,28 @@ int decode_auth_setting(int enable_debug, const char *authtoken, EVP_PKEY *priva - int plaintext_len; - plaintext_len = decrypt_rsa_message(encrypted_b64, encrypted_len_b64, private_key, &plaintext, use_pkcs1_padding); - free(encrypted_b64); -- if (plaintext_len < 0) { -+ if (plaintext_len <= 0) { - return -1; - } -+ - plaintext[plaintext_len] = '\0'; - - char *s_username, *s_password; - s_username = (char *) calloc(plaintext_len, sizeof(char)); - if (s_username == NULL) { -+ OPENSSL_free(plaintext); - return -1; - } - s_password = (char *) calloc(plaintext_len, sizeof(char)); - if (s_password == NULL) { -+ OPENSSL_free(plaintext); - free(s_username); - return -1; - } - - int rc = sscanf((char *) plaintext, auth_text_format, s_username, s_password, &utc_seconds); - if (rc != 3) { -+ OPENSSL_free(plaintext); - free(s_password); - free(s_username); - return -1; --- -2.45.4 - diff --git a/SPECS/iperf3/CVE-2025-54350.patch b/SPECS/iperf3/CVE-2025-54350.patch deleted file mode 100644 index c26afc29d2c..00000000000 --- a/SPECS/iperf3/CVE-2025-54350.patch +++ /dev/null @@ -1,35 +0,0 @@ -From 86bc637b483dc5de37f9a33583251bc08d32892e Mon Sep 17 00:00:00 2001 -From: "Bruce A. Mah" -Date: Tue, 24 Jun 2025 15:58:21 -0700 -Subject: [PATCH] Prevent crash due to assertion failures on malformed - authentication attempt. - -Reported by Han Lee (Apple Information Security) -CVE-2025-54350 ---- - src/iperf_auth.c | 2 -- - 1 file changed, 2 deletions(-) - -diff --git a/src/iperf_auth.c b/src/iperf_auth.c -index 72e85fc..b9f2bc0 100644 ---- a/src/iperf_auth.c -+++ b/src/iperf_auth.c -@@ -28,7 +28,6 @@ - #include "iperf_config.h" - - #include --#include - #include - #include - /* FreeBSD needs _WITH_GETLINE to enable the getline() declaration */ -@@ -152,7 +151,6 @@ int Base64Decode(const char* b64message, unsigned char** buffer, size_t* length) - - BIO_set_flags(bio, BIO_FLAGS_BASE64_NO_NL); //Do not use newlines to flush buffer - *length = BIO_read(bio, *buffer, strlen(b64message)); -- assert(*length == decodeLen); //length should equal decodeLen, else something went horribly wrong - BIO_free_all(bio); - - return (0); //success --- -2.45.4 - diff --git a/SPECS/iperf3/CVE-2026-71217.patch b/SPECS/iperf3/CVE-2026-71217.patch index cbdd5b615c5..aca9af1120f 100644 --- a/SPECS/iperf3/CVE-2026-71217.patch +++ b/SPECS/iperf3/CVE-2026-71217.patch @@ -10,81 +10,76 @@ Content-Transfer-Encoding: 8bit Special thanks to Dirk Müller for directing our attention to this. -Upstream Patch Reference: https://github.com/esnet/iperf/commit/494dd377eca4689672becdf06a85158557db1586.patch +Signed-off-by: Azure Linux Security Servicing Account +Upstream-reference: https://github.com/esnet/iperf/commit/494dd377eca4689672becdf06a85158557db1586.patch --- - src/iperf.h | 1 + - src/iperf_api.c | 202 ++++++++++++++++++++++++++++++++++++++---------- - 2 files changed, 162 insertions(+), 41 deletions(-) + src/iperf_api.c | 283 +++++++++++++++++++++++++++++++++++++----------- + 1 file changed, 222 insertions(+), 61 deletions(-) -diff --git a/src/iperf.h b/src/iperf.h -index 527e549..8a29b49 100644 ---- a/src/iperf.h -+++ b/src/iperf.h -@@ -436,6 +436,7 @@ struct iperf_test - #define MIN_INTERVAL 0.1 - #define MAX_INTERVAL 60.0 - #define MAX_TIME 86400 -+#define MAX_OMIT_TIME 600 - #define MAX_BURST 1000 - #define MAX_MSS (9 * 1024) - #define MAX_STREAMS 128 diff --git a/src/iperf_api.c b/src/iperf_api.c -index bb3be92..4000fce 100644 +index fb4273f1e..ddfb69f76 100644 --- a/src/iperf_api.c +++ b/src/iperf_api.c -@@ -598,25 +598,25 @@ iperf_set_mapped_v4(struct iperf_test *ipt, const int val) +@@ -606,25 +606,25 @@ iperf_set_mapped_v4(struct iperf_test *ipt, const int val) ipt->mapped_v4 = val; } -void +void - iperf_set_on_new_stream_callback(struct iperf_test* ipt, void (*callback)()) + iperf_set_on_new_stream_callback(struct iperf_test* ipt, void (*callback)(struct iperf_stream *)) { ipt->on_new_stream = callback; } -void +void - iperf_set_on_test_start_callback(struct iperf_test* ipt, void (*callback)()) + iperf_set_on_test_start_callback(struct iperf_test* ipt, void (*callback)(struct iperf_test *)) { ipt->on_test_start = callback; } -void +void - iperf_set_on_test_connect_callback(struct iperf_test* ipt, void (*callback)()) + iperf_set_on_test_connect_callback(struct iperf_test* ipt, void (*callback)(struct iperf_test *)) { ipt->on_connect = callback; } -void +void - iperf_set_on_test_finish_callback(struct iperf_test* ipt, void (*callback)()) + iperf_set_on_test_finish_callback(struct iperf_test* ipt, void (*callback)(struct iperf_test *)) { ipt->on_test_finish = callback; -@@ -1294,6 +1294,7 @@ iperf_parse_arguments(struct iperf_test *test, int argc, char **argv) - } - } - test->settings->rate = unit_atof_rate(optarg); -+ // NOTE: rate is unsigned, can't be less than 0 +@@ -1360,6 +1360,8 @@ iperf_parse_arguments(struct iperf_test *test, int argc, char **argv) + if (i_errno != 0) { + return -1; + } ++ // NOTE: rate is unsigned, can't be less than 0 ++ rate_flag = 1; client_flag = 1; break; -@@ -1323,19 +1324,22 @@ iperf_parse_arguments(struct iperf_test *test, int argc, char **argv) - break; - case 'n': - test->settings->bytes = unit_atoi(optarg); -+ // NOTE: bytes is unsigned, can't be less than 0 +@@ -1395,6 +1397,7 @@ iperf_parse_arguments(struct iperf_test *test, int argc, char **argv) + if (i_errno != 0) { + return -1; + } ++ // NOTE: bytes is unsigned, can't be less than 0 client_flag = 1; break; case 'k': - test->settings->blocks = unit_atoi(optarg); -+ // NOTE: blocks is unsigned, can't be less than 0 +@@ -1402,6 +1405,7 @@ iperf_parse_arguments(struct iperf_test *test, int argc, char **argv) + if (i_errno != 0) { + return -1; + } ++ // NOTE: blocks is unsigned, can't be less than 0 client_flag = 1; break; case 'l': - blksize = unit_atoi(optarg); -+ // NOTE: blksize is unsigned, can't be less than 0 +@@ -1409,11 +1413,12 @@ iperf_parse_arguments(struct iperf_test *test, int argc, char **argv) + if (i_errno != 0) { + return -1; + } ++ // NOTE: blksize is unsigned, can't be less than 0 client_flag = 1; break; case 'P': @@ -94,16 +89,16 @@ index bb3be92..4000fce 100644 i_errno = IENUMSTREAMS; return -1; } -@@ -1362,7 +1366,7 @@ iperf_parse_arguments(struct iperf_test *test, int argc, char **argv) - // Do sanity checks as double-precision floating point - // to avoid possible integer overflows. - farg = unit_atof(optarg); +@@ -1443,7 +1448,7 @@ iperf_parse_arguments(struct iperf_test *test, int argc, char **argv) + if (i_errno != 0) { + return -1; + } - if (farg > (double) MAX_TCP_BUFFER) { + if (farg < 0 || farg > (double) MAX_TCP_BUFFER) { i_errno = IEBUFSIZE; return -1; } -@@ -1400,7 +1404,7 @@ iperf_parse_arguments(struct iperf_test *test, int argc, char **argv) +@@ -1485,7 +1490,7 @@ iperf_parse_arguments(struct iperf_test *test, int argc, char **argv) break; case 'M': test->settings->mss = atoi(optarg); @@ -112,27 +107,66 @@ index bb3be92..4000fce 100644 i_errno = IEMSS; return -1; } -@@ -1599,6 +1603,7 @@ iperf_parse_arguments(struct iperf_test *test, int argc, char **argv) - case OPT_FQ_RATE: +@@ -1727,8 +1732,9 @@ iperf_parse_arguments(struct iperf_test *test, int argc, char **argv) #if defined(HAVE_SO_MAX_PACING_RATE) test->settings->fqrate = unit_atof_rate(optarg); -+ // NOTE: fqrate is unsigned, can't be less than 0 + if (i_errno != 0) { +- return -1; ++ return -1; + } ++ // NOTE: fqrate is unsigned, can't be less than 0 client_flag = 1; #else /* HAVE_SO_MAX_PACING_RATE */ i_errno = IEUNIMP; -@@ -1637,6 +1642,10 @@ iperf_parse_arguments(struct iperf_test *test, int argc, char **argv) - #endif /* HAVE_SSL */ +@@ -1779,14 +1785,18 @@ iperf_parse_arguments(struct iperf_test *test, int argc, char **argv) case OPT_PACING_TIMER: test->settings->pacing_timer = unit_atoi(optarg); -+ // NOTE: pacing_timer is an int and needs to be checked -+ if (test->settings->pacing_timer < 0){ -+ return -1; -+ } + if (i_errno != 0) { +- return -1; ++ return -1; + } ++ // NOTE: pacing_timer is an int and needs to be checked ++ if (test->settings->pacing_timer < 0){ ++ return -1; ++ } client_flag = 1; break; case OPT_CONNECT_TIMEOUT: -@@ -2314,44 +2323,137 @@ get_parameters(struct iperf_test *test) - set_protocol(test, Pudp); + test->settings->connect_timeout = unit_atoi(optarg); + if (i_errno != 0) { +- return -1; ++ return -1; + } + client_flag = 1; + break; +@@ -2071,7 +2081,7 @@ iperf_check_throttle(struct iperf_stream *sp, struct iperf_time *nowP) + uint64_t bits_per_second; + int64_t missing_rate; + uint64_t bits_sent; +- ++ + #if defined(HAVE_CLOCK_NANOSLEEP) || defined(HAVE_NANOSLEEP) + struct timespec nanosleep_time; + int64_t time_to_green_light, delta_bits; +@@ -2258,7 +2268,7 @@ iperf_recv_mt(struct iperf_stream *sp) + i_errno = IESTREAMREAD; + return r; + } +- ++ + /* Collect statistics only if receive did not timeout (e.g. `Nread()` may timeout). + * This is also important for `--rcv-timeout` to work properly. + */ +@@ -2527,6 +2537,7 @@ send_parameters(struct iperf_test *test) + return r; + } + ++ + /*************************************************************/ + + static int +@@ -2563,24 +2574,66 @@ get_parameters(struct iperf_test *test) + } if ((j_p = iperf_cJSON_GetObjectItemType(j, "sctp", cJSON_True)) != NULL) set_protocol(test, Psctp); - if ((j_p = iperf_cJSON_GetObjectItemType(j, "omit", cJSON_Number)) != NULL) @@ -212,11 +246,77 @@ index bb3be92..4000fce 100644 if ((j_p = iperf_cJSON_GetObjectItemType(j, "reverse", cJSON_True)) != NULL) iperf_set_test_reverse(test, 1); if ((j_p = iperf_cJSON_GetObjectItemType(j, "bidirectional", cJSON_True)) != NULL) - iperf_set_test_bidirectional(test, 1); +@@ -2589,19 +2642,51 @@ get_parameters(struct iperf_test *test) + if ((j_p = iperf_cJSON_GetObjectItemType(j, "mptcp", cJSON_True)) != NULL) + test->mptcp = 1; + #endif - if ((j_p = iperf_cJSON_GetObjectItemType(j, "window", cJSON_Number)) != NULL) - test->settings->socket_bufsize = j_p->valueint; - if ((j_p = iperf_cJSON_GetObjectItemType(j, "len", cJSON_Number)) != NULL) - test->settings->blksize = j_p->valueint; ++ if ((j_p = iperf_cJSON_GetObjectItemType(j, "window", cJSON_Number)) != NULL){ ++ if (j_p->valueint < 0 || j_p->valueint > MAX_TCP_BUFFER){ ++ i_errno = IEBUFSIZE; ++ r = -1; ++ } ++ else { ++ test->settings->socket_bufsize = j_p->valueint; ++ } ++ } ++ if ((j_p = iperf_cJSON_GetObjectItemType(j, "len", cJSON_Number)) != NULL){ ++ if (j_p->valueint < 0){ ++ i_errno = IEBLOCKSIZE; ++ r = -1; ++ }else { ++ test->settings->blksize = j_p->valueint; ++ } ++ } + + /* Accept UDP GSO/GRO settings provided by the client */ + /* Always accept these fields to allow server to use GSO/GRO based on its own support */ +- if ((j_p = iperf_cJSON_GetObjectItemType(j, "gso", cJSON_Number)) != NULL) +- test->settings->gso = j_p->valueint; +- if ((j_p = iperf_cJSON_GetObjectItemType(j, "gso_dg_size", cJSON_Number)) != NULL) +- test->settings->gso_dg_size = j_p->valueint; +- if ((j_p = iperf_cJSON_GetObjectItemType(j, "gso_bf_size", cJSON_Number)) != NULL) +- test->settings->gso_bf_size = j_p->valueint; ++ // Should be TrueObject ++ if ((j_p = iperf_cJSON_GetObjectItemType(j, "gso", cJSON_Number)) != NULL){ ++ if (j_p->valueint < 0){ ++ i_errno = IERECVPARAMS; ++ r = -1; ++ } else { ++ test->settings->gso = j_p->valueint; ++ } ++ } ++ if ((j_p = iperf_cJSON_GetObjectItemType(j, "gso_dg_size", cJSON_Number)) != NULL){ ++ if (j_p->valueint < 0){ ++ i_errno = IERECVPARAMS; ++ r = -1; ++ } else { ++ test->settings->gso_dg_size = j_p->valueint; ++ } ++ } ++ if ((j_p = iperf_cJSON_GetObjectItemType(j, "gso_bf_size", cJSON_Number)) != NULL){ ++ if (j_p->valueint < 0){ ++ i_errno = IERECVPARAMS; ++ r = -1; ++ } else { ++ test->settings->gso_bf_size = j_p->valueint; ++ } ++ } + + /* Backward-compatibility: If client didn't send GSO params, derive from blksize. */ + if (test->protocol->id == Pudp && test->settings->gso == 1 && test->settings->gso_dg_size == 0) { +@@ -2613,23 +2698,72 @@ get_parameters(struct iperf_test *test) + } + } + +- if ((j_p = iperf_cJSON_GetObjectItemType(j, "gro", cJSON_Number)) != NULL) +- test->settings->gro = j_p->valueint; +- if ((j_p = iperf_cJSON_GetObjectItemType(j, "gro_bf_size", cJSON_Number)) != NULL) +- test->settings->gro_bf_size = j_p->valueint; +- - if ((j_p = iperf_cJSON_GetObjectItemType(j, "bandwidth", cJSON_Number)) != NULL) - test->settings->rate = j_p->valueint; - if ((j_p = iperf_cJSON_GetObjectItemType(j, "fqrate", cJSON_Number)) != NULL) @@ -229,21 +329,20 @@ index bb3be92..4000fce 100644 - test->settings->tos = j_p->valueint; - if ((j_p = iperf_cJSON_GetObjectItemType(j, "flowlabel", cJSON_Number)) != NULL) - test->settings->flowlabel = j_p->valueint; -+ if ((j_p = iperf_cJSON_GetObjectItemType(j, "window", cJSON_Number)) != NULL){ -+ if (j_p->valueint < 0 || j_p->valueint > MAX_TCP_BUFFER){ -+ i_errno = IEBUFSIZE; ++ if ((j_p = iperf_cJSON_GetObjectItemType(j, "gro", cJSON_Number)) != NULL){ ++ if (j_p->valueint < 0 || j_p->valueint > 1){ ++ i_errno = IERECVPARAMS; + r = -1; -+ } -+ else { -+ test->settings->socket_bufsize = j_p->valueint; ++ }else { ++ test->settings->gro = j_p->valueint; + } + } -+ if ((j_p = iperf_cJSON_GetObjectItemType(j, "len", cJSON_Number)) != NULL){ ++ if ((j_p = iperf_cJSON_GetObjectItemType(j, "gro_bf_size", cJSON_Number)) != NULL){ + if (j_p->valueint < 0){ -+ i_errno = IEBLOCKSIZE; ++ i_errno = IERECVPARAMS; + r = -1; + }else { -+ test->settings->blksize = j_p->valueint; ++ test->settings->gro_bf_size = j_p->valueint; + } + } + if ((j_p = iperf_cJSON_GetObjectItemType(j, "bandwidth", cJSON_Number)) != NULL){ @@ -299,11 +398,11 @@ index bb3be92..4000fce 100644 if ((j_p = iperf_cJSON_GetObjectItemType(j, "title", cJSON_String)) != NULL) test->title = strdup(j_p->valuestring); if ((j_p = iperf_cJSON_GetObjectItemType(j, "extra_data", cJSON_String)) != NULL) -@@ -2360,17 +2462,20 @@ get_parameters(struct iperf_test *test) +@@ -2638,30 +2772,57 @@ get_parameters(struct iperf_test *test) test->congestion = strdup(j_p->valuestring); if ((j_p = iperf_cJSON_GetObjectItemType(j, "congestion_used", cJSON_String)) != NULL) test->congestion_used = strdup(j_p->valuestring); -+ // Should be TrueObject ++ // Should be TrueObject if ((j_p = iperf_cJSON_GetObjectItemType(j, "get_server_output", cJSON_Number)) != NULL) iperf_set_test_get_server_output(test, 1); if ((j_p = iperf_cJSON_GetObjectItemType(j, "udp_counters_64bit", cJSON_Number)) != NULL) @@ -312,7 +411,7 @@ index bb3be92..4000fce 100644 test->repeating_payload = 1; - if ((j_p = iperf_cJSON_GetObjectItemType(j, "zerocopy", cJSON_Number)) != NULL) - test->zerocopy = j_p->valueint; -+ if ((j_p = iperf_cJSON_GetObjectItemType(j, "zerocopy", cJSON_Number)) != NULL){ ++ if ((j_p = iperf_cJSON_GetObjectItemType(j, "zerocopy", cJSON_Number)) != NULL){ + test->zerocopy = (j_p->valueint) ? 1: 0; + } #if defined(HAVE_DONT_FRAGMENT) @@ -324,12 +423,21 @@ index bb3be92..4000fce 100644 #endif /* HAVE_DONT_FRAGMENT */ #if defined(HAVE_SSL) if ((j_p = iperf_cJSON_GetObjectItemType(j, "authtoken", cJSON_String)) != NULL) -@@ -2381,7 +2486,21 @@ get_parameters(struct iperf_test *test) + test->settings->authtoken = strdup(j_p->valuestring); + #endif //HAVE_SSL +- if ((j_p = cJSON_GetObjectItem(j, "skip_rx_copy")) != NULL) +- test->settings->skip_rx_copy = j_p->valueint; ++ if ((j_p = cJSON_GetObjectItem(j, "skip_rx_copy")) != NULL){ ++ test->settings->skip_rx_copy = (j_p->valueint) ? 1: 0; ++ } + if (test->mode && test->protocol->id == Ptcp && has_tcpinfo_retransmits()) + test->sender_has_retransmits = 1; if (test->settings->rate) cJSON_AddNumberToObject(test->json_start, "target_bitrate", test->settings->rate); - cJSON_Delete(j); + -+ /* Check flag / role compatibility. */ + cJSON_Delete(j); + ++ /* Check flag / role compatibility. */ + if ((test->protocol->id != Pudp && test->settings->blksize <= 0) + || test->settings->blksize > MAX_BLOCKSIZE) { + i_errno = IEBLOCKSIZE; @@ -341,19 +449,35 @@ index bb3be92..4000fce 100644 + i_errno = IEUDPBLOCKSIZE; + return -1; + } ++ ++ if (test->protocol->id == Pudp && test->settings->gso) { ++ test->settings->gso_dg_size = test->settings->blksize; ++ /* use the multiple of datagram size for the best efficiency. */ ++ if (test->settings->gso_dg_size > 0) { ++ test->settings->gso_bf_size = (test->settings->gso_bf_size / test->settings->gso_dg_size) * test->settings->gso_dg_size; ++ } ++ } ++ ++ + /* Ensure that the client does not request to run longer than the server's configured max */ + if ((test->max_server_duration > 0) && (((test->duration + test->omit) > test->max_server_duration) || (test->duration == 0))) { + i_errno = IEMAXSERVERTESTDURATIONEXCEEDED; +@@ -2681,8 +2842,8 @@ get_parameters(struct iperf_test *test) + i_errno = IETOTALRATE; + r = -1; + } +- } + return r; } -@@ -2494,6 +2613,7 @@ send_results(struct iperf_test *test) - return r; - } - +@@ -5608,7 +5769,7 @@ iperf_set_control_keepalive(struct iperf_test *test) + return -1; + } + } +- + - /*************************************************************/ - - static int --- -2.45.4 - + // Seems that at least in Windows WSL2, TCP keepalive retries full interval must be + // smaller than the idle interval. Otherwise, the keepalive message is sent only once. + if (test->settings->cntl_ka_keepidle) { diff --git a/SPECS/iperf3/CVE-2026-71218.patch b/SPECS/iperf3/CVE-2026-71218.patch deleted file mode 100644 index 7a7b47cf709..00000000000 --- a/SPECS/iperf3/CVE-2026-71218.patch +++ /dev/null @@ -1,44 +0,0 @@ -From f62f457e132d702c070a6ad1b1bfafee0eb13b5f Mon Sep 17 00:00:00 2001 -From: David Bar-On -Date: Sun, 2 Jun 2024 12:41:10 +0300 -Subject: [PATCH] Veify that Params JSON size was received and is resonable - -Signed-off-by: Azure Linux Security Servicing Account -Upstream-reference: https://github.com/esnet/iperf/commit/0128d0357b7e8916fe39e980e455729bc0e5fd4e.patch ---- - src/iperf.h | 2 ++ - src/iperf_api.c | 5 +++-- - 2 files changed, 5 insertions(+), 2 deletions(-) - -diff --git a/src/iperf.h b/src/iperf.h -index 8a29b49..619bf79 100644 ---- a/src/iperf.h -+++ b/src/iperf.h -@@ -425,6 +425,8 @@ struct iperf_test - - #define UDP_BUFFER_EXTRA 1024 - -+#define MAX_PARAMS_JSON_STRING 8 * 1024 -+ - /* constants for command line arg sanity checks */ - #define MB (1024 * 1024) - #define MAX_TCP_BUFFER (512 * MB) -diff --git a/src/iperf_api.c b/src/iperf_api.c -index 4000fce..356c6ff 100644 ---- a/src/iperf_api.c -+++ b/src/iperf_api.c -@@ -2848,8 +2848,9 @@ JSON_read(int fd) - * Then read the JSON into a buffer and parse it. Return a parsed JSON - * structure, NULL if there was an error. - */ -- if (Nread(fd, (char*) &nsize, sizeof(nsize), Ptcp) >= 0) { -- hsize = ntohl(nsize); -+ rc = Nread(fd, (char*) &nsize, sizeof(nsize), Ptcp); -+ hsize = ntohl(nsize); -+ if (rc == sizeof(nsize) && hsize <= MAX_PARAMS_JSON_STRING) { - /* Allocate a buffer to hold the JSON */ - strsize = hsize + 1; /* +1 for trailing NULL */ - if (strsize) { --- -2.45.4 - diff --git a/SPECS/iperf3/iperf3.signatures.json b/SPECS/iperf3/iperf3.signatures.json index 468024cec31..4e3028f2d12 100644 --- a/SPECS/iperf3/iperf3.signatures.json +++ b/SPECS/iperf3/iperf3.signatures.json @@ -1,5 +1,5 @@ { "Signatures": { - "iperf3-3.17.1.tar.gz": "105b4fe7fbce31c9b94a3fec10c46e3b4b298adc076e1e3af52b990e1faf2db9" + "iperf3-3.21.tar.gz": "dd289b6700d3bc33eda7fa3ce6db217d6ca42239edbcb2e7f152bf7bf5c8a5aa" } } \ No newline at end of file diff --git a/SPECS/iperf3/iperf3.spec b/SPECS/iperf3/iperf3.spec index fb498eccd4c..6150922109d 100644 --- a/SPECS/iperf3/iperf3.spec +++ b/SPECS/iperf3/iperf3.spec @@ -1,7 +1,7 @@ Summary: A network performance benchmark tool. Name: iperf3 -Version: 3.17.1 -Release: 5%{?dist} +Version: 3.21 +Release: 1%{?dist} License: BSD and MIT and Public Domain Vendor: Microsoft Corporation Distribution: Azure Linux @@ -9,12 +9,7 @@ Group: Applications/System URL: https://github.com/esnet/iperf Source0: https://github.com/esnet/iperf/archive/%{version}.tar.gz#/%{name}-%{version}.tar.gz Patch1: disablepg.patch -Patch2: CVE-2024-53580.patch -Patch3: CVE-2025-54350.patch -Patch4: CVE-2025-54349.patch -Patch5: openssl_encrypt_buffer_size.patch -Patch6: CVE-2026-71217.patch -Patch7: CVE-2026-71218.patch +Patch2: CVE-2026-71217.patch BuildRequires: autoconf >= 2.71 BuildRequires: automake BuildRequires: openssl @@ -74,6 +69,17 @@ make %{?_smp_mflags} check %{_mandir}/man3/libiperf.3.gz %changelog +* Wed Sep 10 2026 Siva Kannan - 3.21-1 +- Update to 3.21 to pick up upstream multi-threading stability fixes +- Fixes client crash at end of test with high -P stream counts, introduced by + the thread-per-stream model in 3.16 (segfaults fixed in 3.18, socket-close + race and PTHREAD_CANCEL_DEFERRED change in 3.21) +- Drop CVE-2024-53580.patch, fixed upstream in 3.18 +- Drop CVE-2025-54349.patch and CVE-2025-54350.patch, fixed upstream in 3.19.1 +- Drop openssl_encrypt_buffer_size.patch, fixed upstream in 3.20 +- Drop CVE-2026-71218.patch, fixed upstream in 3.21 +- Rebase CVE-2026-71217.patch onto upstream commit 494dd377 + * Thu Aug 13 2026 Azure Linux Security Servicing Account - 3.17.1-5 - Patch for CVE-2026-71218, CVE-2026-71217 diff --git a/SPECS/iperf3/openssl_encrypt_buffer_size.patch b/SPECS/iperf3/openssl_encrypt_buffer_size.patch deleted file mode 100644 index 7c26c8d9d2f..00000000000 --- a/SPECS/iperf3/openssl_encrypt_buffer_size.patch +++ /dev/null @@ -1,24 +0,0 @@ -From aab262afe1770b55bb865fd4dad2d5e737c758a6 Mon Sep 17 00:00:00 2001 -From: Michael Lowman -Date: Wed, 8 Oct 2025 22:40:07 +0200 -Subject: [PATCH] Set output buffer size prior to encrypt operation - -When calling EVP_PKEY_encrypt with a non-null output buffer, -the output buffer length must be provided. Attempts to write -beyond this length will fail. ---- - src/iperf_auth.c | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/src/iperf_auth.c b/src/iperf_auth.c -index eda015099..774e1b701 100644 ---- a/src/iperf_auth.c -+++ b/src/iperf_auth.c -@@ -255,6 +255,7 @@ int encrypt_rsa_message(const char *plaintext, EVP_PKEY *public_key, unsigned ch - #endif - rsa_buffer = OPENSSL_malloc(keysize * 2); - *encryptedtext = (unsigned char*)OPENSSL_malloc(keysize); -+ encryptedtext_len = keysize; - - BIO *bioBuff = BIO_new_mem_buf((void*)plaintext, (int)strlen(plaintext)); - rsa_buffer_len = BIO_read(bioBuff, rsa_buffer, keysize * 2); diff --git a/cgmanifest.json b/cgmanifest.json index f4906091a8a..eac769c7ff7 100644 --- a/cgmanifest.json +++ b/cgmanifest.json @@ -7571,8 +7571,8 @@ "type": "other", "other": { "name": "iperf3", - "version": "3.17.1", - "downloadUrl": "https://github.com/esnet/iperf/archive/3.17.1.tar.gz" + "version": "3.21", + "downloadUrl": "https://github.com/esnet/iperf/archive/3.21.tar.gz" } } },