diff --git a/src/libsodium/include/sodium/utils.h b/src/libsodium/include/sodium/utils.h index aaf3fc5d..bd34649a 100644 --- a/src/libsodium/include/sodium/utils.h +++ b/src/libsodium/include/sodium/utils.h @@ -35,6 +35,12 @@ int sodium_hex2bin(unsigned char * const bin, const size_t bin_maxlen, const char * const ignore, size_t * const bin_len, const char ** const hex_end); +SODIUM_EXPORT +int sodium_mlock(const void *addr, const size_t len); + +SODIUM_EXPORT +int sodium_munlock(const void *addr, const size_t len); + #ifdef __cplusplus } #endif diff --git a/src/libsodium/sodium/utils.c b/src/libsodium/sodium/utils.c index 75e74b08..fdf16390 100644 --- a/src/libsodium/sodium/utils.c +++ b/src/libsodium/sodium/utils.c @@ -9,6 +9,10 @@ #include #include +#ifdef HAVE_SYS_MMAN_H +# include +#endif + #include "utils.h" #include "randombytes.h" #ifdef _WIN32 @@ -152,3 +156,29 @@ sodium_hex2bin(unsigned char * const bin, const size_t bin_maxlen, } return ret; } + +int +sodium_mlock(const void *addr, const size_t len) +{ +#ifdef HAVE_MLOCK + return mlock(addr, len); +#elif defined(HAVE_VIRTUALLOCK) + return -(VirtualLock(addr, len) != 0); +#else + errno = ENOSYS; + return -1; +#endif +} + +int +sodium_munlock(const void *addr, const size_t len) +{ +#ifdef HAVE_MLOCK + return munlock(addr, len); +#elif defined(HAVE_VIRTUALLOCK) + return -(VirtualUnlock(addr, len) != 0); +#else + errno = ENOSYS; + return -1; +#endif +}