Skip to content

Commit 54cbefd

Browse files
Close ICD library if it invalid
1 parent 7eddceb commit 54cbefd

File tree

1 file changed

+12
-0
lines changed

1 file changed

+12
-0
lines changed

loader/loader.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1819,6 +1819,7 @@ VkResult loader_scanned_icd_add(const struct loader_instance *inst, struct loade
18191819
loader_log(inst, VULKAN_LOADER_ERROR_BIT, 0,
18201820
"loader_scanned_icd_add: ICD %s doesn't support interface version compatible with loader, skip this ICD.",
18211821
filename);
1822+
res = VK_ERROR_INCOMPATIBLE_DRIVER;
18221823
goto out;
18231824
}
18241825

@@ -1836,6 +1837,7 @@ VkResult loader_scanned_icd_add(const struct loader_instance *inst, struct loade
18361837
"loader_scanned_icd_add: ICD %s reports an interface version of %d but doesn't export "
18371838
"vk_icdGetInstanceProcAddr, skip this ICD.",
18381839
filename, interface_vers);
1840+
res = VK_ERROR_INCOMPATIBLE_DRIVER;
18391841
goto out;
18401842
}
18411843
// Use deprecated interface from version 0
@@ -1845,6 +1847,7 @@ VkResult loader_scanned_icd_add(const struct loader_instance *inst, struct loade
18451847
"loader_scanned_icd_add: Attempt to retrieve either \'vkGetInstanceProcAddr\' or "
18461848
"\'vk_icdGetInstanceProcAddr\' from ICD %s failed.",
18471849
filename);
1850+
res = VK_ERROR_INCOMPATIBLE_DRIVER;
18481851
goto out;
18491852
} else {
18501853
loader_log(inst, VULKAN_LOADER_WARN_BIT, 0,
@@ -1856,6 +1859,7 @@ VkResult loader_scanned_icd_add(const struct loader_instance *inst, struct loade
18561859
if (NULL == fp_create_inst) {
18571860
loader_log(inst, VULKAN_LOADER_ERROR_BIT, 0,
18581861
"loader_scanned_icd_add: Failed querying \'vkCreateInstance\' via dlsym/LoadLibrary for ICD %s", filename);
1862+
res = VK_ERROR_INCOMPATIBLE_DRIVER;
18591863
goto out;
18601864
}
18611865
fp_get_inst_ext_props = loader_platform_get_proc_address(handle, "vkEnumerateInstanceExtensionProperties");
@@ -1864,6 +1868,7 @@ VkResult loader_scanned_icd_add(const struct loader_instance *inst, struct loade
18641868
"loader_scanned_icd_add: Could not get \'vkEnumerateInstanceExtensionProperties\' via dlsym/LoadLibrary "
18651869
"for ICD %s",
18661870
filename);
1871+
res = VK_ERROR_INCOMPATIBLE_DRIVER;
18671872
goto out;
18681873
}
18691874
} else {
@@ -1879,6 +1884,7 @@ VkResult loader_scanned_icd_add(const struct loader_instance *inst, struct loade
18791884
loader_log(inst, VULKAN_LOADER_ERROR_BIT, 0,
18801885
"loader_scanned_icd_add: Could not get \'vkCreateInstance\' via \'vk_icdGetInstanceProcAddr\' for ICD %s",
18811886
filename);
1887+
res = VK_ERROR_INCOMPATIBLE_DRIVER;
18821888
goto out;
18831889
}
18841890
fp_get_inst_ext_props =
@@ -1888,6 +1894,7 @@ VkResult loader_scanned_icd_add(const struct loader_instance *inst, struct loade
18881894
"loader_scanned_icd_add: Could not get \'vkEnumerateInstanceExtensionProperties\' via "
18891895
"\'vk_icdGetInstanceProcAddr\' for ICD %s",
18901896
filename);
1897+
res = VK_ERROR_INCOMPATIBLE_DRIVER;
18911898
goto out;
18921899
}
18931900
// Query "vk_icdGetPhysicalDeviceProcAddr" with vk_icdGetInstanceProcAddr if the library reports interface version 7 or
@@ -1956,6 +1963,11 @@ VkResult loader_scanned_icd_add(const struct loader_instance *inst, struct loade
19561963
icd_tramp_list->count++;
19571964

19581965
out:
1966+
if (res != VK_SUCCESS) {
1967+
if (NULL != handle) {
1968+
loader_platform_close_library(handle);
1969+
}
1970+
}
19591971

19601972
return res;
19611973
}

0 commit comments

Comments
 (0)