From a784c0fe52c03e75516eb522a06ea5f56741edc7 Mon Sep 17 00:00:00 2001 From: Gyorgy Sarvari Date: Mon, 23 Mar 2026 09:39:33 +0100 Subject: [PATCH] iperf_auth: keep RSA_private_decrypt and RSA_public_encrypt errors The return values of RSA_public_encrypt and RSA_private_decrypt calls are stored in unsigned types. These functions return -1 upon error. These return values are checked after the call if they are negative, but since they are stored in unsigned type, they are lost - when the error code is compared to 0, the value is always bigger than 0. To avoid this, store the return value in a signed integer, and set the value encryptedtext_len and plaintext_len for later comparison based on the result. Also, change some tab indents to space. Signed-off-by: Gyorgy Sarvari --- src/iperf_auth.c | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/iperf_auth.c b/src/iperf_auth.c index 56fd42232..095ac0e06 100644 --- a/src/iperf_auth.c +++ b/src/iperf_auth.c @@ -272,7 +272,8 @@ int encrypt_rsa_message(const char *plaintext, EVP_PKEY *public_key, unsigned ch EVP_PKEY_encrypt(ctx, *encryptedtext, &encryptedtext_len, rsa_buffer, rsa_buffer_len); EVP_PKEY_CTX_free(ctx); #else - encryptedtext_len = RSA_public_encrypt(rsa_buffer_len, rsa_buffer, *encryptedtext, rsa, padding); + int encrypt_ret = RSA_public_encrypt(rsa_buffer_len, rsa_buffer, *encryptedtext, rsa, padding); + encryptedtext_len = encrypt_ret < 0 ? 0 : (size_t) encrypt_ret; RSA_free(rsa); #endif @@ -338,7 +339,8 @@ int decrypt_rsa_message(const unsigned char *encryptedtext, const int encryptedt 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); + int decrypt_ret = RSA_private_decrypt(rsa_buffer_len, rsa_buffer, *plaintext, rsa, padding); + plaintext_len = decrypt_ret < 0 ? 0 : (size_t) decrypt_ret; RSA_free(rsa); #endif @@ -370,7 +372,7 @@ int encode_auth_setting(const char *username, const char *password, EVP_PKEY *pu const int text_len = strlen(auth_text_format) + strlen(username) + strlen(password) + 32; char *text = (char *) calloc(text_len, sizeof(char)); if (text == NULL) { - return -1; + return -1; } snprintf(text, text_len, auth_text_format, username, password, (int64_t)utc_seconds); @@ -407,21 +409,21 @@ int decode_auth_setting(int enable_debug, const char *authtoken, EVP_PKEY *priva s_username = (char *) calloc(plaintext_len, sizeof(char)); if (s_username == NULL) { OPENSSL_free(plaintext); - return -1; + return -1; } s_password = (char *) calloc(plaintext_len, sizeof(char)); if (s_password == NULL) { OPENSSL_free(plaintext); - free(s_username); - return -1; + 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; + free(s_password); + free(s_username); + return -1; } if (enable_debug) {