From 9844effa41045980923a3dad285c706325ec5803 Mon Sep 17 00:00:00 2001 From: "Carl J. Bialorucki" Date: Thu, 8 Jan 2026 16:21:53 -0600 Subject: [PATCH] [ADVAPI32] Add SEH handling to some crypt functions This fixes several crashes when running the advapi32 winetest from wine-10.0 --- dll/win32/advapi32/wine/crypt.c | 65 +++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/dll/win32/advapi32/wine/crypt.c b/dll/win32/advapi32/wine/crypt.c index 27e70585731..84d5a2ffa7f 100644 --- a/dll/win32/advapi32/wine/crypt.c +++ b/dll/win32/advapi32/wine/crypt.c @@ -622,6 +622,10 @@ BOOL WINAPI CryptContextAddRef (HCRYPTPROV hProv, DWORD *pdwReserved, DWORD dwFl return FALSE; } +#ifdef __REACTOS__ + _SEH2_TRY + { +#endif if (pProv->dwMagic != MAGIC_CRYPTPROV) { SetLastError(ERROR_INVALID_PARAMETER); @@ -629,6 +633,15 @@ BOOL WINAPI CryptContextAddRef (HCRYPTPROV hProv, DWORD *pdwReserved, DWORD dwFl } InterlockedIncrement(&pProv->refcount); +#ifdef __REACTOS__ + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + SetLastError(ERROR_INVALID_PARAMETER); + _SEH2_YIELD(return FALSE); + } + _SEH2_END; +#endif return TRUE; } @@ -746,12 +759,25 @@ BOOL WINAPI CryptCreateHash (HCRYPTPROV hProv, ALG_ID Algid, HCRYPTKEY hKey, TRACE("(0x%lx, 0x%x, 0x%lx, %08x, %p)\n", hProv, Algid, hKey, dwFlags, phHash); +#ifdef __REACTOS__ + _SEH2_TRY + { +#endif if (!prov || !phHash || prov->dwMagic != MAGIC_CRYPTPROV || (key && key->dwMagic != MAGIC_CRYPTKEY)) { SetLastError(ERROR_INVALID_PARAMETER); return FALSE; } +#ifdef __REACTOS__ + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + SetLastError(ERROR_INVALID_PARAMETER); + _SEH2_YIELD(return FALSE); + } + _SEH2_END; +#endif if (dwFlags) { SetLastError(NTE_BAD_FLAGS); @@ -806,6 +832,10 @@ BOOL WINAPI CryptDecrypt (HCRYPTKEY hKey, HCRYPTHASH hHash, BOOL Final, TRACE("(0x%lx, 0x%lx, %d, %08x, %p, %p)\n", hKey, hHash, Final, dwFlags, pbData, pdwDataLen); +#ifdef __REACTOS__ + _SEH2_TRY + { +#endif if (!key || !pbData || !pdwDataLen || !key->pProvider || key->dwMagic != MAGIC_CRYPTKEY || key->pProvider->dwMagic != MAGIC_CRYPTPROV) @@ -817,6 +847,15 @@ BOOL WINAPI CryptDecrypt (HCRYPTKEY hKey, HCRYPTHASH hHash, BOOL Final, prov = key->pProvider; return prov->pFuncs->pCPDecrypt(prov->hPrivate, key->hPrivate, hash ? hash->hPrivate : 0, Final, dwFlags, pbData, pdwDataLen); +#ifdef __REACTOS__ + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + SetLastError(ERROR_INVALID_PARAMETER); + _SEH2_YIELD(return FALSE); + } + _SEH2_END; +#endif } /****************************************************************************** @@ -1099,6 +1138,10 @@ BOOL WINAPI CryptEncrypt (HCRYPTKEY hKey, HCRYPTHASH hHash, BOOL Final, TRACE("(0x%lx, 0x%lx, %d, %08x, %p, %p, %d)\n", hKey, hHash, Final, dwFlags, pbData, pdwDataLen, dwBufLen); +#ifdef __REACTOS__ + _SEH2_TRY + { +#endif if (!key || !pdwDataLen || !key->pProvider || key->dwMagic != MAGIC_CRYPTKEY || key->pProvider->dwMagic != MAGIC_CRYPTPROV) { @@ -1109,6 +1152,15 @@ BOOL WINAPI CryptEncrypt (HCRYPTKEY hKey, HCRYPTHASH hHash, BOOL Final, prov = key->pProvider; return prov->pFuncs->pCPEncrypt(prov->hPrivate, key->hPrivate, hash ? hash->hPrivate : 0, Final, dwFlags, pbData, pdwDataLen, dwBufLen); +#ifdef __REACTOS__ + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + SetLastError(ERROR_INVALID_PARAMETER); + _SEH2_YIELD(return FALSE); + } + _SEH2_END; +#endif } /****************************************************************************** @@ -1421,6 +1473,10 @@ BOOL WINAPI CryptExportKey (HCRYPTKEY hKey, HCRYPTKEY hExpKey, DWORD dwBlobType, TRACE("(0x%lx, 0x%lx, %d, %08x, %p, %p)\n", hKey, hExpKey, dwBlobType, dwFlags, pbData, pdwDataLen); +#ifdef __REACTOS__ + _SEH2_TRY + { +#endif if (!key || !pdwDataLen || !key->pProvider || key->dwMagic != MAGIC_CRYPTKEY || key->pProvider->dwMagic != MAGIC_CRYPTPROV) { @@ -1431,6 +1487,15 @@ BOOL WINAPI CryptExportKey (HCRYPTKEY hKey, HCRYPTKEY hExpKey, DWORD dwBlobType, prov = key->pProvider; return prov->pFuncs->pCPExportKey(prov->hPrivate, key->hPrivate, expkey ? expkey->hPrivate : 0, dwBlobType, dwFlags, pbData, pdwDataLen); +#ifdef __REACTOS__ + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + SetLastError(ERROR_INVALID_PARAMETER); + _SEH2_YIELD(return FALSE); + } + _SEH2_END; +#endif } /******************************************************************************