@@ -123,18 +123,29 @@ int __wrap_main(int argc, char *argv[], char *envp[]) {
123
123
}
124
124
setenvd ("DCC_VALGRIND_RUNNING" , "1" );
125
125
126
- char fd_buffer [1024 ];
127
- sprintf (fd_buffer , "--log-fd=%d" , valgrind_error_fd );
128
- char * valgrind_command [] = {"/usr/bin/valgrind" , "-q" , "--vgdb=yes" , "--leak-check=__DCC_LEAK_CHECK_YES_NO__" , "--suppressions=__DCC_SUPRESSIONS_FILE__" , "--max-stackframe=16000000" , "--partial-loads-ok=no" , fd_buffer , "--vgdb-error=1" };
126
+ char fd_buffer [64 ];
127
+ snprintf (fd_buffer , sizeof fd_buffer , "--log-fd=%d" , valgrind_error_fd );
128
+ char * valgrind_command [] = {
129
+ "/usr/bin/valgrind" ,
130
+ fd_buffer ,
131
+ "-q" ,
132
+ "--vgdb=yes" ,
133
+ "--leak-check=__DCC_LEAK_CHECK_YES_NO__" ,
134
+ "--suppressions=__DCC_SUPRESSIONS_FILE__" ,
135
+ "--max-stackframe=16000000" ,
136
+ "--partial-loads-ok=no" ,
137
+ "--malloc-fill=0xbe" ,
138
+ "--free-fill=0xbe" ,
139
+ "--vgdb-error=1"
140
+ };
129
141
130
142
int valgrind_command_len = sizeof valgrind_command / sizeof valgrind_command [0 ];
131
- char * valgrind_argv [argc + 1 + valgrind_command_len ];
143
+ char * valgrind_argv [valgrind_command_len + argc + 1 ];
132
144
for (int i = 0 ; i < valgrind_command_len ; i ++ )
133
145
valgrind_argv [i ] = valgrind_command [i ];
134
- valgrind_argv [valgrind_command_len ] = argv [0 ];
135
- for (int i = 1 ; i < argc ; i ++ )
136
- valgrind_argv [i + valgrind_command_len ] = argv [i ];
137
- valgrind_argv [argc + valgrind_command_len ] = NULL ;
146
+ for (int i = 0 ; i < argc ; i ++ )
147
+ valgrind_argv [valgrind_command_len + i ] = argv [i ];
148
+ valgrind_argv [valgrind_command_len + argc ] = NULL ;
138
149
139
150
execvp ("/usr/bin/valgrind" , valgrind_argv );
140
151
@@ -237,33 +248,26 @@ extern void __ubsan_get_current_report_data(char **OutIssueKind, char **OutMessa
237
248
238
249
void __ubsan_on_report (void ) {
239
250
if (debug ) fprintf (stderr , "__ubsan_on_report\n" );
251
+
240
252
char * OutIssueKind ;
241
253
char * OutMessage ;
242
254
char * OutFilename ;
243
255
unsigned int OutLine ;
244
256
unsigned int OutCol ;
245
257
char * OutMemoryAddr ;
246
258
__ubsan_get_current_report_data (& OutIssueKind , & OutMessage , & OutFilename , & OutLine , & OutCol , & OutMemoryAddr );
247
- // buffers + putenv is ugly - but safer?
248
- char buffer0 [128 ];
249
- snprintf (buffer0 , sizeof buffer0 , "DCC_UBSAN_ERROR_KIND=%s" , OutIssueKind );
250
- putenvd (buffer0 );
251
- char buffer1 [4096 ];
252
- snprintf (buffer1 , sizeof buffer1 , "DCC_UBSAN_ERROR_MESSAGE=%s" , OutMessage );
253
- putenvd (buffer1 );
254
- char buffer2 [4096 ];
255
- snprintf (buffer2 , sizeof buffer2 , "DCC_UBSAN_ERROR_FILENAME=%s" , OutFilename );
256
- putenvd (buffer2 );
257
- char buffer3 [128 ];
258
- snprintf (buffer3 , sizeof buffer3 , "DCC_UBSAN_ERROR_LINE=%u" , OutLine );
259
- putenvd (buffer3 );
260
- char buffer4 [128 ];
261
- snprintf (buffer4 , sizeof buffer4 , "DCC_UBSAN_ERROR_COL=%u" , OutCol );
262
- putenvd (buffer4 );
263
- char buffer5 [128 ];
264
- snprintf (buffer5 , sizeof buffer5 , "DCC_UBSAN_ERROR_MEMORYADDR=%s" , OutMemoryAddr );
265
- putenvd (buffer5 );
266
-
259
+
260
+ // buffer + putenv is ugly - but safer?
261
+ char buffer [6 ][128 ];
262
+ snprintf (buffer [0 ], sizeof buffer [0 ], "DCC_UBSAN_ERROR_KIND=%s" , OutIssueKind );
263
+ snprintf (buffer [1 ], sizeof buffer [1 ], "DCC_UBSAN_ERROR_MESSAGE=%s" , OutMessage );
264
+ snprintf (buffer [2 ], sizeof buffer [2 ], "DCC_UBSAN_ERROR_FILENAME=%s" , OutFilename );
265
+ snprintf (buffer [3 ], sizeof buffer [3 ], "DCC_UBSAN_ERROR_LINE=%u" , OutLine );
266
+ snprintf (buffer [4 ], sizeof buffer [4 ], "DCC_UBSAN_ERROR_COL=%u" , OutCol );
267
+ snprintf (buffer [5 ], sizeof buffer [5 ], "DCC_UBSAN_ERROR_MEMORYADDR=%s" , OutMemoryAddr );
268
+ for (int i = 0 ; i < sizeof buffer /sizeof buffer [0 ]; i ++ )
269
+ putenv (buffer [i ]);
270
+
267
271
_explain_error ();
268
272
// not reached
269
273
}
@@ -288,8 +292,8 @@ static void _signal_handler(int signum) {
288
292
signal (SIGFPE , SIG_IGN );
289
293
signal (SIGILL , SIG_IGN );
290
294
291
- char signum_buffer [1024 ];
292
- sprintf ( signum_buffer , "DCC_SIGNAL=%d" , (int )signum );
295
+ char signum_buffer [64 ];
296
+ snprintf ( signum_buffer , sizeof signum_buffer , "DCC_SIGNAL=%d" , (int )signum );
293
297
putenvd (signum_buffer ); // less likely? to trigger another error than direct setenv
294
298
295
299
_explain_error ();
0 commit comments