emacs-pretest-bug
[Top][All Lists]
Advanced

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

Re: emacs abort backtrace from C-g in Message mode


From: Richard Stallman
Subject: Re: emacs abort backtrace from C-g in Message mode
Date: Sat, 07 May 2005 14:36:16 -0400

This backtrace seems to say that the call to sigprocmask
allowed a pending SIGPIPE to occur, and it was not handled.
It is supposed to be handled.  So the question is, why
wasn't it.

This code in process.c looks suspect to me.
If it calls report_file_error, the old sigpipe handler
would not be restored.

          while (this > 0)
            {
              int outfd = XINT (p->outfd);
              old_sigpipe = (SIGTYPE (*) ()) signal (SIGPIPE, 
send_process_trap);
#ifdef DATAGRAM_SOCKETS
              if (DATAGRAM_CHAN_P (outfd))
                {
                  rv = sendto (outfd, (char *) buf, this,
                               0, datagram_address[outfd].sa,
                               datagram_address[outfd].len);
                  if (rv < 0 && errno == EMSGSIZE)
                    report_file_error ("sending datagram", Fcons (proc, Qnil));
                }
              else
#endif

That could only have been the cause of the problem if you used
a datagram socket.  That's unusual, isn't it?  So I don't know
if this could be related to the problem.  But I think the patch
below would fix this bug.

*** process.c   25 Mar 2005 20:46:49 -0500      1.450
--- process.c   07 May 2005 12:56:33 -0400      
***************
*** 5299,5305 ****
                               0, datagram_address[outfd].sa,
                               datagram_address[outfd].len);
                  if (rv < 0 && errno == EMSGSIZE)
!                   report_file_error ("sending datagram", Fcons (proc, Qnil));
                }
              else
  #endif
--- 5299,5309 ----
                               0, datagram_address[outfd].sa,
                               datagram_address[outfd].len);
                  if (rv < 0 && errno == EMSGSIZE)
!                   {
!                     signal (SIGPIPE, old_sigpipe);
!                     report_file_error ("sending datagram",
!                                        Fcons (proc, Qnil));
!                   }
                }
              else
  #endif




reply via email to

[Prev in Thread] Current Thread [Next in Thread]