From b17ccb4c5c5ef3a41b7a5040f1c604348f8cf6f0 Mon Sep 17 00:00:00 2001 From: Jerome Robert Date: Thu, 29 Jan 2015 09:55:57 +0100 Subject: [PATCH] Fix a segfault in gemv when MAX_STACK_ALLOC is set * stack_alloc_size is needed after the implementation call but it may be overwritten if it's optimized to a register, because some gemv implementation (ex: dgemv_n.S) do not restore all register (ex: r10). * do the same in ger.c for the same reasons even if the bug has not been observed. --- interface/gemv.c | 4 +++- interface/ger.c | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/interface/gemv.c b/interface/gemv.c index 155305be8..f33973ef3 100644 --- a/interface/gemv.c +++ b/interface/gemv.c @@ -209,7 +209,9 @@ void CNAME(enum CBLAS_ORDER order, if (incy < 0) y -= (leny - 1) * incy; #ifdef MAX_STACK_ALLOC - int stack_alloc_size = m + n; + // make it volatile because some gemv implementation (ex: dgemv_n.S) + // do not restore all register + volatile int stack_alloc_size = m + n; if(stack_alloc_size < 128) //dgemv_n.S require a 128 bytes buffer stack_alloc_size = 128; diff --git a/interface/ger.c b/interface/ger.c index cac357786..9dd2dc58b 100644 --- a/interface/ger.c +++ b/interface/ger.c @@ -172,7 +172,7 @@ void CNAME(enum CBLAS_ORDER order, if (incx < 0) x -= (m - 1) * incx; #ifdef MAX_STACK_ALLOC - int stack_alloc_size = m; + volatile int stack_alloc_size = m; if(stack_alloc_size > MAX_STACK_ALLOC / sizeof(FLOAT)) stack_alloc_size = 0; FLOAT stack_buffer[stack_alloc_size];