~ chicken-core (chicken-5) 636f245fa9588e48a3f5d5cf5ff348acafd784c1
commit 636f245fa9588e48a3f5d5cf5ff348acafd784c1
Author: Evan Hanson <evhan@foldling.org>
AuthorDate: Sun Dec 2 14:19:08 2018 +1300
Commit: felix <felix@call-with-current-continuation.org>
CommitDate: Tue Dec 4 18:34:25 2018 +0100
Fix empty line and memory leak in debugger GET_TRACE replies
Previously, all of the debugger's trace responses would include an empty
string in addition to the "real" entries, and the memory allocated for
the trace dump itself was never freed. The first issue is fixed by
sending only the newline-terminated chunks of the trace buffer (which
avoids including the empty string between the final newline and the
subsequent null terminator), and the second issue is fixed by simply
freeing the trace buffer at the end.
Signed-off-by: felix <felix@call-with-current-continuation.org>
diff --git a/dbg-stub.c b/dbg-stub.c
index 71051f09..feed4980 100644
--- a/dbg-stub.c
+++ b/dbg-stub.c
@@ -461,23 +461,17 @@ send_event(int event, C_char *loc, C_char *val, C_char *cloc)
break;
case C_DEBUG_REPLY_GET_TRACE:
- str = C_dump_trace(0);
- C_strlcpy(rw_buffer, "(* \"", sizeof(rw_buffer));
- ptr = rw_buffer + 4;
-
- while(*str != '\0') {
- if(*str == '\n') {
- C_strlcpy(ptr, "\")\n", 4);
- send_string(rw_buffer);
- C_strlcpy(rw_buffer, "(* \"", sizeof(rw_buffer));
- ptr = rw_buffer + 4;
- ++str;
- }
- else *(ptr++) = *(str++);
+ str = ptr = C_dump_trace(0);
+
+ while((n = C_strcspn(ptr, "\n"))) {
+ ptr[ n++ ] = '\0';
+ send_string("(* \"");
+ send_string(ptr);
+ send_string("\")\n");
+ ptr += n;
}
- C_strlcpy(ptr, "\")\n", 4);
- send_string(rw_buffer);
+ free(str);
break;
default: terminate("invalid reply code");
Trap