add sanity checks for ring communication

we do not call memcpy() unless nbytes != 0 and source/target pointer is not NULL
we error out on illegal combinations of nbytes and inbuf/outbuf
This commit is contained in:
Axel Kohlmeyer 2018-02-24 16:41:10 +01:00
parent bba4bd1489
commit fb6e7e8aea
1 changed files with 13 additions and 3 deletions

View File

@ -696,10 +696,15 @@ void Comm::ring(int n, int nper, void *inbuf, int messtag,
if (maxbytes == 0) return;
// sanity check 1
if ((nbytes > 0) && inbuf == NULL)
error->one(FLERR,"Cannot put data on ring from NULL pointer");
char *buf,*bufcopy;
memory->create(buf,maxbytes,"comm:buf");
memory->create(bufcopy,maxbytes,"comm:bufcopy");
memcpy(buf,inbuf,nbytes);
if (nbytes && inbuf) memcpy(buf,inbuf,nbytes);
int next = me + 1;
int prev = me - 1;
@ -712,12 +717,17 @@ void Comm::ring(int n, int nper, void *inbuf, int messtag,
MPI_Send(buf,nbytes,MPI_CHAR,next,messtag,world);
MPI_Wait(&request,&status);
MPI_Get_count(&status,MPI_CHAR,&nbytes);
memcpy(buf,bufcopy,nbytes);
if (nbytes) memcpy(buf,bufcopy,nbytes);
}
if (self || loop < nprocs-1) callback(nbytes/nper,buf,ptr);
}
if (outbuf) memcpy(outbuf,buf,nbytes);
// sanity check 2
if ((nbytes > 0) && outbuf == NULL)
error->one(FLERR,"Cannot put data from ring to NULL pointer");
if (nbytes && outbuf) memcpy(outbuf,buf,nbytes);
memory->destroy(buf);
memory->destroy(bufcopy);