https://git.reactos.org/?p=reactos.git;a=commitdiff;h=29b2fdcc4d3f85e1b95d321f2d02b4278d904828

commit 29b2fdcc4d3f85e1b95d321f2d02b4278d904828
Author:     Hermès Bélusca-Maïto <[email protected]>
AuthorDate: Sat Oct 20 19:30:59 2018 +0200
Commit:     Hermès Bélusca-Maïto <[email protected]>
CommitDate: Sat Oct 20 19:52:34 2018 +0200

    [NTOS:CM] Minor fixes.
    
    - Validate the information class parameter in NtQueryValueKey().
    - Call the post-callback in NtSetValueKey() only if the callback
      has been registered and the CmSetValueKey() call is executed.
---
 ntoskrnl/config/ntapi.c | 21 +++++++++++++++++----
 1 file changed, 17 insertions(+), 4 deletions(-)

diff --git a/ntoskrnl/config/ntapi.c b/ntoskrnl/config/ntapi.c
index ee6b57c805..2aa6f47cb1 100644
--- a/ntoskrnl/config/ntapi.c
+++ b/ntoskrnl/config/ntapi.c
@@ -533,10 +533,23 @@ NtQueryValueKey(IN HANDLE KeyHandle,
     REG_QUERY_VALUE_KEY_INFORMATION QueryValueKeyInfo;
     REG_POST_OPERATION_INFORMATION PostOperationInfo;
     UNICODE_STRING ValueNameCopy = *ValueName;
+
     PAGED_CODE();
+
     DPRINT("NtQueryValueKey() KH 0x%p, VN '%wZ', KVIC %d, Length %lu\n",
         KeyHandle, ValueName, KeyValueInformationClass, Length);
 
+    /* Reject classes we don't know about */
+    if ((KeyValueInformationClass != KeyValueBasicInformation)       &&
+        (KeyValueInformationClass != KeyValueFullInformation)        &&
+        (KeyValueInformationClass != KeyValuePartialInformation)     &&
+        (KeyValueInformationClass != KeyValueFullInformationAlign64) &&
+        (KeyValueInformationClass != KeyValuePartialInformationAlign64))
+    {
+        /* Fail */
+        return STATUS_INVALID_PARAMETER;
+    }
+
     /* Verify that the handle is valid and is a registry key */
     Status = ObReferenceObjectByHandle(KeyHandle,
                                        KEY_QUERY_VALUE,
@@ -723,11 +736,11 @@ NtSetValueKey(IN HANDLE KeyHandle,
                                Type,
                                Data,
                                DataSize);
-    }
 
-    /* Do the post-callback */
-    PostOperationInfo.Status = Status;
-    CmiCallRegisteredCallbacks(RegNtPostSetValueKey, &PostOperationInfo);
+        /* Do the post-callback */
+        PostOperationInfo.Status = Status;
+        CmiCallRegisteredCallbacks(RegNtPostSetValueKey, &PostOperationInfo);
+    }
 
 end:
     /* Dereference and return status */

Reply via email to