diff options
| author | vboxsync <vboxsync@cfe28804-0f27-0410-a406-dd0f0b0b656f> | 2014-07-08 17:50:10 +0000 |
|---|---|---|
| committer | vboxsync <vboxsync@cfe28804-0f27-0410-a406-dd0f0b0b656f> | 2014-07-08 17:50:10 +0000 |
| commit | 530b0f75513c5d14ffdb843d85a9bd09470ad441 (patch) | |
| tree | e05d56dd8237c4f94a4df89f5c103cca41a4a455 /src/VBox/Runtime/common/rand/rand.cpp | |
| parent | c084f6931868c9298c84fe0db4f1dfb632009f70 (diff) | |
| download | VirtualBox-svn-530b0f75513c5d14ffdb843d85a9bd09470ad441.tar.gz | |
SUPDrv-win.cpp: Use the RTTerm/RTOnce stuff to clean up that default random number generator instance the driver verifier is upset about (leak).
git-svn-id: https://www.virtualbox.org/svn/vbox/trunk@51941 cfe28804-0f27-0410-a406-dd0f0b0b656f
Diffstat (limited to 'src/VBox/Runtime/common/rand/rand.cpp')
| -rw-r--r-- | src/VBox/Runtime/common/rand/rand.cpp | 41 |
1 files changed, 32 insertions, 9 deletions
diff --git a/src/VBox/Runtime/common/rand/rand.cpp b/src/VBox/Runtime/common/rand/rand.cpp index bc228f7daa2..d0943d8da57 100644 --- a/src/VBox/Runtime/common/rand/rand.cpp +++ b/src/VBox/Runtime/common/rand/rand.cpp @@ -80,9 +80,32 @@ static DECLCALLBACK(int) rtRandInitOnce(void *pvUser) } +/** + * Termination counterpart to rtRandInitOnce. + * + * @returns IPRT status code. + * @param pvUser Ignored. + * @param fLazyCleanUpOk Set if we're terminating the process. + */ +static DECLCALLBACK(void) rtRandTermOnce(void *pvUser, bool fLazyCleanUpOk) +{ + if (!fLazyCleanUpOk) + { + RTRAND hRand = g_hRand; + g_hRand = NIL_RTRAND; + if (hRand != NIL_RTRAND) + { + int rc = RTRandAdvDestroy(hRand); + AssertRC(rc); + } + } + NOREF(pvUser); +} + + RTDECL(void) RTRandBytes(void *pv, size_t cb) RT_NO_THROW { - RTOnce(&g_rtRandOnce, rtRandInitOnce, NULL); + RTOnceEx(&g_rtRandOnce, rtRandInitOnce, rtRandTermOnce, NULL); RTRandAdvBytes(g_hRand, pv, cb); } RT_EXPORT_SYMBOL(RTRandBytes); @@ -90,7 +113,7 @@ RT_EXPORT_SYMBOL(RTRandBytes); RTDECL(uint32_t) RTRandU32Ex(uint32_t u32First, uint32_t u32Last) RT_NO_THROW { - RTOnce(&g_rtRandOnce, rtRandInitOnce, NULL); + RTOnceEx(&g_rtRandOnce, rtRandInitOnce, rtRandTermOnce, NULL); return RTRandAdvU32Ex(g_hRand, u32First, u32Last); } RT_EXPORT_SYMBOL(RTRandU32Ex); @@ -98,7 +121,7 @@ RT_EXPORT_SYMBOL(RTRandU32Ex); RTDECL(uint32_t) RTRandU32(void) RT_NO_THROW { - RTOnce(&g_rtRandOnce, rtRandInitOnce, NULL); + RTOnceEx(&g_rtRandOnce, rtRandInitOnce, rtRandTermOnce, NULL); return RTRandAdvU32(g_hRand); } RT_EXPORT_SYMBOL(RTRandU32); @@ -106,7 +129,7 @@ RT_EXPORT_SYMBOL(RTRandU32); RTDECL(int32_t) RTRandS32Ex(int32_t i32First, int32_t i32Last) RT_NO_THROW { - RTOnce(&g_rtRandOnce, rtRandInitOnce, NULL); + RTOnceEx(&g_rtRandOnce, rtRandInitOnce, rtRandTermOnce, NULL); return RTRandAdvS32Ex(g_hRand, i32First, i32Last); } RT_EXPORT_SYMBOL(RTRandS32Ex); @@ -114,7 +137,7 @@ RT_EXPORT_SYMBOL(RTRandS32Ex); RTDECL(int32_t) RTRandS32(void) RT_NO_THROW { - RTOnce(&g_rtRandOnce, rtRandInitOnce, NULL); + RTOnceEx(&g_rtRandOnce, rtRandInitOnce, rtRandTermOnce, NULL); return RTRandAdvS32(g_hRand); } RT_EXPORT_SYMBOL(RTRandS32); @@ -122,7 +145,7 @@ RT_EXPORT_SYMBOL(RTRandS32); RTDECL(uint64_t) RTRandU64Ex(uint64_t u64First, uint64_t u64Last) RT_NO_THROW { - RTOnce(&g_rtRandOnce, rtRandInitOnce, NULL); + RTOnceEx(&g_rtRandOnce, rtRandInitOnce, rtRandTermOnce, NULL); return RTRandAdvU64Ex(g_hRand, u64First, u64Last); } RT_EXPORT_SYMBOL(RTRandU64Ex); @@ -130,7 +153,7 @@ RT_EXPORT_SYMBOL(RTRandU64Ex); RTDECL(uint64_t) RTRandU64(void) RT_NO_THROW { - RTOnce(&g_rtRandOnce, rtRandInitOnce, NULL); + RTOnceEx(&g_rtRandOnce, rtRandInitOnce, rtRandTermOnce, NULL); return RTRandAdvU64(g_hRand); } RT_EXPORT_SYMBOL(RTRandU64); @@ -138,7 +161,7 @@ RT_EXPORT_SYMBOL(RTRandU64); RTDECL(int64_t) RTRandS64Ex(int64_t i64First, int64_t i64Last) RT_NO_THROW { - RTOnce(&g_rtRandOnce, rtRandInitOnce, NULL); + RTOnceEx(&g_rtRandOnce, rtRandInitOnce, rtRandTermOnce, NULL); return RTRandAdvS64Ex(g_hRand, i64First, i64Last); } RT_EXPORT_SYMBOL(RTRandS64Ex); @@ -146,7 +169,7 @@ RT_EXPORT_SYMBOL(RTRandS64Ex); RTDECL(int64_t) RTRandS64(void) RT_NO_THROW { - RTOnce(&g_rtRandOnce, rtRandInitOnce, NULL); + RTOnceEx(&g_rtRandOnce, rtRandInitOnce, rtRandTermOnce, NULL); return RTRandAdvS32(g_hRand); } RT_EXPORT_SYMBOL(RTRandS64); |
