This is the mail archive of the gdb-cvs@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

src/gdb/gdbserver ChangeLog tracepoint.c


CVSROOT:	/cvs/src
Module name:	src
Changes by:	palves@sourceware.org	2013-09-02 15:15:57

Modified files:
	gdb/gdbserver  : ChangeLog tracepoint.c 

Log message:
	[gdbserver] Fix trace-buffer-size.exp FAILs.
	
	I'm seeing trace-buffer-size.exp failing (with gdbserver):
	
	(gdb) PASS: gdb.trace/trace-buffer-size.exp: tstatus check 2
	show trace-buffer-size 4
	Requested size of trace buffer is 4.
	(gdb) PASS: gdb.trace/trace-buffer-size.exp: show trace buffer size
	set trace-buffer-size -1
	memory clobbered past end of allocated block
	Remote connection closed
	(gdb) FAIL: gdb.trace/trace-buffer-size.exp: set trace buffer size 2
	set trace-buffer-size unlimited
	(gdb) PASS: gdb.trace/trace-buffer-size.exp: set trace-buffer-size unlimited
	
	That "memory clobbered past end of allocated block" is mcheck triggering.
	
	Valgrind shows:
	
	==23624== Invalid write of size 1
	==23624==    at 0x418DD8: clear_trace_buffer (tracepoint.c:1443)
	==23624==    by 0x418F3A: init_trace_buffer (tracepoint.c:1497)
	==23624==    by 0x41D95B: cmd_bigqtbuffer_size (tracepoint.c:4061)
	==23624==    by 0x41DEEC: handle_tracepoint_general_set (tracepoint.c:4193)
	
	clear_trace_buffer does:
	
	static void
	clear_trace_buffer (void)
	{
	trace_buffer_start = trace_buffer_lo;
	trace_buffer_free = trace_buffer_lo;
	trace_buffer_end_free = trace_buffer_hi;
	trace_buffer_wrap = trace_buffer_hi;
	/* A traceframe with zeroed fields marks the end of trace data.  */
	((struct traceframe *) trace_buffer_free)->tpnum = 0;
	((struct traceframe *) trace_buffer_free)->data_size = 0;
	traceframe_read_count = traceframe_write_count = 0;
	traceframes_created = 0;
	}
	
	And the tpnum+data_size fields are over 4 bytes...  This fixes it by
	ensuring we allocate space at least for an EOB.  We have code
	elsewhere that relies on the EOB being present (like e.g.,
	find_traceframe), so this seems simplest.
	
	gdb/gdbserver/
	2013-09-02  Pedro Alves  <palves@redhat.com>
	
	* tracepoint.c (TRACEFRAME_EOB_MARKER_SIZE): New macro.
	(init_trace_buffer): Ensure at least TRACEFRAME_EOB_MARKER_SIZE is
	allocated.
	(trace_buffer_alloc): Use TRACEFRAME_EOB_MARKER_SIZE.

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gdb/gdbserver/ChangeLog.diff?cvsroot=src&r1=1.753&r2=1.754
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gdb/gdbserver/tracepoint.c.diff?cvsroot=src&r1=1.81&r2=1.82


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]