[petsc-dev] [PATCH] Fix buffer overrun in threaded MatZeroEntries_SeqBAIJ

Lawrence Mitchell lawrence.mitchell at imperial.ac.uk
Mon Oct 13 08:58:44 CDT 2014


rmap->trstarts counts rows in the matrix, but a->i only has nrows/bs
entries.  Fix start and end indexing by dividing by the block size.

While we're here, update the sizeof call to use MatScalar rather than
PetscScalar.
---
I think I sent this to petsc-maint a while ago, but either it didn't
make it, or slipped through the cracks.  Anyway, here goes again.  If
configured with threading, MatZeroEntries on a BAIJ Mat indexes too
far into a->i, the fix is just to divide appropriately by the block
size, I think.

I wonder if the sizeof change should instead be to:

sizeof(*(a->a))

so that one doesn't have to update again if the Mat datatype changes
in the future.

 src/mat/impls/baij/seq/baij2.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/mat/impls/baij/seq/baij2.c b/src/mat/impls/baij/seq/baij2.c
index aa1ed44..46d1cac 100644
--- a/src/mat/impls/baij/seq/baij2.c
+++ b/src/mat/impls/baij/seq/baij2.c
@@ -2709,10 +2709,10 @@ PetscErrorCode MatZeroEntries_SeqBAIJ_Kernel(PetscInt thread_id,Mat A)
   PetscInt       n,start,end;
   Mat_SeqBAIJ     *a = (Mat_SeqBAIJ*)A->data;
 
-  start = trstarts[thread_id];
-  end   = trstarts[thread_id+1];
+  start = trstarts[thread_id]/A->rmap->bs;
+  end   = trstarts[thread_id+1]/A->rmap->bs;
   n     = a->i[end] - a->i[start];
-  ierr  = PetscMemzero(a->a+a->bs2*a->i[start],a->bs2*n*sizeof(PetscScalar));CHKERRQ(ierr);
+  ierr  = PetscMemzero(a->a+a->bs2*a->i[start],a->bs2*n*sizeof(MatScalar));CHKERRQ(ierr);
   return 0;
 }
 
-- 
2.1.0




More information about the petsc-dev mailing list