[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: apparantly konsole is unusable



reassign 573063 libc0.1
tags 573063 +pending
--

in libkpty (kde4libs/kpty/kpty.c), there is a call to openpty:
(this is compiled with g++)

 ::openpty( &d->masterFd, &d->slaveFd, ptsn, 0, 0)

(d is a pointer to a struct, d->masterFd is a int, d->slaveFd is a
int, ptsn is a char pointer)

which fails with EINTR (according to errno)

[..]

I'm out of clue and/or inspiration.

My possibly-clueless 2?: If EINTR is returned, the call should be
retried, which this code doesn't seem to do.

I tried with wrapping it in a bit of goto magic, and I just got a loop
that seemed infinite. I stopped it after ~50 tries.

tryagain:
 if (openpty( &d->masterFd, &d->slaveFd, ptsn, NULL, NULL))
 {
    int errsv = errno;
    perror(__PRETTY_FUNCTION__);
    if(errsv == EINTR) {
      sleep(1);
      goto tryagain;
    }
 [....]


The EINTR should really be handled, but the proper place is eglibc.
The patch bellow fixes konsole for me,
I will commit it into pkg-glibc SVN after some more testing.

I expect that difference between xterm and konsole is whether SIGCHLD
does have explicit handler.

Many thanks for your investigation.

Petr


--- a/sysdeps/unix/grantpt.c
+++ b/sysdeps/unix/grantpt.c
@@ -200,9 +200,13 @@
   else
     {
       int w;
-
+retry:
       if (__waitpid (pid, &w, 0) == -1)
+       {
+       if (errno == EINTR)
+           goto retry;
        goto cleanup;
+       };
       if (!WIFEXITED (w))
        __set_errno (ENOEXEC);
       else


man waitpid:


       EINTR  WNOHANG was not set and an unblocked signal
              or a SIGCHLD was caught; see signal(7).


Reply to: