From 0530681a39cd44e16d1d53be9cf9a1755a1aaf96 Mon Sep 17 00:00:00 2001 From: Heiko Reese Date: Sat, 21 Aug 2021 19:11:08 +0200 Subject: [PATCH] Added more version workarounds for compilation, late binding and type casting. --- src/libexim-encrypt-dlfunc.c | 38 +++++++++++++++++++++++++----------- 1 file changed, 27 insertions(+), 11 deletions(-) diff --git a/src/libexim-encrypt-dlfunc.c b/src/libexim-encrypt-dlfunc.c index fd10b28..6d74f35 100644 --- a/src/libexim-encrypt-dlfunc.c +++ b/src/libexim-encrypt-dlfunc.c @@ -6,8 +6,17 @@ #include #include -/* Exim4 dlfunc API header */ -#include +/* + * This is a set of workarounds for the different exim local_scan ABI versions, distribution patches and missing + * definitions which prevent late binding. + * + * List of local_scan ABI versions per distribution: + * + * 2.0 Debian 10 (Buster) + * 4.1 Debian 11 (Bullseye) + * 2.0 Ubuntu 18-04 (Bionic) + * 3.1 Ubuntu 20-04 (Focal) + */ // local_scan ABI version < 3 #if LOCAL_SCAN_ABI_VERSION_MAJOR < 3 @@ -21,7 +30,7 @@ #define store_get_untainted(size) store_get(size, FALSE) #define store_get_tainted(size) store_get(size, TRUE) -# define string_copy(s) string_copy_function(s) +#define string_copy(s) string_copy_function(s) extern uschar * string_copy_function(const uschar *); // local_scan ABI version > 3 @@ -29,8 +38,12 @@ extern uschar * string_copy_function(const uschar *); #define DLFUNC_IMPL #define store_get_untainted(size) store_get(size, FALSE) #define store_get_tainted(size) store_get(size, TRUE) + #endif +/* Exim4 dlfunc API header */ +#include + /* * Encrypt message using crypto_secretbox_easy(). * @@ -77,7 +90,8 @@ int sodium_crypto_secretbox_encrypt_password(uschar **yield, int argc, uschar *a unsigned char nonce[crypto_secretbox_NONCEBYTES]; randombytes_buf(nonce, sizeof nonce); if (crypto_secretbox_easy(ciphertext, message, messagelen, nonce, keybytes) != 0) { - *yield = string_copy((unsigned char *) "Encryption error after crypto_secretbox_easy()"); + *yield = string_copy(US + "Encryption error after crypto_secretbox_easy()"); return ERROR; } @@ -97,7 +111,8 @@ int sodium_crypto_secretbox_encrypt_password(uschar **yield, int argc, uschar *a sodium_base64_VARIANT_ORIGINAL); // return base64-encoded ciphertext - *yield = string_copy(outstring); + *yield = string_copy(US + outstring); return OK; } @@ -115,9 +130,7 @@ int sodium_crypto_secretbox_decrypt_password(uschar **yield, int argc, uschar *a } // check argument count if (argc != 2) { - *yield = - string_sprintf - ("Wrong number of arguments (got %i, expected 2)", argc); + *yield = string_sprintf("Wrong number of arguments (got %i, expected 2)", argc); return ERROR; } // get password @@ -144,7 +157,8 @@ int sodium_crypto_secretbox_decrypt_password(uschar **yield, int argc, uschar *a NULL, &combined_message_len, NULL, sodium_base64_VARIANT_ORIGINAL); if (b64err != 0) { - *yield = string_copy((unsigned char *) "Error decoding base64 encoded ciphertext"); + *yield = string_copy(US + "Error decoding base64 encoded ciphertext"); return ERROR; } @@ -160,12 +174,14 @@ int sodium_crypto_secretbox_decrypt_password(uschar **yield, int argc, uschar *a // decrypt message if (crypto_secretbox_open_easy(cleartext, &combined_message[crypto_secretbox_NONCEBYTES], combined_message_len - crypto_secretbox_NONCEBYTES, nonce, keybytes) != 0) { - *yield = string_copy((unsigned char *) "Decryption error after crypto_secretbox_open_easy()"); + *yield = string_copy(US + "Decryption error after crypto_secretbox_open_easy()"); return ERROR; } // return cleartext - *yield = string_copy(cleartext); + *yield = string_copy(US + cleartext); return OK; }