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 ChangeLog common/linux-ptrace.c


CVSROOT:	/cvs/src
Module name:	src
Changes by:	palves@sourceware.org	2013-10-03 10:13:34

Modified files:
	gdb            : ChangeLog 
	gdb/common     : linux-ptrace.c 

Log message:
	Always run the PTRACE_O_TRACESYSGOOD tests even if PTRACE_O_TRACEFORK is not supported.
	
	If enabling PTRACE_O_TRACEFORK fails, we never test for
	PTRACE_O_TRACESYSGOOD support.  Before PTRACE_O_TRACESYSGOOD is checked,
	we have:
	
	/* First, set the PTRACE_O_TRACEFORK option.  If this fails, we
	know for sure that it is not supported.  */
	ret = ptrace (PTRACE_SETOPTIONS, child_pid, (PTRACE_TYPE_ARG3) 0,
	(PTRACE_TYPE_ARG4) PTRACE_O_TRACEFORK);
	
	if (ret != 0)
	{
	ret = ptrace (PTRACE_KILL, child_pid, (PTRACE_TYPE_ARG3) 0,
	(PTRACE_TYPE_ARG4) 0);
	if (ret != 0)
	{
	warning (_("linux_check_ptrace_features: failed to kill child"));
	return;
	}
	
	ret = my_waitpid (child_pid, &status, 0);
	if (ret != child_pid)
	warning (_("linux_check_ptrace_features: failed "
	"to wait for killed child"));
	else if (!WIFSIGNALED (status))
	warning (_("linux_check_ptrace_features: unexpected "
	"wait status 0x%x from killed child"), status);
	
	return; <<<<<<<<<<<<<<<<<
	}
	
	Note that early return.  If PTRACE_O_TRACEFORK isn't supported, we're
	not checking PTRACE_O_TRACESYSGOOD.  This didn't use to be a problem
	before the unification of this whole detection business in
	linux-ptrace.c.  Before, the sysgood detection was completely
	separate:
	
	static void
	linux_test_for_tracesysgood (int original_pid)
	{
	int ret;
	sigset_t prev_mask;
	
	/* We don't want those ptrace calls to be interrupted.  */
	block_child_signals (&prev_mask);
	
	linux_supports_tracesysgood_flag = 0;
	
	ret = ptrace (PTRACE_SETOPTIONS, original_pid, 0, PTRACE_O_TRACESYSGOOD);
	if (ret != 0)
	goto out;
	
	linux_supports_tracesysgood_flag = 1;
	out:
	restore_child_signals_mask (&prev_mask);
	}
	
	So we need to get back the decoupling somehow.  I think it's cleaner
	to split the seperate feature detections to separate functions.  This
	patch does that.  The new functions are named for their counterparts
	that existed before this code was moved to linux-ptrace.c.
	
	Note I've used forward declarations for the new functions to make the
	patch clearer, as otherwise the patch would look like I'd be adding a
	bunch of new code.  A reorder can be done in a follow up patch.
	
	Tested on x86_64 Fedora 17.
	
	gdb/
	2013-10-03  Pedro Alves  <palves@redhat.com>
	
	* common/linux-ptrace.c (linux_check_ptrace_features): Factor out
	the PTRACE_O_TRACESYSGOOD and PTRACE_O_TRACEFORK to separate
	functions.  Always test for PTRACE_O_TRACESYSGOOD even if
	PTRACE_O_TRACEFORK is not supported.
	(linux_test_for_tracesysgood): New function.
	(linux_test_for_tracefork): New function, factored out from
	linux_check_ptrace_features, and also don't kill child_pid here.

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gdb/ChangeLog.diff?cvsroot=src&r1=1.16065&r2=1.16066
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gdb/common/linux-ptrace.c.diff?cvsroot=src&r1=1.12&r2=1.13


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