From ec6eb7922a2bdf5ee15724fe3cb892dd2b519612 Mon Sep 17 00:00:00 2001 From: Martin Kroeker Date: Fri, 7 Aug 2026 12:16:32 +0200 Subject: [PATCH 1/5] Add error return on buffer assignment failure --- interface/gbmv.c | 5 +++++ interface/gemm.c | 5 +++++ interface/sbmv.c | 5 +++++ interface/spmv.c | 5 +++++ interface/spr.c | 5 +++++ interface/spr2.c | 5 +++++ interface/symm.c | 5 +++++ interface/symv.c | 5 +++++ interface/syr.c | 5 +++++ interface/syr2.c | 5 +++++ interface/syr2k.c | 5 +++++ interface/syrk.c | 5 +++++ interface/tbmv.c | 5 +++++ interface/tbsv.c | 5 +++++ interface/tpmv.c | 5 +++++ interface/tpsv.c | 5 +++++ interface/trmv.c | 5 +++++ interface/trsv.c | 5 +++++ interface/zgbmv.c | 5 +++++ interface/zhbmv.c | 5 +++++ interface/zhemv.c | 5 +++++ interface/zher.c | 5 +++++ interface/zher2.c | 5 +++++ interface/zhpmv.c | 5 +++++ interface/zhpr.c | 5 +++++ interface/zhpr2.c | 5 +++++ interface/zsbmv.c | 5 +++++ interface/zspmv.c | 5 +++++ interface/zspr.c | 5 +++++ interface/zspr2.c | 5 +++++ interface/zsymv.c | 5 +++++ interface/zsyr.c | 5 +++++ interface/zsyr2.c | 5 +++++ interface/ztbmv.c | 5 +++++ interface/ztbsv.c | 5 +++++ interface/ztpmv.c | 5 +++++ interface/ztpsv.c | 5 +++++ interface/ztrsv.c | 5 +++++ 38 files changed, 190 insertions(+) diff --git a/interface/gbmv.c b/interface/gbmv.c index 8beea38ab3..3abbbd0aaa 100644 --- a/interface/gbmv.c +++ b/interface/gbmv.c @@ -226,6 +226,11 @@ void CNAME(enum CBLAS_ORDER order, if (incy < 0) y -= (leny-1)*incy; buffer = (FLOAT *)blas_memory_alloc(1); + if (!buffer) { + info = -999; + BLASFUNC(xerbla)(ERROR_NAME, &info, sizeof(ERROR_NAME)); + return; + } #ifdef SMP if (m * n < 250000 || kl+ku < 15 ) diff --git a/interface/gemm.c b/interface/gemm.c index 6cb351695b..2aba7bed6c 100644 --- a/interface/gemm.c +++ b/interface/gemm.c @@ -699,6 +699,11 @@ else #endif buffer = (XFLOAT *)blas_memory_alloc(0); + if (!buffer) { + info = -999; + BLASFUNC(xerbla)(ERROR_NAME, &info, sizeof(ERROR_NAME)); + return; + } //For LOONGARCH64, applying an offset to the buffer is essential //for minimizing cache conflicts and optimizing performance. diff --git a/interface/sbmv.c b/interface/sbmv.c index e9c3f9d9cd..019c72c13c 100644 --- a/interface/sbmv.c +++ b/interface/sbmv.c @@ -198,6 +198,11 @@ void CNAME(enum CBLAS_ORDER order, if (incy < 0 ) y -= (n - 1) * incy; buffer = (FLOAT *)blas_memory_alloc(1); + if (!buffer) { + info = -999; + BLASFUNC(xerbla)(ERROR_NAME, &info, sizeof(ERROR_NAME)); + return; + } #ifdef SMPTEST nthreads = num_cpu_avail(2); diff --git a/interface/spmv.c b/interface/spmv.c index 7f06420abc..c2aca37863 100644 --- a/interface/spmv.c +++ b/interface/spmv.c @@ -182,6 +182,11 @@ void CNAME(enum CBLAS_ORDER order, if (incy < 0 ) y -= (n - 1) * incy; buffer = (FLOAT *)blas_memory_alloc(1); + if (!buffer) { + info = -999; + BLASFUNC(xerbla)(ERROR_NAME, &info, sizeof(ERROR_NAME)); + return; + } #ifdef SMPTEST nthreads = num_cpu_avail(2); diff --git a/interface/spr.c b/interface/spr.c index 478d05396f..dbe090b15d 100644 --- a/interface/spr.c +++ b/interface/spr.c @@ -192,6 +192,11 @@ void CNAME(enum CBLAS_ORDER order, if (incx < 0 ) x -= (n - 1) * incx; buffer = (FLOAT *)blas_memory_alloc(1); + if (!buffer) { + info = -999; + BLASFUNC(xerbla)(ERROR_NAME, &info, sizeof(ERROR_NAME)); + return; + } #ifdef SMP nthreads = num_cpu_avail(2); diff --git a/interface/spr2.c b/interface/spr2.c index 74754efee0..90ca1c965c 100644 --- a/interface/spr2.c +++ b/interface/spr2.c @@ -196,6 +196,11 @@ void CNAME(enum CBLAS_ORDER order, if (incy < 0 ) y -= (n - 1) * incy; buffer = (FLOAT *)blas_memory_alloc(1); + if (!buffer) { + info = -999; + BLASFUNC(xerbla)(ERROR_NAME, &info, sizeof(ERROR_NAME)); + return; + } #ifdef SMP nthreads = num_cpu_avail(2); diff --git a/interface/symm.c b/interface/symm.c index e0999b262e..c1ab196080 100644 --- a/interface/symm.c +++ b/interface/symm.c @@ -405,6 +405,11 @@ if (strcmp(gotoblas_corename(), "armv9sme") == 0 FUNCTION_PROFILE_START(); buffer = (FLOAT *)blas_memory_alloc(0); + if (!buffer) { + info = -999; + BLASFUNC(xerbla)(ERROR_NAME, &info, sizeof(ERROR_NAME)); + return; + } sa = (FLOAT *)((BLASLONG)buffer + GEMM_OFFSET_A); sb = (FLOAT *)(((BLASLONG)sa + ((GEMM_P * GEMM_Q * COMPSIZE * SIZE + GEMM_ALIGN) & ~GEMM_ALIGN)) + GEMM_OFFSET_B); diff --git a/interface/symv.c b/interface/symv.c index 4ca8900547..7562526204 100644 --- a/interface/symv.c +++ b/interface/symv.c @@ -180,6 +180,11 @@ void CNAME(enum CBLAS_ORDER order, enum CBLAS_UPLO Uplo, blasint n, FLOAT alpha, if (incy < 0 ) y -= (n - 1) * incy; buffer = (FLOAT *)blas_memory_alloc(1); + if (!buffer) { + info = -999; + BLASFUNC(xerbla)(ERROR_NAME, &info, sizeof(ERROR_NAME)); + return; + } #ifdef SMP if (n <200) diff --git a/interface/syr.c b/interface/syr.c index 3235282ae5..a7581740f7 100644 --- a/interface/syr.c +++ b/interface/syr.c @@ -195,6 +195,11 @@ void CNAME(enum CBLAS_ORDER order, enum CBLAS_UPLO Uplo, blasint n, FLOAT alpha, if (incx < 0 ) x -= (n - 1) * incx; buffer = (FLOAT *)blas_memory_alloc(1); + if (!buffer) { + info = -999; + BLASFUNC(xerbla)(ERROR_NAME, &info, sizeof(ERROR_NAME)); + return; + } #ifdef SMP nthreads = num_cpu_avail(2); diff --git a/interface/syr2.c b/interface/syr2.c index a121441f5f..795958a027 100644 --- a/interface/syr2.c +++ b/interface/syr2.c @@ -197,6 +197,11 @@ void CNAME(enum CBLAS_ORDER order, enum CBLAS_UPLO Uplo, blasint n, FLOAT alpha, if (incy < 0 ) y -= (n - 1) * incy; buffer = (FLOAT *)blas_memory_alloc(1); + if (!buffer) { + info = -999; + BLASFUNC(xerbla)(ERROR_NAME, &info, sizeof(ERROR_NAME)); + return; + } #ifdef SMP nthreads = num_cpu_avail(2); diff --git a/interface/syr2k.c b/interface/syr2k.c index 70fc4f290e..4b005d0880 100644 --- a/interface/syr2k.c +++ b/interface/syr2k.c @@ -393,6 +393,11 @@ if (strcmp(gotoblas_corename(), "armv9sme") == 0 FUNCTION_PROFILE_START(); buffer = (FLOAT *)blas_memory_alloc(0); + if (!buffer) { + info = -999; + BLASFUNC(xerbla)(ERROR_NAME, &info, sizeof(ERROR_NAME)); + return; + } sa = (FLOAT *)((BLASLONG)buffer + GEMM_OFFSET_A); sb = (FLOAT *)(((BLASLONG)sa + ((GEMM_P * GEMM_Q * COMPSIZE * SIZE + GEMM_ALIGN) & ~GEMM_ALIGN)) + GEMM_OFFSET_B); diff --git a/interface/syrk.c b/interface/syrk.c index be92c207c3..bfce536a06 100644 --- a/interface/syrk.c +++ b/interface/syrk.c @@ -376,6 +376,11 @@ if (strcmp(gotoblas_corename(), "armv9sme") == 0 FUNCTION_PROFILE_START(); buffer = (FLOAT *)blas_memory_alloc(0); + if (!buffer) { + info = -999; + BLASFUNC(xerbla)(ERROR_NAME, &info, sizeof(ERROR_NAME)); + return; + } sa = (FLOAT *)((BLASLONG)buffer + GEMM_OFFSET_A); sb = (FLOAT *)(((BLASLONG)sa + ((GEMM_P * GEMM_Q * COMPSIZE * SIZE + GEMM_ALIGN) & ~GEMM_ALIGN)) + GEMM_OFFSET_B); diff --git a/interface/tbmv.c b/interface/tbmv.c index da9d3a6bab..0317a06d25 100644 --- a/interface/tbmv.c +++ b/interface/tbmv.c @@ -223,6 +223,11 @@ void CNAME(enum CBLAS_ORDER order, enum CBLAS_UPLO Uplo, if (incx < 0 ) x -= (n - 1) * incx; buffer = (FLOAT *)blas_memory_alloc(1); + if (!buffer) { + info = -999; + BLASFUNC(xerbla)(ERROR_NAME, &info, sizeof(ERROR_NAME)); + return; + } #ifdef SMP nthreads = num_cpu_avail(2); diff --git a/interface/tbsv.c b/interface/tbsv.c index b95f37389c..7f4393c180 100644 --- a/interface/tbsv.c +++ b/interface/tbsv.c @@ -202,6 +202,11 @@ void CNAME(enum CBLAS_ORDER order, enum CBLAS_UPLO Uplo, if (incx < 0 ) x -= (n - 1) * incx; buffer = (FLOAT *)blas_memory_alloc(1); + if (!buffer) { + info = -999; + BLASFUNC(xerbla)(ERROR_NAME, &info, sizeof(ERROR_NAME)); + return; + } (tbsv[(trans<<2) | (uplo<<1) | unit])(n, k, a, lda, x, incx, buffer); diff --git a/interface/tpmv.c b/interface/tpmv.c index 5b0168f3ba..d818f30c62 100644 --- a/interface/tpmv.c +++ b/interface/tpmv.c @@ -221,6 +221,11 @@ void CNAME(enum CBLAS_ORDER order, enum CBLAS_UPLO Uplo, if (incx < 0 ) x -= (n - 1) * incx; buffer = (FLOAT *)blas_memory_alloc(1); + if (!buffer) { + info = -999; + BLASFUNC(xerbla)(ERROR_NAME, &info, sizeof(ERROR_NAME)); + return; + } #ifdef SMP nthreads = num_cpu_avail(2); diff --git a/interface/tpsv.c b/interface/tpsv.c index 5357a0c798..09e6c334df 100644 --- a/interface/tpsv.c +++ b/interface/tpsv.c @@ -193,6 +193,11 @@ void CNAME(enum CBLAS_ORDER order, enum CBLAS_UPLO Uplo, if (incx < 0 ) x -= (n - 1) * incx; buffer = (FLOAT *)blas_memory_alloc(1); + if (!buffer) { + info = -999; + BLASFUNC(xerbla)(ERROR_NAME, &info, sizeof(ERROR_NAME)); + return; + } (tpsv[(trans<<2) | (uplo<<1) | unit])(n, a, x, incx, buffer); diff --git a/interface/trmv.c b/interface/trmv.c index e881b5d93f..d9beffd5a2 100644 --- a/interface/trmv.c +++ b/interface/trmv.c @@ -218,6 +218,11 @@ void CNAME(enum CBLAS_ORDER order, enum CBLAS_UPLO Uplo, if (incx < 0 ) x -= (n - 1) * incx; buffer = (FLOAT *)blas_memory_alloc(1); + if (!buffer) { + info = -999; + BLASFUNC(xerbla)(ERROR_NAME, &info, sizeof(ERROR_NAME)); + return; + } #ifdef SMP nthreads = num_cpu_avail(2); diff --git a/interface/trsv.c b/interface/trsv.c index 7a035de18d..d1c069fc45 100644 --- a/interface/trsv.c +++ b/interface/trsv.c @@ -197,6 +197,11 @@ void CNAME(enum CBLAS_ORDER order, enum CBLAS_UPLO Uplo, if (incx < 0 ) x -= (n - 1) * incx; buffer = (FLOAT *)blas_memory_alloc(1); + if (!buffer) { + info = -999; + BLASFUNC(xerbla)(ERROR_NAME, &info, sizeof(ERROR_NAME)); + return; + } (trsv[(trans<<2) | (uplo<<1) | unit])(n, a, lda, x, incx, buffer); diff --git a/interface/zgbmv.c b/interface/zgbmv.c index 1b0c958766..09e5b2b44d 100644 --- a/interface/zgbmv.c +++ b/interface/zgbmv.c @@ -251,6 +251,11 @@ void CNAME(enum CBLAS_ORDER order, if (incy < 0) y -= (leny - 1) * incy * 2; buffer = (FLOAT *)blas_memory_alloc(1); + if (!buffer) { + info = -999; + BLASFUNC(xerbla)(ERROR_NAME, &info, sizeof(ERROR_NAME)); + return; + } #ifdef SMP if (m * n < 125000 || ku + kl < 15) diff --git a/interface/zhbmv.c b/interface/zhbmv.c index 4abe33878a..4ee7cc73b8 100644 --- a/interface/zhbmv.c +++ b/interface/zhbmv.c @@ -204,6 +204,11 @@ void CNAME(enum CBLAS_ORDER order, if (incy < 0 ) y -= (n - 1) * incy * COMPSIZE; buffer = (FLOAT *)blas_memory_alloc(1); + if (!buffer) { + info = -999; + BLASFUNC(xerbla)(ERROR_NAME, &info, sizeof(ERROR_NAME)); + return; + } #ifdef SMPBUG nthreads = num_cpu_avail(2); diff --git a/interface/zhemv.c b/interface/zhemv.c index 6186be3718..3f5785c916 100644 --- a/interface/zhemv.c +++ b/interface/zhemv.c @@ -199,6 +199,11 @@ void CNAME(enum CBLAS_ORDER order, enum CBLAS_UPLO Uplo, blasint n, void *VALPHA if (incy < 0 ) y -= (n - 1) * incy * 2; buffer = (FLOAT *)blas_memory_alloc(1); + if (!buffer) { + info = -999; + BLASFUNC(xerbla)(ERROR_NAME, &info, sizeof(ERROR_NAME)); + return; + } #ifdef SMP if (n Date: Fri, 7 Aug 2026 12:20:19 +0200 Subject: [PATCH 2/5] Add error return on buffer assignment failure --- interface/trsm.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/interface/trsm.c b/interface/trsm.c index 3313fe4b3f..1395e88f59 100644 --- a/interface/trsm.c +++ b/interface/trsm.c @@ -397,6 +397,11 @@ if (strcmp(gotoblas_corename(), "armv9sme") == 0 FUNCTION_PROFILE_START(); buffer = (FLOAT *)blas_memory_alloc(0); + if (!buffer) { + info = -999; + BLASFUNC(xerbla)(ERROR_NAME, &info, sizeof(ERROR_NAME)); + return; + } sa = (FLOAT *)((BLASLONG)buffer + GEMM_OFFSET_A); sb = (FLOAT *)(((BLASLONG)sa + ((GEMM_P * GEMM_Q * COMPSIZE * SIZE + GEMM_ALIGN) & ~GEMM_ALIGN)) + GEMM_OFFSET_B); From ed2ba87203c01f5741b30cb7f08e74db275c9819 Mon Sep 17 00:00:00 2001 From: Martin Kroeker Date: Fri, 7 Aug 2026 12:28:01 +0200 Subject: [PATCH 3/5] Add error return on buffer assignment failure --- driver/level3/gemm_batch_thread.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/driver/level3/gemm_batch_thread.c b/driver/level3/gemm_batch_thread.c index 45d6977ba2..ac82df4734 100644 --- a/driver/level3/gemm_batch_thread.c +++ b/driver/level3/gemm_batch_thread.c @@ -83,6 +83,25 @@ int CNAME(blas_arg_t * args_array, BLASLONG nums){ int (*routine)(blas_arg_t *, void *, void *, XFLOAT *, XFLOAT *, BLASLONG); int i=0, /*j,*/ current_nums; +#ifndef COMPLEX +#ifdef XDOUBLE +#define ERROR_NAME "QGEMM_BATCH " +#elif defined(DOUBLE) +#define ERROR_NAME "DGEMM_BATCH " +#else +#define ERROR_NAME "SGEMM_BATCH " +#endif +#else +#ifdef XDOUBLE +#define ERROR_NAME "XGEMM_BATCH " +#elif defined(DOUBLE) +#define ERROR_NAME "ZGEMM_BATCH " +#else +#define ERROR_NAME "CGEMM_BATCH " +#endif +#endif + + #ifdef SMP blas_queue_t * queue=NULL; #endif @@ -90,6 +109,12 @@ int CNAME(blas_arg_t * args_array, BLASLONG nums){ if(nums <=0 ) return 0; buffer = (XFLOAT *)blas_memory_alloc(0); + if (!buffer) { + info = -999; + BLASFUNC(xerbla)(ERROR_NAME, &info, sizeof(ERROR_NAME)); + return; + } + sa = (XFLOAT *)((BLASLONG)buffer +GEMM_OFFSET_A); sb = (XFLOAT *)(((BLASLONG)sa + ((GEMM_P * GEMM_Q * COMPSIZE * SIZE + GEMM_ALIGN) & ~GEMM_ALIGN)) + GEMM_OFFSET_B); From 761ebe91ab5254a05c3a6224a0822a78651b600b Mon Sep 17 00:00:00 2001 From: Martin Kroeker Date: Fri, 7 Aug 2026 13:51:01 +0200 Subject: [PATCH 4/5] Fix return without code and buffer leak on other error path --- driver/level3/gemm_batch_thread.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/driver/level3/gemm_batch_thread.c b/driver/level3/gemm_batch_thread.c index ac82df4734..981e7f0f39 100644 --- a/driver/level3/gemm_batch_thread.c +++ b/driver/level3/gemm_batch_thread.c @@ -88,6 +88,8 @@ int CNAME(blas_arg_t * args_array, BLASLONG nums){ #define ERROR_NAME "QGEMM_BATCH " #elif defined(DOUBLE) #define ERROR_NAME "DGEMM_BATCH " +#elif defined(BFLOAT16) +#define ERROR_NAME "SBGEMM_BATCH " #else #define ERROR_NAME "SGEMM_BATCH " #endif @@ -112,7 +114,7 @@ int CNAME(blas_arg_t * args_array, BLASLONG nums){ if (!buffer) { info = -999; BLASFUNC(xerbla)(ERROR_NAME, &info, sizeof(ERROR_NAME)); - return; + return(1); } sa = (XFLOAT *)((BLASLONG)buffer +GEMM_OFFSET_A); @@ -144,6 +146,8 @@ int CNAME(blas_arg_t * args_array, BLASLONG nums){ queue=(blas_queue_t *)malloc((nums+1) * sizeof(blas_queue_t)); if(queue == NULL){ openblas_warning(0, "memory alloc failed!\n"); + if (buffer) blas_memory_free(buffer); + BLASFUNC(xerbla)(ERROR_NAME, &info, sizeof(ERROR_NAME)); return(1); } for(i=0; i Date: Fri, 7 Aug 2026 13:56:43 +0200 Subject: [PATCH 5/5] Fix missing declaration of info --- driver/level3/gemm_batch_thread.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/driver/level3/gemm_batch_thread.c b/driver/level3/gemm_batch_thread.c index 981e7f0f39..7cc903ff98 100644 --- a/driver/level3/gemm_batch_thread.c +++ b/driver/level3/gemm_batch_thread.c @@ -79,6 +79,7 @@ static int inner_small_matrix_thread(blas_arg_t *args, BLASLONG *range_m, BLASLO int CNAME(blas_arg_t * args_array, BLASLONG nums){ XFLOAT *buffer; XFLOAT *sa, *sb; + blasint info; int nthreads=1; int (*routine)(blas_arg_t *, void *, void *, XFLOAT *, XFLOAT *, BLASLONG); int i=0, /*j,*/ current_nums; @@ -147,6 +148,7 @@ int CNAME(blas_arg_t * args_array, BLASLONG nums){ if(queue == NULL){ openblas_warning(0, "memory alloc failed!\n"); if (buffer) blas_memory_free(buffer); + info = -999; BLASFUNC(xerbla)(ERROR_NAME, &info, sizeof(ERROR_NAME)); return(1); }