Fix special case in SetupGetLineTextA/W and SetupGetStringFieldA/W when Buffer is...
authorHervé Poussineau <hpoussin@reactos.org>
Tue, 23 Aug 2005 17:38:14 +0000 (17:38 +0000)
committerHervé Poussineau <hpoussin@reactos.org>
Tue, 23 Aug 2005 17:38:14 +0000 (17:38 +0000)
Fixes bug #724, spotted by GvG
Do according changes in SetupDiBuildDriverInfoList

svn path=/trunk/; revision=17483

reactos/lib/setupapi/devinst.c
reactos/lib/setupapi/parser.c

index 6c3b443..2c87904 100644 (file)
@@ -3564,8 +3564,9 @@ SetupDiBuildDriverInfoList(
                         0, /* Field index */
                         NULL, 0,
                         &RequiredSize);
-                    if (!Result && GetLastError() == ERROR_INSUFFICIENT_BUFFER)
+                    if (Result)
                     {
+                        /* We got the needed size for the buffer */
                         ManufacturerName = HeapAlloc(GetProcessHeap(), 0, RequiredSize * sizeof(WCHAR));
                         if (!ManufacturerName)
                         {
@@ -3583,8 +3584,9 @@ SetupDiBuildDriverInfoList(
                         1, /* Field index */
                         NULL, 0,
                         &RequiredSize);
-                    if (!Result && GetLastError() == ERROR_INSUFFICIENT_BUFFER)
+                    if (Result)
                     {
+                        /* We got the needed size for the buffer */
                         ManufacturerSection = HeapAlloc(GetProcessHeap(), 0, RequiredSize * sizeof(WCHAR));
                         if (!ManufacturerSection)
                         {
index e14e7fb..387606a 100644 (file)
@@ -1523,13 +1523,13 @@ BOOL WINAPI SetupGetLineTextW( PINFCONTEXT context, HINF hinf, PCWSTR section_na
         total += PARSER_string_substW( file, field->text, NULL, 0 ) + 1;
 
     if (required) *required = total;
-    if (total > size)
-    {
-        SetLastError( ERROR_INSUFFICIENT_BUFFER );
-        return FALSE;
-    }
     if (buffer)
     {
+        if (total > size)
+        {
+            SetLastError( ERROR_INSUFFICIENT_BUFFER );
+            return FALSE;
+        }
         for (i = 0, field = &file->fields[line->first_field]; i < line->nb_fields; i++, field++)
         {
             unsigned int len = PARSER_string_substW( file, field->text, buffer, size );
@@ -1574,13 +1574,13 @@ BOOL WINAPI SetupGetLineTextA( PINFCONTEXT context, HINF hinf, PCSTR section_nam
         total += PARSER_string_substA( file, field->text, NULL, 0 ) + 1;
 
     if (required) *required = total;
-    if (total > size)
-    {
-        SetLastError( ERROR_INSUFFICIENT_BUFFER );
-        return FALSE;
-    }
     if (buffer)
     {
+        if (total > size)
+        {
+            SetLastError( ERROR_INSUFFICIENT_BUFFER );
+            return FALSE;
+        }
         for (i = 0, field = &file->fields[line->first_field]; i < line->nb_fields; i++, field++)
         {
             unsigned int len = PARSER_string_substA( file, field->text, buffer, size );
@@ -1619,13 +1619,13 @@ BOOL WINAPI SetupGetStringFieldA( PINFCONTEXT context, DWORD index, PSTR buffer,
     if (!field) return FALSE;
     len = PARSER_string_substA( file, field->text, NULL, 0 );
     if (required) *required = len + 1;
-    if (size <= len)
-    {
-        SetLastError( ERROR_INSUFFICIENT_BUFFER );
-        return FALSE;
-    }
     if (buffer)
     {
+        if (size <= len)
+        {
+            SetLastError( ERROR_INSUFFICIENT_BUFFER );
+            return FALSE;
+        }
         PARSER_string_substA( file, field->text, buffer, size );
 
         TRACE( "context %p/%p/%d/%d index %ld returning %s\n",
@@ -1650,13 +1650,13 @@ BOOL WINAPI SetupGetStringFieldW( PINFCONTEXT context, DWORD index, PWSTR buffer
     if (!field) return FALSE;
     len = PARSER_string_substW( file, field->text, NULL, 0 );
     if (required) *required = len + 1;
-    if (size <= len)
-    {
-        SetLastError( ERROR_INSUFFICIENT_BUFFER );
-        return FALSE;
-    }
     if (buffer)
     {
+        if (size <= len)
+        {
+            SetLastError( ERROR_INSUFFICIENT_BUFFER );
+            return FALSE;
+        }
         PARSER_string_substW( file, field->text, buffer, size );
 
         TRACE( "context %p/%p/%d/%d index %ld returning %s\n",