Fix issue #143 (Invalid ?tpmqrt workspace allocation)
authorThomas Mijieux <thomas.mijieux@inria.fr>
Thu, 4 May 2017 12:32:29 +0000 (14:32 +0200)
committerThomas Mijieux <thomas.mijieux@inria.fr>
Thu, 4 May 2017 12:32:29 +0000 (14:32 +0200)
LAPACKE/src/lapacke_ctpmqrt.c
LAPACKE/src/lapacke_dtpmqrt.c
LAPACKE/src/lapacke_stpmqrt.c
LAPACKE/src/lapacke_ztpmqrt.c

index 96db86b..fba2a23 100644 (file)
@@ -43,6 +43,7 @@ lapack_int LAPACKE_ctpmqrt( int matrix_layout, char side, char trans,
 {
     lapack_int ncols_a, nrows_a;
     lapack_int nrows_v;
+    lapack_int lwork;
     lapack_int info = 0;
     lapack_complex_float* work = NULL;
     if( matrix_layout != LAPACK_COL_MAJOR && matrix_layout != LAPACK_ROW_MAJOR ) {
@@ -71,8 +72,10 @@ lapack_int LAPACKE_ctpmqrt( int matrix_layout, char side, char trans,
     }
 #endif
     /* Allocate memory for working array(s) */
+    lwork = LAPACKE_lsame( side, 'L' ) ? MAX(1,nb) * MAX(1,n) :
+                       ( LAPACKE_lsame( side, 'R' ) ? MAX(1,m) * MAX(1,nb) : 0 );
     work = (lapack_complex_float*)
-        LAPACKE_malloc( sizeof(lapack_complex_float) * MAX(1,m) * MAX(1,nb) );
+        LAPACKE_malloc( sizeof(lapack_complex_float) * lwork );
     if( work == NULL ) {
         info = LAPACK_WORK_MEMORY_ERROR;
         goto exit_level_0;
index 9015ef0..1408904 100644 (file)
@@ -42,6 +42,7 @@ lapack_int LAPACKE_dtpmqrt( int matrix_layout, char side, char trans,
 {
     lapack_int ncols_a, nrows_a;
     lapack_int nrows_v;
+    lapack_int lwork;
     lapack_int info = 0;
     double* work = NULL;
     if( matrix_layout != LAPACK_COL_MAJOR && matrix_layout != LAPACK_ROW_MAJOR ) {
@@ -70,7 +71,9 @@ lapack_int LAPACKE_dtpmqrt( int matrix_layout, char side, char trans,
     }
 #endif
     /* Allocate memory for working array(s) */
-    work = (double*)LAPACKE_malloc( sizeof(double) * MAX(1,m) * MAX(1,nb) );
+    lwork = LAPACKE_lsame( side, 'L' ) ? MAX(1,nb) * MAX(1,n) :
+                       ( LAPACKE_lsame( side, 'R' ) ? MAX(1,m) * MAX(1,nb) : 0 );
+    work = (double*)LAPACKE_malloc( sizeof(double) * lwork );
     if( work == NULL ) {
         info = LAPACK_WORK_MEMORY_ERROR;
         goto exit_level_0;
index 29df845..cb283a3 100644 (file)
@@ -41,6 +41,7 @@ lapack_int LAPACKE_stpmqrt( int matrix_layout, char side, char trans,
 {
     lapack_int ncols_a, nrows_a;
     lapack_int nrows_v;
+    lapack_int lwork;
     lapack_int info = 0;
     float* work = NULL;
     if( matrix_layout != LAPACK_COL_MAJOR && matrix_layout != LAPACK_ROW_MAJOR ) {
@@ -69,7 +70,9 @@ lapack_int LAPACKE_stpmqrt( int matrix_layout, char side, char trans,
     }
 #endif
     /* Allocate memory for working array(s) */
-    work = (float*)LAPACKE_malloc( sizeof(float) * MAX(1,m) * MAX(1,nb) );
+    lwork = LAPACKE_lsame( side, 'L' ) ? MAX(1,nb) * MAX(1,n) :
+        ( LAPACKE_lsame( side, 'R' ) ? MAX(1,m) * MAX(1,nb) : 0 );
+    work = (float*)LAPACKE_malloc( sizeof(float) * lwork );
     if( work == NULL ) {
         info = LAPACK_WORK_MEMORY_ERROR;
         goto exit_level_0;
index 72b83fc..e3bd95a 100644 (file)
@@ -43,6 +43,7 @@ lapack_int LAPACKE_ztpmqrt( int matrix_layout, char side, char trans,
 {
     lapack_int ncols_a, nrows_a;
     lapack_int nrows_v;
+    lapack_int lwork;
     lapack_int info = 0;
     lapack_complex_double* work = NULL;
     if( matrix_layout != LAPACK_COL_MAJOR && matrix_layout != LAPACK_ROW_MAJOR ) {
@@ -71,8 +72,10 @@ lapack_int LAPACKE_ztpmqrt( int matrix_layout, char side, char trans,
     }
 #endif
     /* Allocate memory for working array(s) */
+    lwork = LAPACKE_lsame( side, 'L' ) ? MAX(1,nb) * MAX(1,n) :
+                       ( LAPACKE_lsame( side, 'R' ) ? MAX(1,m) * MAX(1,nb) : 0 );
     work = (lapack_complex_double*)
-        LAPACKE_malloc( sizeof(lapack_complex_double) * MAX(1,m) * MAX(1,nb) );
+        LAPACKE_malloc( sizeof(lapack_complex_double) * lwork );
     if( work == NULL ) {
         info = LAPACK_WORK_MEMORY_ERROR;
         goto exit_level_0;