(read_string): Try to not call signaction for signal 0 and use NSIG if
it exists to determin how many signals there exists, also, only restore those signalhandlers that we got out. Bug reported by and patch tested by Harald Barth. git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@18158 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
20
lib/des/ui.c
20
lib/des/ui.c
@@ -53,11 +53,16 @@ intr(int sig)
|
||||
intr_flag++;
|
||||
}
|
||||
|
||||
#ifndef NSIG
|
||||
#define NSIG 47
|
||||
#endif
|
||||
|
||||
static int
|
||||
read_string(const char *preprompt, const char *prompt,
|
||||
char *buf, size_t len, int echo)
|
||||
{
|
||||
struct sigaction sigs[47];
|
||||
struct sigaction sigs[NSIG];
|
||||
int oksigs[NSIG];
|
||||
struct sigaction sa;
|
||||
FILE *tty;
|
||||
int ret = 0;
|
||||
@@ -68,12 +73,16 @@ read_string(const char *preprompt, const char *prompt,
|
||||
|
||||
struct termios t_new, t_old;
|
||||
|
||||
memset(&oksigs, 0, sizeof(oksigs));
|
||||
|
||||
memset(&sa, 0, sizeof(sa));
|
||||
sa.sa_handler = intr;
|
||||
sigemptyset(&sa.sa_mask);
|
||||
sa.sa_flags = 0;
|
||||
for(i = 0; i < sizeof(sigs) / sizeof(sigs[0]); i++)
|
||||
if (i != SIGALRM) sigaction(i, &sa, &sigs[i]);
|
||||
for(i = 1; i < sizeof(sigs) / sizeof(sigs[0]); i++)
|
||||
if (i != SIGALRM)
|
||||
if (sigaction(i, &sa, &sigs[i]) == 0)
|
||||
oksigs[i] = 1;
|
||||
|
||||
if((tty = fopen("/dev/tty", "r")) == NULL)
|
||||
tty = stdin;
|
||||
@@ -114,8 +123,9 @@ read_string(const char *preprompt, const char *prompt,
|
||||
if(tty != stdin)
|
||||
fclose(tty);
|
||||
|
||||
for(i = 0; i < sizeof(sigs) / sizeof(sigs[0]); i++)
|
||||
if (i != SIGALRM) sigaction(i, &sigs[i], NULL);
|
||||
for(i = 1; i < sizeof(sigs) / sizeof(sigs[0]); i++)
|
||||
if (oksigs[i])
|
||||
sigaction(i, &sigs[i], NULL);
|
||||
|
||||
if(ret)
|
||||
return -3;
|
||||
|
Reference in New Issue
Block a user