From: Chris Denton <chris@chrisdenton.dev> ProcessPrng takes a SIZE_T argument for its length whereas RtlGenRandom takes a ULONG, which may be smaller. --- configure | 3 +- dlls/bcryptprimitives/main.c | 17 +++++++++- dlls/bcryptprimitives/tests/Makefile.in | 4 +++ .../bcryptprimitives/tests/bcryptprimitives.c | 34 +++++++++++++++++++ 4 files changed, 55 insertions(+), 3 deletions(-) create mode 100644 dlls/bcryptprimitives/tests/Makefile.in create mode 100644 dlls/bcryptprimitives/tests/bcryptprimitives.c diff --git a/configure b/configure index f632f8e8b0a..e8fb9f92ae8 100755 --- a/configure +++ b/configure @@ -22401,6 +22401,7 @@ wine_fn_config_makefile dlls/bcp47langs/tests enable_tests wine_fn_config_makefile dlls/bcrypt enable_bcrypt wine_fn_config_makefile dlls/bcrypt/tests enable_tests wine_fn_config_makefile dlls/bcryptprimitives enable_bcryptprimitives +wine_fn_config_makefile dlls/bcryptprimitives/tests enable_tests wine_fn_config_makefile dlls/bluetoothapis enable_bluetoothapis wine_fn_config_makefile dlls/bluetoothapis/tests enable_tests wine_fn_config_makefile dlls/browseui enable_browseui @@ -25051,5 +25052,3 @@ IFS="$ac_save_IFS" printf "%s\n" " $as_me: Finished. Do '${MAKE-make}' to compile Wine. " >&6 - - diff --git a/dlls/bcryptprimitives/main.c b/dlls/bcryptprimitives/main.c index 6562d672389..689f213d112 100644 --- a/dlls/bcryptprimitives/main.c +++ b/dlls/bcryptprimitives/main.c @@ -17,11 +17,26 @@ */ #include <stdarg.h> +#include <limits.h> + #include "windef.h" #include "winbase.h" #include "ntsecapi.h" BOOL WINAPI ProcessPrng(BYTE *data, SIZE_T size) { - return RtlGenRandom(data, size); + while (size) + { + SIZE_T len = min( size, (SIZE_T)ULONG_MAX ); + + if (!RtlGenRandom( data, len )) + { + /* This should be unreachable */ + return FALSE; + } + + data += len; + size -= len; + } + return TRUE; } diff --git a/dlls/bcryptprimitives/tests/Makefile.in b/dlls/bcryptprimitives/tests/Makefile.in new file mode 100644 index 00000000000..50440ab7988 --- /dev/null +++ b/dlls/bcryptprimitives/tests/Makefile.in @@ -0,0 +1,4 @@ +TESTDLL = bcryptprimitives.dll + +SOURCES = \ + bcryptprimitives.c diff --git a/dlls/bcryptprimitives/tests/bcryptprimitives.c b/dlls/bcryptprimitives/tests/bcryptprimitives.c new file mode 100644 index 00000000000..d3c8f774d7f --- /dev/null +++ b/dlls/bcryptprimitives/tests/bcryptprimitives.c @@ -0,0 +1,34 @@ +#include <stdlib.h> +#include <limits.h> +#include "wine/test.h" + +static BOOL (WINAPI *pProcessPrng)(BYTE *data, SIZE_T size); + +static void test_ProcessPrng(void) +{ + SIZE_T size = (SIZE_T)ULONG_MAX * 2; + /* This is a very large allocation that may well fail. */ + BYTE* buf = malloc(size); + if (buf) { + BOOL ret = pProcessPrng(buf, size); + ok(ret == TRUE, "Expected ProcessPrng to return TRUE, got %d\n", ret); + free(buf); + } +} + +START_TEST(bcryptprimitives) +{ + HMODULE module; + + module = LoadLibraryA("bcryptprimitives.dll"); + if (!module) + { + win_skip("bcryptprimitives.dll not found\n"); + return; + } + pProcessPrng = (void *)GetProcAddress(module, "ProcessPrng"); + + test_ProcessPrng(); + + FreeLibrary(module); +} -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10187