Paul Vriens : setupapi: Fix for SetupGetIntField, with tests.
Alexandre Julliard
julliard at winehq.org
Tue Apr 1 06:51:32 CDT 2008
Module: wine
Branch: master
Commit: ebec0a969761f083259ffa7f7caa3b3a4efb889f
URL: http://source.winehq.org/git/wine.git/?a=commit;h=ebec0a969761f083259ffa7f7caa3b3a4efb889f
Author: Paul Vriens <paul.vriens.wine at gmail.com>
Date: Mon Mar 31 19:51:21 2008 +0200
setupapi: Fix for SetupGetIntField, with tests.
---
dlls/setupapi/parser.c | 21 +++++++++-----
dlls/setupapi/tests/parser.c | 62 ++++++++++++++++++++++++++++++++++++++++++
2 files changed, 75 insertions(+), 8 deletions(-)
diff --git a/dlls/setupapi/parser.c b/dlls/setupapi/parser.c
index f6de4ed..a00e068 100644
--- a/dlls/setupapi/parser.c
+++ b/dlls/setupapi/parser.c
@@ -1711,21 +1711,26 @@ BOOL WINAPI SetupGetIntField( PINFCONTEXT context, DWORD index, PINT result )
char *end, *buffer = localbuff;
DWORD required;
INT res;
- BOOL ret = FALSE;
+ BOOL ret;
- if (!SetupGetStringFieldA( context, index, localbuff, sizeof(localbuff), &required ))
+ if (!(ret = SetupGetStringFieldA( context, index, localbuff, sizeof(localbuff), &required )))
{
if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) return FALSE;
if (!(buffer = HeapAlloc( GetProcessHeap(), 0, required ))) return FALSE;
- if (!SetupGetStringFieldA( context, index, buffer, required, NULL )) goto done;
+ if (!(ret = SetupGetStringFieldA( context, index, buffer, required, NULL ))) goto done;
}
- res = strtol( buffer, &end, 0 );
- if (end != buffer && !*end)
+ /* The call to SetupGetStringFieldA succeeded. If buffer is empty we have an optional field */
+ if (!*buffer) *result = 0;
+ else
{
- *result = res;
- ret = TRUE;
+ res = strtol( buffer, &end, 0 );
+ if (end != buffer && !*end) *result = res;
+ else
+ {
+ SetLastError( ERROR_INVALID_DATA );
+ ret = FALSE;
+ }
}
- else SetLastError( ERROR_INVALID_DATA );
done:
if (buffer != localbuff) HeapFree( GetProcessHeap(), 0, buffer );
diff --git a/dlls/setupapi/tests/parser.c b/dlls/setupapi/tests/parser.c
index d49c37f..6341222 100644
--- a/dlls/setupapi/tests/parser.c
+++ b/dlls/setupapi/tests/parser.c
@@ -475,6 +475,67 @@ static void test_pSetupGetField(void)
SetupCloseInfFile( hinf );
}
+static void test_SetupGetIntField(void)
+{
+ static const struct
+ {
+ const char *key;
+ const char *fields;
+ DWORD index;
+ INT value;
+ DWORD err;
+ } keys[] =
+ {
+ /* key fields index expected int errorcode */
+ { "Key=", "48", 1, 48, ERROR_SUCCESS },
+ { "Key=", "48", 0, -1, ERROR_INVALID_DATA },
+ { "123=", "48", 0, 123, ERROR_SUCCESS },
+ { "Key=", "0x4", 1, 4, ERROR_SUCCESS },
+ { "Key=", "Field1", 1, -1, ERROR_INVALID_DATA },
+ { "Key=", "Field1,34", 2, 34, ERROR_SUCCESS },
+ { "Key=", "Field1,,Field3", 2, 0, ERROR_SUCCESS },
+ { "Key=", "Field1,", 2, 0, ERROR_SUCCESS }
+ };
+ unsigned int i;
+
+ for (i = 0; i < sizeof(keys)/sizeof(keys[0]); i++)
+ {
+ HINF hinf;
+ char buffer[MAX_INF_STRING_LENGTH];
+ INFCONTEXT context;
+ UINT err;
+ BOOL retb;
+ INT intfield;
+
+ strcpy( buffer, STD_HEADER "[TestSection]\n" );
+ strcat( buffer, keys[i].key );
+ strcat( buffer, keys[i].fields );
+ hinf = test_file_contents( buffer, &err);
+ ok( hinf != NULL, "Expected valid INF file\n" );
+
+ SetupFindFirstLineA( hinf, "TestSection", "Key", &context );
+ SetLastError( 0xdeadbeef );
+ intfield = -1;
+ retb = SetupGetIntField( &context, keys[i].index, &intfield );
+ if ( keys[i].err == ERROR_SUCCESS )
+ {
+ ok( retb, "Expected success\n" );
+ ok( GetLastError() == ERROR_SUCCESS ||
+ GetLastError() == 0xdeadbeef /* win9x, NT4 */,
+ "Expected ERROR_SUCCESS or 0xdeadbeef, got %u\n", GetLastError() );
+ }
+ else
+ {
+ ok( !retb, "Expected failure\n" );
+ ok( GetLastError() == keys[i].err,
+ "Expected %d, got %u\n", keys[i].err, GetLastError() );
+ }
+ ok( intfield == keys[i].value, "Expected %d, got %d\n", keys[i].value, intfield );
+
+ SetupCloseInfFile( hinf );
+ }
+}
+
static void test_GLE(void)
{
static const char *inf =
@@ -597,6 +658,7 @@ START_TEST(parser)
test_key_names();
test_close_inf_file();
test_pSetupGetField();
+ test_SetupGetIntField();
test_GLE();
DeleteFileA( tmpfilename );
}
More information about the wine-cvs
mailing list