[PATCH 1/4] opcservices: Improve parameter validation in CreateRelationship().

Nikolay Sivov nsivov at codeweavers.com
Thu Sep 20 02:09:12 CDT 2018


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/opcservices/package.c           | 10 ++++++++++
 dlls/opcservices/tests/opcservices.c |  9 ++++++---
 2 files changed, 16 insertions(+), 3 deletions(-)

diff --git a/dlls/opcservices/package.c b/dlls/opcservices/package.c
index 074f3c8f99..e526ebff67 100644
--- a/dlls/opcservices/package.c
+++ b/dlls/opcservices/package.c
@@ -1301,13 +1301,23 @@ static HRESULT WINAPI opc_relationship_set_CreateRelationship(IOpcRelationshipSe
         const WCHAR *type, IUri *target_uri, OPC_URI_TARGET_MODE target_mode, IOpcRelationship **relationship)
 {
     struct opc_relationship_set *relationship_set = impl_from_IOpcRelationshipSet(iface);
+    DWORD length;
 
     TRACE("iface %p, id %s, type %s, target_uri %p, target_mode %d, relationship %p.\n", iface, debugstr_w(id),
             debugstr_w(type), target_uri, target_mode, relationship);
 
+    if (!relationship)
+        return E_POINTER;
+
+    *relationship = NULL;
+
     if (!type || !target_uri)
         return E_POINTER;
 
+    if (IUri_GetPropertyLength(target_uri, Uri_PROPERTY_SCHEME_NAME, &length, 0) == S_OK && length != 0
+            && target_mode == OPC_URI_TARGET_MODE_INTERNAL)
+        return OPC_E_INVALID_RELATIONSHIP_TARGET;
+
     return opc_relationship_create(relationship_set, id, type, target_uri, target_mode, relationship);
 }
 
diff --git a/dlls/opcservices/tests/opcservices.c b/dlls/opcservices/tests/opcservices.c
index 764dca1cf3..c5c8ee2599 100644
--- a/dlls/opcservices/tests/opcservices.c
+++ b/dlls/opcservices/tests/opcservices.c
@@ -362,21 +362,24 @@ static void test_relationship(void)
     hr = IOpcPackage_GetRelationshipSet(package, &rels);
     ok(SUCCEEDED(hr), "Failed to get part set, hr %#x.\n", hr);
 
+    rel = (void *)0xdeadbeef;
     hr = IOpcRelationshipSet_CreateRelationship(rels, NULL, NULL, NULL, OPC_URI_TARGET_MODE_INTERNAL, &rel);
     ok(hr == E_POINTER, "Unexpected hr %#x.\n", hr);
+    ok(rel == NULL, "Unexpected instance %p.\n", rel);
 
+    rel = (void *)0xdeadbeef;
     hr = IOpcRelationshipSet_CreateRelationship(rels, NULL, typeW, NULL, OPC_URI_TARGET_MODE_INTERNAL, &rel);
     ok(hr == E_POINTER, "Unexpected hr %#x.\n", hr);
+    ok(rel == NULL, "Unexpected instance %p.\n", rel);
 
     hr = IOpcRelationshipSet_CreateRelationship(rels, NULL, NULL, target_uri, OPC_URI_TARGET_MODE_INTERNAL, &rel);
     ok(hr == E_POINTER, "Unexpected hr %#x.\n", hr);
 
     /* Absolute target uri with internal mode */
+    rel = (void *)0xdeadbeef;
     hr = IOpcRelationshipSet_CreateRelationship(rels, NULL, typeW, target_uri2, OPC_URI_TARGET_MODE_INTERNAL, &rel);
-todo_wine
     ok(hr == OPC_E_INVALID_RELATIONSHIP_TARGET, "Unexpected hr %#x.\n", hr);
-    if (hr == S_OK)
-        IOpcRelationship_Release(rel);
+    ok(rel == NULL, "Unexpected instance %p.\n", rel);
 
     hr = IOpcRelationshipSet_CreateRelationship(rels, NULL, typeW, target_uri, OPC_URI_TARGET_MODE_INTERNAL, &rel);
     ok(SUCCEEDED(hr), "Failed to create relationship, hr %#x.\n", hr);
-- 
2.18.0




More information about the wine-devel mailing list