diff --git a/dlls/opcservices/package.c b/dlls/opcservices/package.c index 074f3c8f997..e526ebff674 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 764dca1cf3f..c5c8ee25998 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);