Implement sodium_set_misuse_handler()
This commit is contained in:
parent
9def4d9a8a
commit
0e8d7c9268
@ -14,6 +14,9 @@ int sodium_init(void)
|
||||
|
||||
/* ---- */
|
||||
|
||||
SODIUM_EXPORT
|
||||
int sodium_set_misuse_handler(void (*handler)(const char *err));
|
||||
|
||||
SODIUM_EXPORT
|
||||
void sodium_misuse(const char *err)
|
||||
__attribute__ ((noreturn));
|
||||
|
@ -171,9 +171,30 @@ sodium_crit_leave(void)
|
||||
|
||||
#endif
|
||||
|
||||
static void (*_misuse_handler)(const char *err);
|
||||
|
||||
void
|
||||
sodium_misuse(const char *err)
|
||||
{
|
||||
(void) err;
|
||||
void (*handler)(const char *err);
|
||||
|
||||
if (sodium_crit_enter() == 0) {
|
||||
handler = _misuse_handler;
|
||||
if (sodium_crit_leave() == 0 && handler != NULL) {
|
||||
handler(err);
|
||||
}
|
||||
}
|
||||
abort();
|
||||
}
|
||||
|
||||
int
|
||||
sodium_set_misuse_handler(void (*handler)(const char *err))
|
||||
{
|
||||
if (sodium_crit_enter() != 0) {
|
||||
return -1;
|
||||
}
|
||||
_misuse_handler = handler;
|
||||
if (sodium_crit_leave() != 0) {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
@ -2,9 +2,20 @@
|
||||
#define TEST_NAME "sodium_core"
|
||||
#include "cmptest.h"
|
||||
|
||||
static void
|
||||
misuse_handler(const char *err)
|
||||
{
|
||||
printf("misuse_handler(): [%s]\n", err);
|
||||
exit(0);
|
||||
}
|
||||
|
||||
int
|
||||
main(void)
|
||||
{
|
||||
sodium_set_misuse_handler(NULL);
|
||||
sodium_set_misuse_handler(misuse_handler);
|
||||
sodium_set_misuse_handler(NULL);
|
||||
|
||||
printf("%d\n", sodium_init());
|
||||
|
||||
(void) sodium_runtime_has_neon();
|
||||
@ -15,5 +26,9 @@ main(void)
|
||||
(void) sodium_runtime_has_pclmul();
|
||||
(void) sodium_runtime_has_aesni();
|
||||
|
||||
sodium_set_misuse_handler(misuse_handler);
|
||||
sodium_misuse("TEST");
|
||||
printf("Misuse handler returned\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user