From 925695f74bd90cfcfe732cae154829b07dea9ed4 Mon Sep 17 00:00:00 2001 From: peardox Date: Wed, 9 Jul 2025 18:11:02 +0100 Subject: [PATCH 1/3] Check for null pointers in backends before use --- src/whisper.cpp | 47 ++++++++++++++++++++++++++++++++++------------- 1 file changed, 34 insertions(+), 13 deletions(-) diff --git a/src/whisper.cpp b/src/whisper.cpp index 347cc178ee7..10735aad4ef 100644 --- a/src/whisper.cpp +++ b/src/whisper.cpp @@ -1,4 +1,4 @@ -#include "whisper.h" +`#include "whisper.h" #include "whisper-arch.h" #include "ggml.h" @@ -1326,6 +1326,10 @@ static ggml_backend_t whisper_backend_init_gpu(const whisper_context_params & pa if (params.use_gpu) { for (size_t i = 0; i < ggml_backend_dev_count(); ++i) { ggml_backend_dev_t dev_cur = ggml_backend_dev_get(i); + // Prevent null pointer being used in following code + if(dev_cur == nullptr) { + continue; + } if (ggml_backend_dev_type(dev_cur) == GGML_BACKEND_DEVICE_TYPE_GPU) { if (cnt == 0 || cnt == params.gpu_device) { dev = dev_cur; @@ -1364,6 +1368,10 @@ static std::vector whisper_backend_init(const whisper_context_pa // ACCEL backends for (size_t i = 0; i < ggml_backend_dev_count(); ++i) { ggml_backend_dev_t dev = ggml_backend_dev_get(i); + // Prevent null pointer being used in following code + if(dev == nullptr) { + continue; + } if (ggml_backend_dev_type(dev) == GGML_BACKEND_DEVICE_TYPE_ACCEL) { WHISPER_LOG_INFO("%s: using %s backend\n", __func__, ggml_backend_dev_name(dev)); ggml_backend_t backend = ggml_backend_dev_init(dev, nullptr); @@ -1395,6 +1403,10 @@ static buft_list_t make_buft_list(whisper_context_params & params) { int cnt = 0; for (size_t i = 0; i < ggml_backend_dev_count(); ++i) { ggml_backend_dev_t dev = ggml_backend_dev_get(i); + // Prevent null pointer being used in following code + if(dev == nullptr) { + continue; + } if (ggml_backend_dev_type(dev) == GGML_BACKEND_DEVICE_TYPE_GPU) { if (cnt == 0 || cnt == params.gpu_device) { auto * buft = ggml_backend_dev_buffer_type(dev); @@ -1412,20 +1424,23 @@ static buft_list_t make_buft_list(whisper_context_params & params) { // CPU Extra auto * cpu_dev = ggml_backend_dev_by_type(GGML_BACKEND_DEVICE_TYPE_CPU); - auto * cpu_reg = ggml_backend_dev_backend_reg(cpu_dev); - auto get_extra_bufts_fn = (ggml_backend_dev_get_extra_bufts_t) - ggml_backend_reg_get_proc_address(cpu_reg, "ggml_backend_dev_get_extra_bufts"); - if (get_extra_bufts_fn) { - ggml_backend_buffer_type_t * extra_bufts = get_extra_bufts_fn(cpu_dev); - while (extra_bufts && *extra_bufts) { - buft_list.emplace_back(cpu_dev, *extra_bufts); - ++extra_bufts; + // Prevent null pointer being used in following code + if(cpu_dev != nullptr) { + auto * cpu_reg = ggml_backend_dev_backend_reg(cpu_dev); + auto get_extra_bufts_fn = (ggml_backend_dev_get_extra_bufts_t) + ggml_backend_reg_get_proc_address(cpu_reg, "ggml_backend_dev_get_extra_bufts"); + if (get_extra_bufts_fn) { + ggml_backend_buffer_type_t * extra_bufts = get_extra_bufts_fn(cpu_dev); + while (extra_bufts && *extra_bufts) { + buft_list.emplace_back(cpu_dev, *extra_bufts); + ++extra_bufts; + } } - } - - // CPU - buft_list.emplace_back(cpu_dev, ggml_backend_cpu_buffer_type()); + // CPU + buft_list.emplace_back(cpu_dev, ggml_backend_cpu_buffer_type()); + } + return buft_list; } @@ -1728,6 +1743,12 @@ static bool whisper_model_load(struct whisper_model_loader * loader, whisper_con // Create a list of available bufts, in priority order buft_list_t buft_list = make_buft_list(wctx.params); + // Under rare circumstances it may not be possible to build a buft_list + // This can occur, for example, is all backends fail + if (buft_list.empty()) { + WHISPER_LOG_ERROR("%s: Failed to find a create a list of available bufts - possibly all backends failed\n", __func__); + return false; + } auto create_tensor = [&](asr_tensor type, asr_system system, ggml_tensor * meta, int layer = 0) -> ggml_tensor * { ggml_op op = ASR_TENSOR_INFO.at(type); From 377c749687d4e6ff70c3523dd38e2f681868c416 Mon Sep 17 00:00:00 2001 From: peardox Date: Wed, 9 Jul 2025 18:12:48 +0100 Subject: [PATCH 2/3] Check for null pointers in backends before use --- src/whisper.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/whisper.cpp b/src/whisper.cpp index 10735aad4ef..3fb1de2f0a7 100644 --- a/src/whisper.cpp +++ b/src/whisper.cpp @@ -1,4 +1,4 @@ -`#include "whisper.h" +#include "whisper.h" #include "whisper-arch.h" #include "ggml.h" From 1a64dd4250ab9c1865764b68a8e18571c539dc68 Mon Sep 17 00:00:00 2001 From: peardox Date: Mon, 21 Jul 2025 11:41:17 +0100 Subject: [PATCH 3/3] if nit-picked * 4 --- src/whisper.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/whisper.cpp b/src/whisper.cpp index 3fb1de2f0a7..8ff79d6c488 100644 --- a/src/whisper.cpp +++ b/src/whisper.cpp @@ -1327,7 +1327,7 @@ static ggml_backend_t whisper_backend_init_gpu(const whisper_context_params & pa for (size_t i = 0; i < ggml_backend_dev_count(); ++i) { ggml_backend_dev_t dev_cur = ggml_backend_dev_get(i); // Prevent null pointer being used in following code - if(dev_cur == nullptr) { + if (dev_cur == nullptr) { continue; } if (ggml_backend_dev_type(dev_cur) == GGML_BACKEND_DEVICE_TYPE_GPU) { @@ -1369,7 +1369,7 @@ static std::vector whisper_backend_init(const whisper_context_pa for (size_t i = 0; i < ggml_backend_dev_count(); ++i) { ggml_backend_dev_t dev = ggml_backend_dev_get(i); // Prevent null pointer being used in following code - if(dev == nullptr) { + if (dev == nullptr) { continue; } if (ggml_backend_dev_type(dev) == GGML_BACKEND_DEVICE_TYPE_ACCEL) { @@ -1404,7 +1404,7 @@ static buft_list_t make_buft_list(whisper_context_params & params) { for (size_t i = 0; i < ggml_backend_dev_count(); ++i) { ggml_backend_dev_t dev = ggml_backend_dev_get(i); // Prevent null pointer being used in following code - if(dev == nullptr) { + if (dev == nullptr) { continue; } if (ggml_backend_dev_type(dev) == GGML_BACKEND_DEVICE_TYPE_GPU) { @@ -1425,7 +1425,7 @@ static buft_list_t make_buft_list(whisper_context_params & params) { // CPU Extra auto * cpu_dev = ggml_backend_dev_by_type(GGML_BACKEND_DEVICE_TYPE_CPU); // Prevent null pointer being used in following code - if(cpu_dev != nullptr) { + if (cpu_dev != nullptr) { auto * cpu_reg = ggml_backend_dev_backend_reg(cpu_dev); auto get_extra_bufts_fn = (ggml_backend_dev_get_extra_bufts_t) ggml_backend_reg_get_proc_address(cpu_reg, "ggml_backend_dev_get_extra_bufts");