Reactos

[NTOS:EX] Fix query of SystemFirmwareTableInformation

+9 -7
+9 -7
ntoskrnl/ex/sysinfo.c
··· 2727 2727 { 2728 2728 PSYSTEM_FIRMWARE_TABLE_INFORMATION SysFirmwareInfo = (PSYSTEM_FIRMWARE_TABLE_INFORMATION)Buffer; 2729 2729 NTSTATUS Status = STATUS_SUCCESS; 2730 - ULONG InputBufSize; 2730 + ULONG DataBufSize; 2731 2731 ULONG DataSize = 0; 2732 2732 ULONG TableCount = 0; 2733 2733 ··· 2742 2742 return STATUS_INFO_LENGTH_MISMATCH; 2743 2743 } 2744 2744 2745 - InputBufSize = SysFirmwareInfo->TableBufferLength; 2745 + DataBufSize = Size - *ReqSize; 2746 2746 switch (SysFirmwareInfo->ProviderSignature) 2747 2747 { 2748 2748 /* ··· 2772 2772 if (SysFirmwareInfo->Action == SystemFirmwareTable_Enumerate) 2773 2773 { 2774 2774 DataSize = TableCount * sizeof(ULONG); 2775 - if (DataSize <= InputBufSize) 2775 + if (DataSize <= DataBufSize) 2776 2776 { 2777 2777 *(ULONG *)SysFirmwareInfo->TableBuffer = 0; 2778 2778 } 2779 2779 } 2780 2780 else if (SysFirmwareInfo->Action == SystemFirmwareTable_Get 2781 - && DataSize <= InputBufSize) 2781 + && DataSize <= DataBufSize) 2782 2782 { 2783 - Status = ExpGetRawSMBiosTable(SysFirmwareInfo->TableBuffer, &DataSize, InputBufSize); 2783 + Status = ExpGetRawSMBiosTable(SysFirmwareInfo->TableBuffer, &DataSize, DataBufSize); 2784 2784 } 2785 2785 SysFirmwareInfo->TableBufferLength = DataSize; 2786 + *ReqSize += DataSize; 2786 2787 } 2787 2788 break; 2788 2789 } ··· 2790 2791 { 2791 2792 DPRINT1("SystemFirmwareTableInformation: Unsupported provider (0x%x)\n", 2792 2793 SysFirmwareInfo->ProviderSignature); 2793 - Status = STATUS_ILLEGAL_FUNCTION; 2794 + *ReqSize = 0; 2795 + Status = STATUS_NOT_IMPLEMENTED; 2794 2796 } 2795 2797 } 2796 2798 ··· 2801 2803 case SystemFirmwareTable_Enumerate: 2802 2804 case SystemFirmwareTable_Get: 2803 2805 { 2804 - if (SysFirmwareInfo->TableBufferLength > InputBufSize) 2806 + if (SysFirmwareInfo->TableBufferLength > DataBufSize) 2805 2807 { 2806 2808 Status = STATUS_BUFFER_TOO_SMALL; 2807 2809 }