refactor: Refactor OMEMO error handling and add non-null attributes
Add __attribute__((nonnull) hints to omemo_receive_message and omemo_on_message_recv declarations to catch NULL arguments at compiletime. So we can set the error state unconditionally in the functions.
This commit is contained in:
@@ -1020,15 +1020,11 @@ omemo_on_message_recv(const char* const from_jid, uint32_t sid,
|
||||
auto_jid Jid* sender = NULL;
|
||||
auto_jid Jid* from = jid_create(from_jid);
|
||||
|
||||
if (error) {
|
||||
*error = OMEMO_ERR_NONE;
|
||||
}
|
||||
*error = OMEMO_ERR_NONE;
|
||||
|
||||
if (!from) {
|
||||
log_error("[OMEMO][RECV] Invalid jid %s", from_jid);
|
||||
if (error) {
|
||||
*error = OMEMO_ERR_INVALID_JID;
|
||||
}
|
||||
*error = OMEMO_ERR_INVALID_JID;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -1044,9 +1040,7 @@ omemo_on_message_recv(const char* const from_jid, uint32_t sid,
|
||||
|
||||
if (!key) {
|
||||
log_warning("[OMEMO][RECV] received a message with no corresponding key");
|
||||
if (error) {
|
||||
*error = OMEMO_ERR_NO_KEY;
|
||||
}
|
||||
*error = OMEMO_ERR_NO_KEY;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -1063,9 +1057,7 @@ omemo_on_message_recv(const char* const from_jid, uint32_t sid,
|
||||
g_list_free(roster);
|
||||
if (!sender) {
|
||||
log_warning("[OMEMO][RECV] cannot find MUC message sender fulljid");
|
||||
if (error) {
|
||||
*error = OMEMO_ERR_MUC_SENDER_NOT_FOUND;
|
||||
}
|
||||
*error = OMEMO_ERR_MUC_SENDER_NOT_FOUND;
|
||||
return NULL;
|
||||
}
|
||||
} else {
|
||||
@@ -1083,9 +1075,7 @@ omemo_on_message_recv(const char* const from_jid, uint32_t sid,
|
||||
res = session_cipher_create(&cipher, omemo_ctx.store, &address, omemo_ctx.signal);
|
||||
if (res != 0) {
|
||||
log_error("[OMEMO][RECV] cannot create session cipher");
|
||||
if (error) {
|
||||
*error = OMEMO_ERR_NO_SESSION;
|
||||
}
|
||||
*error = OMEMO_ERR_NO_SESSION;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -1145,12 +1135,10 @@ omemo_on_message_recv(const char* const from_jid, uint32_t sid,
|
||||
session_cipher_free(cipher);
|
||||
if (res != 0) {
|
||||
log_error("[OMEMO][RECV] cannot decrypt message key: %d", res);
|
||||
if (error) {
|
||||
if (!*trusted) {
|
||||
*error = OMEMO_ERR_NOT_TRUSTED;
|
||||
} else {
|
||||
*error = OMEMO_ERR_DECRYPT_FAILED;
|
||||
}
|
||||
if (!*trusted) {
|
||||
*error = OMEMO_ERR_NOT_TRUSTED;
|
||||
} else {
|
||||
*error = OMEMO_ERR_DECRYPT_FAILED;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
@@ -1158,9 +1146,7 @@ omemo_on_message_recv(const char* const from_jid, uint32_t sid,
|
||||
if (signal_buffer_len(plaintext_key) != AES128_GCM_KEY_LENGTH + AES128_GCM_TAG_LENGTH) {
|
||||
log_error("[OMEMO][RECV] invalid key length");
|
||||
signal_buffer_free(plaintext_key);
|
||||
if (error) {
|
||||
*error = OMEMO_ERR_DECRYPT_FAILED;
|
||||
}
|
||||
*error = OMEMO_ERR_DECRYPT_FAILED;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -1173,9 +1159,7 @@ omemo_on_message_recv(const char* const from_jid, uint32_t sid,
|
||||
if (res != 0) {
|
||||
log_error("[OMEMO][RECV] cannot decrypt message: %s", gcry_strerror(res));
|
||||
free(plaintext);
|
||||
if (error) {
|
||||
*error = OMEMO_ERR_DECRYPT_FAILED;
|
||||
}
|
||||
*error = OMEMO_ERR_DECRYPT_FAILED;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
@@ -100,7 +100,7 @@ void omemo_start_device_session(const char* const jid, uint32_t device_id, GList
|
||||
gboolean omemo_loaded(void);
|
||||
|
||||
char* omemo_on_message_send(ProfWin* win, const char* const message, gboolean request_receipt, gboolean muc, const char* const replace_id);
|
||||
char* omemo_on_message_recv(const char* const from, uint32_t sid, const unsigned char* const iv, size_t iv_len, GList* keys, const unsigned char* const payload, size_t payload_len, gboolean muc, gboolean* trusted, omemo_error_t* error);
|
||||
char* omemo_on_message_recv(const char* const from, uint32_t sid, const unsigned char* const iv, size_t iv_len, GList* keys, const unsigned char* const payload, size_t payload_len, gboolean muc, gboolean* trusted, omemo_error_t* error) __attribute__((nonnull(9, 10)));
|
||||
|
||||
char* omemo_encrypt_file(FILE* in, FILE* out, off_t file_size, int* gcry_res);
|
||||
gcry_error_t omemo_decrypt_file(FILE* in, FILE* out, off_t file_size, const char* fragment);
|
||||
|
||||
Reference in New Issue
Block a user