From: John Blackwood <john.blackwood@ccur.com>
To: Neil Horman <nhorman@tuxdriver.com>
Cc: linux-rt-users@vger.kernel.org, linux-kernel@vger.kernel.org,
Sven-Thorsten Dietrich <sdietrich@novell.com>,
Gregory Haskins <ghaskins@novell.com>,
Tom Horsley <tom.horsley@ccur.com>
Subject: Re: [PATCH] select: fix sys_select to not leak ERESTARTNOHAND to userspace
Date: Fri, 17 Aug 2007 11:41:20 -0400 [thread overview]
Message-ID: <46C5C1A0.7060708@ccur.com> (raw)
Hi Neil,
We've been having problems with this select patch change.
Specifically -- previously, when a ptrace attach was done to a task
blocked in a select() call and that task had a timeout value,
the task would restart the select() call with an updated timeout value.
With this patch in place, the task now instead returns EINTR.
A test that shows this issue is provided below.
We also confirmed that attaching to a program sitting
in select() with gdb makes the select get an EINTR, so this
behavior also shows up in gdb.
Thank you for your considerations in this matter.
------------------- -------------------
#include <stdio.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <time.h>
#include <signal.h>
#include <sys/wait.h>
#include <sys/ptrace.h>
int
main(int argc, char ** argv) {
pid_t kid;
if ((kid = fork()) == 0) {
int ms_wait = 2000;
int rval;
struct timeval timeout;
timeout.tv_sec = ms_wait / 1000;
timeout.tv_usec = (ms_wait % 1000) * 1000;
rval = select(0, NULL, NULL, NULL, &timeout);
if (rval == -1) {
int errcode = errno;
printf("Hey! Why did my select error off with errno %d (%s)?\n",
errcode, strerror(errcode));
fflush(stdout);
} else {
printf("select call completed, return value: %d\n", rval);
}
exit(0);
} else if (kid == (pid_t)-1) {
perror("fork");
} else {
int ms_wait = 500;
int rval;
struct timeval timeout;
/* Wait a bit to make sure kid has a chance to get into its
* select call
*/
timeout.tv_sec = ms_wait / 1000;
timeout.tv_usec = (ms_wait % 1000) * 1000;
rval = select(0, NULL, NULL, NULL, &timeout);
/* Now attach to the kid, then continue him.
*/
if (ptrace(PTRACE_ATTACH, kid, (void *)0, (void *)0) != 0) {
perror("ptrace");
}
if (waitpid(kid, &rval, 0) != kid) {
perror("waitpid");
}
if (ptrace(PTRACE_CONT, kid, (void *)0, (void *)0) != 0) {
perror("ptrace");
}
if (waitpid(kid, &rval, 0) != kid) {
perror("waitpid");
}
}
return 0;
}
next reply other threads:[~2007-08-17 15:41 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-08-17 15:41 John Blackwood [this message]
2007-08-17 20:55 ` [PATCH] select: fix sys_select to not leak ERESTARTNOHAND to userspace Neil Horman
-- strict thread matches above, loose matches on Subject: below --
2007-01-22 13:00 Neil Horman
2007-01-22 23:02 ` Andi Kleen
2007-01-23 18:55 ` Neil Horman
2007-01-16 20:13 Neil Horman
2007-01-22 13:59 ` Paolo Ornati
2007-01-22 14:52 ` Neil Horman
2007-01-22 16:03 ` Linus Torvalds
2007-01-22 16:24 ` Neil Horman
2007-01-23 0:00 ` bert hubert
2007-01-24 5:59 ` David Miller
2007-01-24 13:21 ` Neil Horman
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=46C5C1A0.7060708@ccur.com \
--to=john.blackwood@ccur.com \
--cc=ghaskins@novell.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-rt-users@vger.kernel.org \
--cc=nhorman@tuxdriver.com \
--cc=sdietrich@novell.com \
--cc=tom.horsley@ccur.com \
/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.