Skip to content

Commit 52f476d

Browse files
nmoreyraffenet
authored andcommitted
romio: test: fix bad snprintf arguments
Even though there can not be a buffer overflow as the string is properly sized, noncontig_coll2 fails when built with -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=3 : ---- FAIL: noncontig_coll2 ===================== Thread 1 "noncontig_coll2" received signal SIGABRT, Aborted. 0x00007ffff709c5fc in __pthread_kill_implementation () from /lib64/libc.so.6 (gdb) bt #0 0x00007ffff709c5fc in __pthread_kill_implementation () from /lib64/libc.so.6 #1 0x00007ffff7042106 in raise () from /lib64/libc.so.6 #2 0x00007ffff702938b in abort () from /lib64/libc.so.6 pmodels#3 0x00007ffff702a3ab in __libc_message_impl.cold () from /lib64/libc.so.6 pmodels#4 0x00007ffff712b4fb in __fortify_fail () from /lib64/libc.so.6 pmodels#5 0x00007ffff712adc6 in __chk_fail () from /lib64/libc.so.6 pmodels#6 0x00007ffff712c8f5 in __snprintf_chk () from /lib64/libc.so.6 pmodels#7 0x000000000040275e in snprintf (__s=0x4aafee "", __n=<optimized out>, __fmt=0x404077 "%s,") at /usr/include/bits/stdio2.h:68 pmodels#8 default_str (mynod=<optimized out>, len=61, array=0x59fca0, dest=0x4aafd0 "hostname,") at src/mpi/romio/test/noncontig_coll2.c:189 pmodels#9 main (argc=<optimized out>, argv=<optimized out>) at src/mpi/romio/test/noncontig_coll2.c:330 ---- This is due to the len parameter of snprintf not being updated as we advance in the string. Fix this issue by introducing a remaining len var that contains the exact amount of bytes left. Signed-off-by: Nicolas Morey <[email protected]>
1 parent 6907eb8 commit 52f476d

File tree

1 file changed

+20
-10
lines changed

1 file changed

+20
-10
lines changed

src/mpi/romio/test/noncontig_coll2.c

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -181,12 +181,14 @@ int cb_gather_name_array(MPI_Comm comm, ADIO_cb_name_array * arrayp)
181181
void default_str(int mynod, int len, ADIO_cb_name_array array, char *dest)
182182
{
183183
char *ptr;
184-
int i, p;
184+
int i, p, rlen;
185185
if (!mynod) {
186186
ptr = dest;
187+
rlen = len;
187188
for (i = 0; i < array->namect; i++) {
188-
p = snprintf(ptr, len, "%s,", array->names[i]);
189+
p = snprintf(ptr, rlen, "%s,", array->names[i]);
189190
ptr += p;
191+
rlen = rlen - p;
190192
}
191193
/* chop off that last comma */
192194
dest[strlen(dest) - 1] = '\0';
@@ -197,12 +199,14 @@ void default_str(int mynod, int len, ADIO_cb_name_array array, char *dest)
197199
void reverse_str(int mynod, int len, ADIO_cb_name_array array, char *dest)
198200
{
199201
char *ptr;
200-
int i, p;
202+
int i, p, rlen;
201203
if (!mynod) {
202204
ptr = dest;
205+
rlen = len;
203206
for (i = (array->namect - 1); i >= 0; i--) {
204-
p = snprintf(ptr, len, "%s,", array->names[i]);
207+
p = snprintf(ptr, rlen, "%s,", array->names[i]);
205208
ptr += p;
209+
rlen = rlen - p;
206210
}
207211
dest[strlen(dest) - 1] = '\0';
208212
}
@@ -212,18 +216,21 @@ void reverse_str(int mynod, int len, ADIO_cb_name_array array, char *dest)
212216
void reverse_alternating_str(int mynod, int len, ADIO_cb_name_array array, char *dest)
213217
{
214218
char *ptr;
215-
int i, p;
219+
int i, p, rlen;
216220
if (!mynod) {
217221
ptr = dest;
222+
rlen = len;
218223
/* evens */
219224
for (i = (array->namect - 1); i >= 0; i -= 2) {
220-
p = snprintf(ptr, len, "%s,", array->names[i]);
225+
p = snprintf(ptr, rlen, "%s,", array->names[i]);
221226
ptr += p;
227+
rlen = rlen - p;
222228
}
223229
/* odds */
224230
for (i = (array->namect - 2); i > 0; i -= 2) {
225-
p = snprintf(ptr, len, "%s,", array->names[i]);
231+
p = snprintf(ptr, rlen, "%s,", array->names[i]);
226232
ptr += p;
233+
rlen = rlen - p;
227234
}
228235
dest[strlen(dest) - 1] = '\0';
229236
}
@@ -233,16 +240,19 @@ void reverse_alternating_str(int mynod, int len, ADIO_cb_name_array array, char
233240
void simple_shuffle_str(int mynod, int len, ADIO_cb_name_array array, char *dest)
234241
{
235242
char *ptr;
236-
int i, p;
243+
int i, p, rlen;
237244
if (!mynod) {
238245
ptr = dest;
246+
rlen = len;
239247
for (i = (array->namect / 2); i < array->namect; i++) {
240-
p = snprintf(ptr, len, "%s,", array->names[i]);
248+
p = snprintf(ptr, rlen, "%s,", array->names[i]);
241249
ptr += p;
250+
rlen = rlen - p;
242251
}
243252
for (i = 0; i < (array->namect / 2); i++) {
244-
p = snprintf(ptr, len, "%s,", array->names[i]);
253+
p = snprintf(ptr, rlen, "%s,", array->names[i]);
245254
ptr += p;
255+
rlen = rlen - p;
246256
}
247257
dest[strlen(dest) - 1] = '\0';
248258
}

0 commit comments

Comments
 (0)