Skip to content

Commit 3031696

Browse files
committed
add malloc-fill and free-fill to valgrind options
1 parent ddcb14c commit 3031696

File tree

1 file changed

+34
-30
lines changed

1 file changed

+34
-30
lines changed

main_wrapper.c

Lines changed: 34 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -123,18 +123,29 @@ int __wrap_main(int argc, char *argv[], char *envp[]) {
123123
}
124124
setenvd("DCC_VALGRIND_RUNNING", "1");
125125

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+
};
129141

130142
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];
132144
for (int i = 0; i < valgrind_command_len; i++)
133145
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;
138149

139150
execvp("/usr/bin/valgrind", valgrind_argv);
140151

@@ -237,33 +248,26 @@ extern void __ubsan_get_current_report_data(char **OutIssueKind, char **OutMessa
237248

238249
void __ubsan_on_report(void) {
239250
if (debug) fprintf(stderr, "__ubsan_on_report\n");
251+
240252
char *OutIssueKind;
241253
char *OutMessage;
242254
char *OutFilename;
243255
unsigned int OutLine;
244256
unsigned int OutCol;
245257
char *OutMemoryAddr;
246258
__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+
267271
_explain_error();
268272
// not reached
269273
}
@@ -288,8 +292,8 @@ static void _signal_handler(int signum) {
288292
signal(SIGFPE, SIG_IGN);
289293
signal(SIGILL, SIG_IGN);
290294

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);
293297
putenvd(signum_buffer); // less likely? to trigger another error than direct setenv
294298

295299
_explain_error();

0 commit comments

Comments
 (0)