Author: fireball
Date: Thu Apr 14 09:57:08 2011
New Revision: 51333

URL: http://svn.reactos.org/svn/reactos?rev=51333&view=rev
Log:
[RTL]
- Properly check parameters in RtlFindActivationContextSectionString. Almost 
the same as Wine did, but factored out into a standalone function, improved 
undocumented flags checks and allowing null data pointer in certain cases.

Modified:
    trunk/reactos/lib/rtl/actctx.c

Modified: trunk/reactos/lib/rtl/actctx.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/lib/rtl/actctx.c?rev=51333&r1=51332&r2=51333&view=diff
==============================================================================
--- trunk/reactos/lib/rtl/actctx.c [iso-8859-1] (original)
+++ trunk/reactos/lib/rtl/actctx.c [iso-8859-1] Thu Apr 14 09:57:08 2011
@@ -2667,30 +2667,48 @@
     return STATUS_SUCCESS;
 }
 
+#define FIND_ACTCTX_RETURN_FLAGS 0x00000002
+#define FIND_ACTCTX_RETURN_ASSEMBLY_METADATA 0x00000004
+#define FIND_ACTCTX_VALID_MASK (FIND_ACTCTX_SECTION_KEY_RETURN_HACTCTX | 
FIND_ACTCTX_RETURN_FLAGS | FIND_ACTCTX_RETURN_ASSEMBLY_METADATA)
+
+NTSTATUS
+NTAPI
+RtlpFindActivationContextSection_CheckParameters( ULONG flags, const GUID 
*guid, ULONG section_kind,
+                                                  UNICODE_STRING 
*section_name, PACTCTX_SECTION_KEYED_DATA data )
+{
+    /* Check general parameter combinations */
+    if (!section_name ||
+        (flags & ~FIND_ACTCTX_VALID_MASK) ||
+        ((flags & FIND_ACTCTX_VALID_MASK) && !data) ||
+        (data && data->cbSize < offsetof(ACTCTX_SECTION_KEYED_DATA, 
ulAssemblyRosterIndex)))
+    {
+        DPRINT1("invalid parameter\n");
+        return STATUS_INVALID_PARAMETER;
+    }
+
+    /* TODO */
+    if (flags & FIND_ACTCTX_RETURN_FLAGS ||
+        flags & FIND_ACTCTX_RETURN_ASSEMBLY_METADATA)
+    {
+        DPRINT1("unknown flags %08x\n", flags);
+        return STATUS_INVALID_PARAMETER;
+    }
+
+    return STATUS_SUCCESS;
+}
+
 NTSTATUS
 NTAPI
 RtlFindActivationContextSectionString( ULONG flags, const GUID *guid, ULONG 
section_kind,
                                        UNICODE_STRING *section_name, PVOID ptr 
)
 {
     PACTCTX_SECTION_KEYED_DATA data = ptr;
-    NTSTATUS status = STATUS_SXS_KEY_NOT_FOUND;
-
-    if (guid)
-    {
-        DPRINT1("expected guid == NULL\n");
-        return STATUS_INVALID_PARAMETER;
-    }
-    if (flags & ~FIND_ACTCTX_SECTION_KEY_RETURN_HACTCTX)
-    {
-        DPRINT1("unknown flags %08x\n", flags);
-        return STATUS_INVALID_PARAMETER;
-    }
-    if (!data || data->cbSize < offsetof(ACTCTX_SECTION_KEYED_DATA, 
ulAssemblyRosterIndex) ||
-        !section_name || !section_name->Buffer)
-    {
-        DPRINT1("invalid parameter\n");
-        return STATUS_INVALID_PARAMETER;
-    }
+    NTSTATUS status;
+
+    status = RtlpFindActivationContextSection_CheckParameters(flags, guid, 
section_kind, section_name, data);
+    if (!NT_SUCCESS(status)) return status;
+
+    status = STATUS_SXS_KEY_NOT_FOUND;
 
     ASSERT(NtCurrentTeb());
     ASSERT(NtCurrentTeb()->ActivationContextStackPointer);


Reply via email to