setupapi: Duplicate behaviour of native SetupGetInfInformation with NULL ReturnBuffer and certain ReturnBufferSizes

Frank Richter frank.richter at gmail.com
Fri Sep 22 06:17:46 CDT 2006


SetupGetInfInformation does not set an error of ERROR_INVALID_PARAMETER
for all cases of ReturnBuffer == NULL and ReturnBufferSize != 0: If
ReturnBufferSize is smaller than the required buffer size, the function
call actually succeeds. Added test for this behaviour and changed
SetupGetInfInformation accordingly.

-------------- next part --------------
>From ba1a618a889be3c706c6e5c5f0809c2f3fe961db Mon Sep 17 00:00:00 2001
From: Frank Richter frank.richter at gmail.com <frank.richter at gmail.com>
Date: Fri, 22 Sep 2006 13:14:56 +0200
Subject: [PATCH] setupapi: Duplicate behaviour of native SetupGetInfInformation with NULL ReturnBuffer and certain ReturnBufferSizes
---
 dlls/setupapi/query.c       |   16 +++++++++-------
 dlls/setupapi/tests/query.c |   14 +++++++++++++-
 2 files changed, 22 insertions(+), 8 deletions(-)

diff --git a/dlls/setupapi/query.c b/dlls/setupapi/query.c
index fd56f96..b940402 100644
--- a/dlls/setupapi/query.c
+++ b/dlls/setupapi/query.c
@@ -130,6 +130,7 @@ BOOL WINAPI SetupGetInfInformationW(LPCV
 {
     HINF inf;
     BOOL ret;
+    DWORD infSize;
 
     TRACE("(%p, %ld, %p, %ld, %p)\n", InfSpec, SearchControl, ReturnBuffer,
            ReturnBufferSize, RequiredSize);
@@ -144,12 +145,6 @@ BOOL WINAPI SetupGetInfInformationW(LPCV
         return FALSE;
     }
 
-    if (!ReturnBuffer && ReturnBufferSize)
-    {
-        SetLastError(ERROR_INVALID_PARAMETER);
-        return FALSE;
-    }
-
     switch (SearchControl)
     {
         case INFINFO_INF_SPEC_IS_HINF:
@@ -181,7 +176,14 @@ BOOL WINAPI SetupGetInfInformationW(LPCV
         return FALSE;
     }
 
-    ret = fill_inf_info(inf, ReturnBuffer, ReturnBufferSize, RequiredSize);
+    ret = fill_inf_info(inf, ReturnBuffer, ReturnBufferSize, &infSize);
+    if (!ReturnBuffer && (ReturnBufferSize >= infSize))
+    {
+        SetLastError(ERROR_INVALID_PARAMETER);
+        ret = FALSE;
+    }
+    if (RequiredSize) *RequiredSize = infSize;
+
 
     if (SearchControl >= INFINFO_INF_NAME_IS_ABSOLUTE)
         SetupCloseInfFile(inf);
diff --git a/dlls/setupapi/tests/query.c b/dlls/setupapi/tests/query.c
index e823e7d..0ac23da 100644
--- a/dlls/setupapi/tests/query.c
+++ b/dlls/setupapi/tests/query.c
@@ -177,13 +177,25 @@ static void test_SetupGetInfInformation(
     ok(ret == TRUE, "Expected SetupGetInfInformation to succeed\n");
     ok(size != 0xdeadbeef, "Expected a valid size on return\n");
 
-    /* set ReturnBuffer to NULL and ReturnBufferSize to non-zero */
+    /* set ReturnBuffer to NULL and ReturnBufferSize to non-zero value 'size' */
     SetLastError(0xbeefcafe);
     ret = pSetupGetInfInformationA(inf_filename, INFINFO_INF_NAME_IS_ABSOLUTE, NULL, size, &size);
     ok(ret == FALSE, "Expected SetupGetInfInformation to fail\n");
     ok(GetLastError() == ERROR_INVALID_PARAMETER,
        "Expected ERROR_INVALID_PARAMETER, got %ld\n", GetLastError());
 
+    /* set ReturnBuffer to NULL and ReturnBufferSize to non-zero value 'size-1' */
+    ret = pSetupGetInfInformationA(inf_filename, INFINFO_INF_NAME_IS_ABSOLUTE, NULL, size-1, &size);
+    ok(ret == TRUE, "Expected SetupGetInfInformation to succeed\n");
+
+    /* some tests for behaviour with a NULL RequiredSize pointer */
+    ret = pSetupGetInfInformationA(inf_filename, INFINFO_INF_NAME_IS_ABSOLUTE, NULL, 0, NULL);
+    ok(ret == TRUE, "Expected SetupGetInfInformation to succeed\n");
+    ret = pSetupGetInfInformationA(inf_filename, INFINFO_INF_NAME_IS_ABSOLUTE, NULL, size - 1, NULL);
+    ok(ret == TRUE, "Expected SetupGetInfInformation to succeed\n");
+    ret = pSetupGetInfInformationA(inf_filename, INFINFO_INF_NAME_IS_ABSOLUTE, NULL, size, NULL);
+    ok(ret == FALSE, "Expected SetupGetInfInformation to fail\n");
+
     info = HeapAlloc(GetProcessHeap(), 0, size);
 
     /* try valid ReturnBuffer but too small size */
-- 
1.4.1.1



More information about the wine-patches mailing list