From e2dbaa6efa72a577ac9dcece67f13b64a057ad11 Mon Sep 17 00:00:00 2001 From: jsteube Date: Mon, 11 Jul 2016 17:15:57 +0200 Subject: [PATCH] Do not error and exit if an OpenCL platform has no devices, just print a warning and continue with the next platform --- docs/changes.txt | 1 + src/hashcat.c | 37 ++++++++++++++++++++++++------------- 2 files changed, 25 insertions(+), 13 deletions(-) diff --git a/docs/changes.txt b/docs/changes.txt index 086efa7..666b5eb 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -14,6 +14,7 @@ - Replace LINUX macro with compiler predefined macro __linux__ - Allow the use of enc_id == 0 in hash-mode 10600 and 10700 as it takes no part in the actual computation - Get rid of exit() calls in OpenCL wrapper library with the goal to have a better control which error can be ignored under special circumstances +- Do not error and exit if an OpenCL platform has no devices, just print a warning and continue with the next platform ## ## Bugs diff --git a/src/hashcat.c b/src/hashcat.c index 492e52d..027dd02 100644 --- a/src/hashcat.c +++ b/src/hashcat.c @@ -14095,9 +14095,13 @@ int main (int argc, char **argv) if (CL_err != CL_SUCCESS) { - log_error ("ERROR: clGetDeviceIDs(): %s\n", val2cstr_cl (CL_err)); + //log_error ("ERROR: clGetDeviceIDs(): %s\n", val2cstr_cl (CL_err)); - return -1; + //return -1; + + // Silently ignore at this point, it will be reused later and create a note for the user at that point + + continue; } for (uint platform_devices_id = 0; platform_devices_id < platform_devices_cnt; platform_devices_id++) @@ -14161,15 +14165,6 @@ int main (int argc, char **argv) cl_platform_id platform = platforms[platform_id]; - CL_err = hc_clGetDeviceIDs (data.ocl, platform, CL_DEVICE_TYPE_ALL, DEVICES_MAX, platform_devices, &platform_devices_cnt); - - if (CL_err != CL_SUCCESS) - { - log_error ("ERROR: clGetDeviceIDs(): %s\n", val2cstr_cl (CL_err)); - - return -1; - } - char platform_vendor[INFOSZ] = { 0 }; CL_err = hc_clGetPlatformInfo (data.ocl, platform, CL_PLATFORM_VENDOR, sizeof (platform_vendor), platform_vendor, NULL); @@ -14224,7 +14219,18 @@ int main (int argc, char **argv) platform_vendor_id = VENDOR_ID_GENERIC; } - const uint platform_skipped = ((opencl_platforms_filter & (1 << platform_id)) == 0); + uint platform_skipped = ((opencl_platforms_filter & (1 << platform_id)) == 0); + + CL_err = hc_clGetDeviceIDs (data.ocl, platform, CL_DEVICE_TYPE_ALL, DEVICES_MAX, platform_devices, &platform_devices_cnt); + + if (CL_err != CL_SUCCESS) + { + //log_error ("ERROR: clGetDeviceIDs(): %s\n", val2cstr_cl (CL_err)); + + //return -1; + + platform_skipped = 2; + } if ((benchmark == 1 || quiet == 0) && (algorithm_pos == 0)) { @@ -14240,11 +14246,16 @@ int main (int argc, char **argv) log_info (line); } - else + else if (platform_skipped == 1) { log_info ("OpenCL Platform #%u: %s, skipped", platform_id + 1, platform_vendor); log_info (""); } + else if (platform_skipped == 2) + { + log_info ("OpenCL Platform #%u: %s, skipped! No OpenCL compatible devices found", platform_id + 1, platform_vendor); + log_info (""); + } } } -- 2.25.1