All of lore.kernel.org
 help / color / mirror / Atom feed
From: Greg KH <gregkh@suse.de>
To: linux-kernel@vger.kernel.org, stable@kernel.org
Cc: Justin Forbes <jmforbes@linuxtx.org>,
	Zwane Mwaikambo <zwane@arm.linux.org.uk>,
	"Theodore Ts'o" <tytso@mit.edu>,
	Randy Dunlap <rdunlap@xenotime.net>,
	Dave Jones <davej@redhat.com>,
	Chuck Wolber <chuckw@quantumlinux.com>,
	Chris Wedgwood <reviews@ml.cw.f00f.org>,
	Michael Krufky <mkrufky@linuxtv.org>,
	Chuck Ebbert <cebbert@redhat.com>,
	Domenico Andreoli <cavokz@gmail.com>,
	torvalds@linux-foundation.org, akpm@linux-foundation.org,
	alan@lxorguk.ukuu.org.uk,
	Jason Wessel <jason.wessel@windriver.com>,
	Jeremy Fitzhardinge <jeremy@goop.org>,
	Chris Wright <chrisw@sous-sol.org>,
	Greg Kroah-Hartman <gregkh@suse.de>
Subject: [patch 22/26] i386: fix infinite loop with singlestep int80 syscalls
Date: Mon, 30 Jul 2007 21:33:43 -0700	[thread overview]
Message-ID: <20070731043343.GW3975@kroah.com> (raw)
In-Reply-To: <20070731043047.GA3975@kroah.com>

[-- Attachment #1: i386-fix-infinite-loop-with-singlestep-int80-syscalls.patch --]
[-- Type: text/plain, Size: 2921 bytes --]

-stable review patch.  If anyone has any objections, please let us know.

------------------

The commit 635cf99a80f4ebee59d70eb64bb85ce829e4591f introduced a
regression.  Executing a ptrace single step after certain int80
accesses will infinitely loop and never advance the PC.

The TIF_SINGLESTEP check should be done on the return from the syscall
and not before it.

The new test case is below:

/* Test whether singlestep through an int80 syscall works.
 */
#define _GNU_SOURCE
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ptrace.h>
#include <sys/wait.h>
#include <sys/mman.h>
#include <asm/user.h>
#include <string.h>

static int child, status;
static struct user_regs_struct regs;

static void do_child()
{
	char str[80] = "child: int80 test\n";

	ptrace(PTRACE_TRACEME, 0, 0, 0);
	kill(getpid(), SIGUSR1);
	write(fileno(stdout),str,strlen(str));
	asm ("int $0x80" : : "a" (20)); /* getpid */
}
    
static void do_parent()
{
	unsigned long eip, expected = 0;
again:
	waitpid(child, &status, 0);
	if (WIFEXITED(status) || WIFSIGNALED(status))
		return;
    
	if (WIFSTOPPED(status)) {
		ptrace(PTRACE_GETREGS, child, 0, &regs);
		eip = regs.eip;
		if (expected)
			fprintf(stderr, "child stop @ %08lx, expected %08lx %s\n",
					eip, expected,
					eip == expected ? "" : " <== ERROR");
    
		if (*(unsigned short *)eip == 0x80cd) {
			fprintf(stderr, "int 0x80 at %08x\n", (unsigned int)eip);
			expected = eip + 2;
		} else
			expected = 0;
    
		ptrace(PTRACE_SINGLESTEP, child, NULL, NULL);
	}
	goto again;
}
    
int main(int argc, char * const argv[])
{
	child = fork();
	if (child)
		do_parent();
	else
		do_child();
	return 0;
}


Signed-off-by: Jason Wessel <jason.wessel@windriver.com>
Cc: Jeremy Fitzhardinge <jeremy@goop.org>
Cc: Chuck Ebbert <cebbert@redhat.com>
Signed-off-by: Chris Wright <chrisw@sous-sol.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
 arch/i386/kernel/entry.S |    8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

--- linux-2.6.21.6.orig/arch/i386/kernel/entry.S
+++ linux-2.6.21.6/arch/i386/kernel/entry.S
@@ -371,10 +371,6 @@ ENTRY(system_call)
 	CFI_ADJUST_CFA_OFFSET 4
 	SAVE_ALL
 	GET_THREAD_INFO(%ebp)
-	testl $TF_MASK,PT_EFLAGS(%esp)
-	jz no_singlestep
-	orl $_TIF_SINGLESTEP,TI_flags(%ebp)
-no_singlestep:
 					# system call tracing in operation / emulation
 	/* Note, _TIF_SECCOMP is bit number 8, and so it needs testw and not testb */
 	testw $(_TIF_SYSCALL_EMU|_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT),TI_flags(%ebp)
@@ -389,6 +385,10 @@ syscall_exit:
 					# setting need_resched or sigpending
 					# between sampling and the iret
 	TRACE_IRQS_OFF
+	testl $TF_MASK,PT_EFLAGS(%esp)	# If tracing set singlestep flag on exit
+	jz no_singlestep
+	orl $_TIF_SINGLESTEP,TI_flags(%ebp)
+no_singlestep:
 	movl TI_flags(%ebp), %ecx
 	testw $_TIF_ALLWORK_MASK, %cx	# current->work
 	jne syscall_exit_work

-- 

  parent reply	other threads:[~2007-07-31  4:39 UTC|newest]

Thread overview: 33+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <20070731042108.546594256@blue.kroah.org>
2007-07-31  4:30 ` [patch 00/26] 2.6.21.7 -stable review Greg KH
2007-07-31  4:31   ` [patch 01/26] BNX2: Fix netdev watchdog on 5708 Greg KH
2007-07-31  4:31   ` [patch 02/26] sparsemem: fix oops in x86_64 show_mem Greg KH
2007-07-31  4:31   ` [patch 03/26] rt-mutex: Fix stale return value Greg KH
2007-07-31  4:31   ` [patch 04/26] rt-mutex: Fix chain walk early wakeup bug Greg KH
2007-07-31  4:31   ` [patch 05/26] pi-futex: Fix exit races and locking problems Greg KH
2007-07-31  4:31   ` [patch 06/26] hpt366: disallow Ultra133 for HPT374 Greg KH
2007-07-31  4:31   ` [patch 07/26] md: Fix two raid10 bugs Greg KH
2007-07-31  4:32   ` [patch 08/26] md: Fix bug in error handling during raid1 repair Greg KH
2007-07-31  4:32   ` [patch 09/26] dm crypt: disable barriers Greg KH
2007-07-31  4:32   ` [patch 10/26] dm crypt: fix call to clone_init Greg KH
2007-07-31  4:32   ` [patch 11/26] dm crypt: fix avoid cloned bio ref after free Greg KH
2007-07-31  4:32   ` [patch 12/26] dm crypt: fix remove first_clone Greg KH
2007-07-31  4:32   ` [patch 13/26] hugetlb: fix get_policy for stacked shared memory files Greg KH
2007-07-31  4:32   ` [patch 14/26] sched: fix next_interval determination in idle_balance() Greg KH
2007-07-31 15:02     ` Paul E. McKenney
2007-07-31  4:32   ` [patch 15/26] posix-timers: Prevent softirq starvation by small intervals and SIG_IGN Greg KH
2007-07-31  4:33   ` [patch 16/26] FUTEX: Restore the dropped ERSCH fix Greg KH
2007-07-31  4:33   ` [patch 17/26] audit: fix oops removing watch if audit disabled Greg KH
2007-07-31  4:33   ` [patch 18/26] POWERPC: Fix subtle FP state corruption bug in signal return on SMP Greg KH
2007-07-31  4:33   ` [patch 19/26] mm: kill validate_anon_vma to avoid mapcount BUG Greg KH
2007-07-31  4:33   ` [patch 20/26] saa7134: fix thread shutdown handling Greg KH
2007-07-31  5:05     ` Mauro Carvalho Chehab
2007-07-31  5:16       ` Greg KH
2007-07-31  4:33   ` [patch 21/26] serial: clear proper MPSC interrupt cause bits Greg KH
2007-07-31  4:33   ` Greg KH [this message]
2007-07-31  4:33   ` [patch 23/26] NTP: remove clock_was_set() call to prevent deadlock Greg KH
2007-07-31  4:33   ` [patch 24/26] sky2: workaround for lost IRQ Greg KH
2007-07-31  4:33   ` [patch 25/26] V4L: bttv: fix v4l1 api usage breaking the driver Greg KH
2007-07-31  4:34   ` [patch 26/26] V4L: cx88-blackbird: fix vidioc_g_tuner never ending list of tuners Greg KH
2007-07-31  4:43   ` [patch 00/26] 2.6.21.7 -stable review Greg KH
2007-07-31 10:50     ` Stefan Richter
2007-07-31 19:47       ` Greg KH

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20070731043343.GW3975@kroah.com \
    --to=gregkh@suse.de \
    --cc=akpm@linux-foundation.org \
    --cc=alan@lxorguk.ukuu.org.uk \
    --cc=cavokz@gmail.com \
    --cc=cebbert@redhat.com \
    --cc=chrisw@sous-sol.org \
    --cc=chuckw@quantumlinux.com \
    --cc=davej@redhat.com \
    --cc=jason.wessel@windriver.com \
    --cc=jeremy@goop.org \
    --cc=jmforbes@linuxtx.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mkrufky@linuxtv.org \
    --cc=rdunlap@xenotime.net \
    --cc=reviews@ml.cw.f00f.org \
    --cc=stable@kernel.org \
    --cc=torvalds@linux-foundation.org \
    --cc=tytso@mit.edu \
    --cc=zwane@arm.linux.org.uk \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.