diff options
Diffstat (limited to 'cpp/src/Glacier2CryptPermissionsVerifier/CryptPermissionsVerifierI.cpp')
-rw-r--r-- | cpp/src/Glacier2CryptPermissionsVerifier/CryptPermissionsVerifierI.cpp | 37 |
1 files changed, 36 insertions, 1 deletions
diff --git a/cpp/src/Glacier2CryptPermissionsVerifier/CryptPermissionsVerifierI.cpp b/cpp/src/Glacier2CryptPermissionsVerifier/CryptPermissionsVerifierI.cpp index 9bc1ea38a5c..e3387c4667d 100644 --- a/cpp/src/Glacier2CryptPermissionsVerifier/CryptPermissionsVerifierI.cpp +++ b/cpp/src/Glacier2CryptPermissionsVerifier/CryptPermissionsVerifierI.cpp @@ -18,6 +18,8 @@ #if defined(__GLIBC__) || defined(_AIX) # include <crypt.h> +#elif defined(__FreeBSD__) +# include <unistd.h> #elif defined(__APPLE__) # include <CoreFoundation/CoreFoundation.h> # include <Security/Security.h> @@ -34,6 +36,34 @@ using namespace Glacier2; namespace { +#if defined(__FreeBSD__) && !defined(__GLIBC__) + +// +// FreeBSD crypt is no reentrat we use this global mutex +// to serialize access. +// +IceUtil::Mutex* _staticMutex = 0; + +class Init +{ +public: + + Init() + { + _staticMutex = new IceUtil::Mutex; + } + + ~Init() + { + delete _staticMutex; + _staticMutex = 0; + } +}; + +Init init; +#endif + + class CryptPermissionsVerifierI : public PermissionsVerifier { public: @@ -142,7 +172,7 @@ CryptPermissionsVerifierI::checkPermissions(const string& userId, const string& { return false; } -#if defined(__GLIBC__) +#if defined(__GLIBC__) || defined(__FreeBSD__) size_t i = p->second.rfind('$'); string salt; if(i == string::npos) @@ -164,9 +194,14 @@ CryptPermissionsVerifierI::checkPermissions(const string& userId, const string& return false; } } +# if defined(__GLIBC__) struct crypt_data data; data.initialized = 0; return p->second == crypt_r(password.c_str(), salt.c_str(), &data); +# else + IceUtilInternal::MutexPtrLock<IceUtil::Mutex> lock(_staticMutex); + return p->second == crypt(password.c_str(), salt.c_str()) +# endif #elif defined(__APPLE__) || defined(_WIN32) // // Pbkdf2 string format: |