Skip to content

Commit ab6b157

Browse files
committed
Use pointer macro to prevent integer oveflow
An integer overflow occurs and causes segmentation fault when 2D row/col index is linearized using 32-bit integers. PBLAS Mptr() macro should be used instead. This fix only fixes address calculations with row, column, and leading dimension. There might be other places where an overflow occurs but they may not matter for practical purposes because they would require very large matrices or very long vectors within a single process.
1 parent 3a43f6f commit ab6b157

File tree

10 files changed

+36
-36
lines changed

10 files changed

+36
-36
lines changed

PBLAS/SRC/pdamax_.c

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,7 @@ void pdamax_( N, AMAX, INDX, X, IX, JX, DESCX, INCX )
233233
if( ( ( myrow == Xrow ) || ( Xrow < 0 ) ) &&
234234
( ( mycol == Xcol ) || ( Xcol < 0 ) ) )
235235
{
236-
*INDX = *JX; *AMAX = X[Xii+Xjj*Xd[LLD_]];
236+
*INDX = *JX; *AMAX = *Mptr(X,Xii,Xjj,Xd[LLD_],1);
237237
}
238238
return;
239239
}
@@ -260,9 +260,9 @@ void pdamax_( N, AMAX, INDX, X, IX, JX, DESCX, INCX )
260260
{
261261
Xld = Xd[LLD_];
262262
Xlindx = Xjj - 1 +
263-
idamax_( &Xnq, ((char*)(X+(Xii+Xjj*Xld))), &Xld );
263+
idamax_( &Xnq, ((char*)Mptr(X,Xii,Xjj,Xld,1)), &Xld );
264264
Mindxl2g( Xgindx, Xlindx, Xinb, Xnb, mycol, Xsrc, npcol );
265-
work[0] = X[Xii+Xlindx*Xld];
265+
work[0] = *Mptr(X,Xii,Xlindx,Xld,1);
266266
work[1] = ((double)( Xgindx+1 ));
267267
}
268268
else
@@ -343,8 +343,8 @@ void pdamax_( N, AMAX, INDX, X, IX, JX, DESCX, INCX )
343343
*/
344344
Xld = Xd[LLD_];
345345
Xlindx = Xjj - 1 +
346-
idamax_( &Xnq, ((char*)(X+(Xii+Xjj*Xld))), &Xld );
347-
*AMAX = X[Xii+Xlindx*Xld];
346+
idamax_( &Xnq, ((char*)Mptr(X,Xii,Xjj,Xld,1)), &Xld );
347+
*AMAX = *Mptr(X,Xii,Xlindx,Xld,1);
348348
}
349349
else
350350
{
@@ -419,9 +419,9 @@ void pdamax_( N, AMAX, INDX, X, IX, JX, DESCX, INCX )
419419
{
420420
Xld = Xd[LLD_];
421421
Xlindx = Xii - 1 +
422-
idamax_( &Xnp, ((char*)(X+(Xii+Xjj*Xld))), INCX );
422+
idamax_( &Xnp, ((char*)Mptr(X,Xii,Xjj,Xld,1)), INCX );
423423
Mindxl2g( Xgindx, Xlindx, Ximb, Xmb, myrow, Xsrc, nprow );
424-
work[0] = X[Xlindx+Xjj*Xld];
424+
work[0] = *Mptr(X,Xlindx,Xjj,Xld,1);
425425
work[1] = ((double)( Xgindx+1 ));
426426
}
427427
else
@@ -503,8 +503,8 @@ void pdamax_( N, AMAX, INDX, X, IX, JX, DESCX, INCX )
503503
*/
504504
Xld = Xd[LLD_];
505505
Xlindx = Xii - 1 +
506-
idamax_( &Xnp, ((char*)(X+(Xii+Xjj*Xld))), INCX );
507-
*AMAX = X[Xlindx+Xjj*Xld];
506+
idamax_( &Xnp, ((char*)Mptr(X,Xii,Xjj,Xld,1)), INCX );
507+
*AMAX = *Mptr(X,Xlindx,Xjj,Xld,1);
508508
}
509509
else
510510
{

PBLAS/SRC/pdasum_.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,7 @@ void pdasum_( N, ASUM, X, IX, JX, DESCX, INCX )
225225
if( ( ( myrow == Xrow ) || ( Xrow < 0 ) ) &&
226226
( ( mycol == Xcol ) || ( Xcol < 0 ) ) )
227227
{
228-
*ASUM = ABS( X[Xii+Xjj*Xd[LLD_]] );
228+
*ASUM = ABS( *Mptr(X,Xii,Xjj,Xd[LLD_],1) );
229229
}
230230
return;
231231
}
@@ -243,7 +243,7 @@ void pdasum_( N, ASUM, X, IX, JX, DESCX, INCX )
243243
if( Xnq > 0 )
244244
{
245245
Xld = Xd[LLD_];
246-
dvasum_( &Xnq, ((char *) ASUM), ((char *)( X+(Xii+Xjj*Xld) )),
246+
dvasum_( &Xnq, ((char *) ASUM), ((char *)Mptr( X,Xii,Xjj,Xld,1 )),
247247
&Xld );
248248
}
249249
/*
@@ -276,7 +276,7 @@ void pdasum_( N, ASUM, X, IX, JX, DESCX, INCX )
276276
if( Xnp > 0 )
277277
{
278278
dvasum_( &Xnp, ((char *) ASUM),
279-
((char *)( X+(Xii+Xjj*Xd[LLD_]) )), INCX );
279+
((char *)Mptr( X,Xii,Xjj,Xd[LLD_],1) ), INCX );
280280
}
281281
/*
282282
* If Xnp <= 0, ASUM is zero (see initialization above)

PBLAS/SRC/pdger_.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -286,7 +286,7 @@ void pdger_( M, N, ALPHA, X, IX, JX, DESCX, INCX, Y, IY, JY, DESCY,
286286
if( ( Amp > 0 ) && ( Anq > 0 ) )
287287
{
288288
dger_( &Amp, &Anq, ((char *) ALPHA), XA, &ione, YA, &YAd[LLD_],
289-
((char *) (A+(Aii+Ajj*Ald))), &Ald );
289+
((char *)Mptr(A,Aii,Ajj,Ald,1)), &Ald );
290290
}
291291
if( XAfr ) free( XA );
292292
if( YAfr ) free( YA );

PBLAS/SRC/pdnrm2_.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,7 @@ void pdnrm2_( N, NORM2, X, IX, JX, DESCX, INCX )
224224
*/
225225
if( ( ( myrow == Xrow ) || ( Xrow < 0 ) ) &&
226226
( ( mycol == Xcol ) || ( Xcol < 0 ) ) )
227-
*NORM2 = ABS( X[Xii+Xjj*Xd[LLD_]] );
227+
*NORM2 = ABS( *Mptr(X,Xii,Xjj,Xd[LLD_],1) );
228228
return;
229229
}
230230
else if( *INCX == Xd[M_] )
@@ -246,7 +246,7 @@ void pdnrm2_( N, NORM2, X, IX, JX, DESCX, INCX )
246246
if( Xnq > 0 )
247247
{
248248
Xld = Xd[LLD_];
249-
Xptr = X+(Xii+Xjj*Xld);
249+
Xptr = Mptr(X,Xii,Xjj,Xld,1);
250250

251251
for( k = 0; k < Xnq; k++ )
252252
{
@@ -366,7 +366,7 @@ void pdnrm2_( N, NORM2, X, IX, JX, DESCX, INCX )
366366
Xnp = PB_Cnumroc( *N, Xi, Xd[IMB_], Xd[MB_], myrow, Xd[RSRC_], nprow );
367367
if( Xnp > 0 )
368368
{
369-
Xptr = X+(Xii+Xjj*Xd[LLD_]);
369+
Xptr = Mptr(X,Xii,Xjj,Xd[LLD_],1);
370370

371371
for( k = 0; k < Xnp; k++ )
372372
{

PBLAS/SRC/pdscal_.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -210,12 +210,12 @@ void pdscal_( N, ALPHA, X, IX, JX, DESCX, INCX )
210210
Xld = Xd[LLD_];
211211
if( ALPHA[REAL_PART] == ZERO )
212212
{
213-
dset_( &Xnq, ((char *) ALPHA), ((char *)(X+(Xii+Xjj*Xld))),
213+
dset_( &Xnq, ((char *) ALPHA), ((char *)Mptr(X,Xii,Xjj,Xld,1)),
214214
&Xld );
215215
}
216216
else
217217
{
218-
dscal_( &Xnq, ((char *) ALPHA), ((char *)(X+(Xii+Xjj*Xld))),
218+
dscal_( &Xnq, ((char *) ALPHA), ((char *)Mptr(X,Xii,Xjj,Xld,1)),
219219
&Xld );
220220
}
221221
}
@@ -239,12 +239,12 @@ void pdscal_( N, ALPHA, X, IX, JX, DESCX, INCX )
239239
if( ALPHA[REAL_PART] == ZERO )
240240
{
241241
dset_( &Xnp, ((char *) ALPHA),
242-
((char *)( X+(Xii+Xjj*Xd[LLD_]) )), INCX );
242+
((char *)Mptr( X,Xii,Xjj,Xd[LLD_],1) ), INCX );
243243
}
244244
else
245245
{
246246
dscal_( &Xnp, ((char *) ALPHA),
247-
((char *)( X+(Xii+Xjj*Xd[LLD_]) )), INCX );
247+
((char *)Mptr( X,Xii,Xjj,Xd[LLD_],1) ), INCX );
248248
}
249249
}
250250
}

PBLAS/SRC/psamax_.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -260,7 +260,7 @@ void psamax_( N, AMAX, INDX, X, IX, JX, DESCX, INCX )
260260
{
261261
Xld = Xd[LLD_];
262262
Xlindx = Xjj - 1 +
263-
isamax_( &Xnq, ((char*)(X+(Xii+Xjj*Xld))), &Xld );
263+
isamax_( &Xnq, ((char*)(Mptr(X,Xii,Xjj,Xld,1))), &Xld );
264264
Mindxl2g( Xgindx, Xlindx, Xinb, Xnb, mycol, Xsrc, npcol );
265265
work[0] = X[Xii+Xlindx*Xld];
266266
work[1] = ((float )( Xgindx+1 ));
@@ -343,8 +343,8 @@ void psamax_( N, AMAX, INDX, X, IX, JX, DESCX, INCX )
343343
*/
344344
Xld = Xd[LLD_];
345345
Xlindx = Xjj - 1 +
346-
isamax_( &Xnq, ((char*)(X+(Xii+Xjj*Xld))), &Xld );
347-
*AMAX = X[Xii+Xlindx*Xld];
346+
isamax_( &Xnq, ((char*)(Mptr(X,Xii,Xjj,Xld, 1))), &Xld );
347+
*AMAX = *Mptr(X,Xii,Xlindx,Xld,1);
348348
}
349349
else
350350
{
@@ -419,9 +419,9 @@ void psamax_( N, AMAX, INDX, X, IX, JX, DESCX, INCX )
419419
{
420420
Xld = Xd[LLD_];
421421
Xlindx = Xii - 1 +
422-
isamax_( &Xnp, ((char*)(X+(Xii+Xjj*Xld))), INCX );
422+
isamax_( &Xnp, ((char*)Mptr(X,Xii,Xjj,Xld,1)), INCX );
423423
Mindxl2g( Xgindx, Xlindx, Ximb, Xmb, myrow, Xsrc, nprow );
424-
work[0] = X[Xlindx+Xjj*Xld];
424+
work[0] = *Mptr(X,Xlindx,Xjj,Xld,1);
425425
work[1] = ((float )( Xgindx+1 ));
426426
}
427427
else

PBLAS/SRC/psasum_.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,7 @@ void psasum_( N, ASUM, X, IX, JX, DESCX, INCX )
225225
if( ( ( myrow == Xrow ) || ( Xrow < 0 ) ) &&
226226
( ( mycol == Xcol ) || ( Xcol < 0 ) ) )
227227
{
228-
*ASUM = ABS( X[Xii+Xjj*Xd[LLD_]] );
228+
*ASUM = ABS( *Mptr(X,Xii,Xjj,Xd[LLD_],1) );
229229
}
230230
return;
231231
}
@@ -243,7 +243,7 @@ void psasum_( N, ASUM, X, IX, JX, DESCX, INCX )
243243
if( Xnq > 0 )
244244
{
245245
Xld = Xd[LLD_];
246-
svasum_( &Xnq, ((char *) ASUM), ((char *)( X+(Xii+Xjj*Xld) )),
246+
svasum_( &Xnq, ((char *) ASUM), ((char *)Mptr( X,Xii,Xjj,Xld,1) ),
247247
&Xld );
248248
}
249249
/*
@@ -276,7 +276,7 @@ void psasum_( N, ASUM, X, IX, JX, DESCX, INCX )
276276
if( Xnp > 0 )
277277
{
278278
svasum_( &Xnp, ((char *) ASUM),
279-
((char *)( X+(Xii+Xjj*Xd[LLD_]) )), INCX );
279+
((char *)Mptr( X,Xii,Xjj,Xd[LLD_],1) ), INCX );
280280
}
281281
/*
282282
* If Xnp <= 0, ASUM is zero (see initialization above)

PBLAS/SRC/psger_.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -286,7 +286,7 @@ void psger_( M, N, ALPHA, X, IX, JX, DESCX, INCX, Y, IY, JY, DESCY,
286286
if( ( Amp > 0 ) && ( Anq > 0 ) )
287287
{
288288
sger_( &Amp, &Anq, ((char *) ALPHA), XA, &ione, YA, &YAd[LLD_],
289-
((char *) (A+(Aii+Ajj*Ald))), &Ald );
289+
((char *)Mptr(A,Aii,Ajj,Ald,1)), &Ald );
290290
}
291291
if( XAfr ) free( XA );
292292
if( YAfr ) free( YA );

PBLAS/SRC/psnrm2_.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,7 @@ void psnrm2_( N, NORM2, X, IX, JX, DESCX, INCX )
224224
*/
225225
if( ( ( myrow == Xrow ) || ( Xrow < 0 ) ) &&
226226
( ( mycol == Xcol ) || ( Xcol < 0 ) ) )
227-
*NORM2 = ABS( X[Xii+Xjj*Xd[LLD_]] );
227+
*NORM2 = ABS( *Mptr(X,Xii,Xjj,Xd[LLD_],1) );
228228
return;
229229
}
230230
else if( *INCX == Xd[M_] )
@@ -246,7 +246,7 @@ void psnrm2_( N, NORM2, X, IX, JX, DESCX, INCX )
246246
if( Xnq > 0 )
247247
{
248248
Xld = Xd[LLD_];
249-
Xptr = X+(Xii+Xjj*Xld);
249+
Xptr = Mptr(X,Xii,Xjj,Xld,1);
250250

251251
for( k = 0; k < Xnq; k++ )
252252
{
@@ -366,7 +366,7 @@ void psnrm2_( N, NORM2, X, IX, JX, DESCX, INCX )
366366
Xnp = PB_Cnumroc( *N, Xi, Xd[IMB_], Xd[MB_], myrow, Xd[RSRC_], nprow );
367367
if( Xnp > 0 )
368368
{
369-
Xptr = X+(Xii+Xjj*Xd[LLD_]);
369+
Xptr = Mptr(X,Xii,Xjj,Xd[LLD_],1);
370370

371371
for( k = 0; k < Xnp; k++ )
372372
{

PBLAS/SRC/psscal_.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -210,12 +210,12 @@ void psscal_( N, ALPHA, X, IX, JX, DESCX, INCX )
210210
Xld = Xd[LLD_];
211211
if( ALPHA[REAL_PART] == ZERO )
212212
{
213-
sset_( &Xnq, ((char *) ALPHA), ((char *)(X+(Xii+Xjj*Xld))),
213+
sset_( &Xnq, ((char *) ALPHA), ((char *)Mptr(X,Xii,Xjj,Xld,1)),
214214
&Xld );
215215
}
216216
else
217217
{
218-
sscal_( &Xnq, ((char *) ALPHA), ((char *)(X+(Xii+Xjj*Xld))),
218+
sscal_( &Xnq, ((char *) ALPHA), ((char *)Mptr(X,Xii,Xjj,Xld,1)),
219219
&Xld );
220220
}
221221
}
@@ -239,12 +239,12 @@ void psscal_( N, ALPHA, X, IX, JX, DESCX, INCX )
239239
if( ALPHA[REAL_PART] == ZERO )
240240
{
241241
sset_( &Xnp, ((char *) ALPHA),
242-
((char *)( X+(Xii+Xjj*Xd[LLD_]) )), INCX );
242+
((char *)Mptr( X,Xii,Xjj,Xd[LLD_],1) ), INCX );
243243
}
244244
else
245245
{
246246
sscal_( &Xnp, ((char *) ALPHA),
247-
((char *)( X+(Xii+Xjj*Xd[LLD_]) )), INCX );
247+
((char *)Mptr( X,Xii,Xjj,Xd[LLD_],1 )), INCX );
248248
}
249249
}
250250
}

0 commit comments

Comments
 (0)