Ingo Schwarze <schwa...@usta.de> wrote:

> Hi,
> 
> Ingo Schwarze wrote on Wed, Sep 01, 2021 at 04:38:51PM +0200:
> 
> > Note that the h_hup() and h_term() signal handlers are still unsafe
> > after this commit because they also set the "killersig" (how fitting!)
> > field in a global struct.
> 
> I like it when fixing two bugs only amounts to minus: minus 14 LOC,
> 1 function, 1 global variable, 2 automatic variables, 1 struct member,
> 9 pointer dereferences, 1 #define, and minus 1 #undef.
> 
> The argument that only one single GS exists applies unchanged.
> 
> OK?
>   Ingo

Great.  This is the direction I was going to go in with it.  I hadn't
thought of collapsing h_hup an h_term, though.

This makes sense as I understand the signal/event handling and a quick
test through the signals shows no difference in behavior.

Should h_term() and cl_sigterm be named something more general to
indicate that they also handle SIGHUP?  Or is it good enough since it
includes all the signals that 'term'inate vi?  It's not hard to follow
as-is. 

Tim. (not @ :P )


> 
> 
> Index: cl/cl.h
> ===================================================================
> RCS file: /cvs/src/usr.bin/vi/cl/cl.h,v
> retrieving revision 1.11
> diff -u -p -r1.11 cl.h
> --- cl/cl.h   1 Sep 2021 14:28:15 -0000       1.11
> +++ cl/cl.h   1 Sep 2021 17:15:34 -0000
> @@ -11,7 +11,6 @@
>   *   @(#)cl.h        10.19 (Berkeley) 9/24/96
>   */
>  
> -extern       volatile sig_atomic_t cl_sighup;
>  extern       volatile sig_atomic_t cl_sigint;
>  extern       volatile sig_atomic_t cl_sigterm;
>  extern       volatile sig_atomic_t cl_sigwinch;
> @@ -31,7 +30,6 @@ typedef struct _cl_private {
>       char    *rmso, *smso;   /* Inverse video terminal strings. */
>       char    *smcup, *rmcup; /* Terminal start/stop strings. */
>  
> -     int      killersig;     /* Killer signal. */
>  #define      INDX_HUP        0
>  #define      INDX_INT        1
>  #define      INDX_TERM       2
> Index: cl/cl_funcs.c
> ===================================================================
> RCS file: /cvs/src/usr.bin/vi/cl/cl_funcs.c,v
> retrieving revision 1.21
> diff -u -p -r1.21 cl_funcs.c
> --- cl/cl_funcs.c     1 Sep 2021 14:28:15 -0000       1.21
> +++ cl/cl_funcs.c     1 Sep 2021 17:15:34 -0000
> @@ -437,7 +437,7 @@ cl_refresh(SCR *sp, int repaint)
>        * If we received a killer signal, we're done, there's no point
>        * in refreshing the screen.
>        */
> -     if (clp->killersig)
> +     if (cl_sigterm)
>               return (0);
>  
>       /*
> @@ -582,7 +582,7 @@ cl_suspend(SCR *sp, int *allowedp)
>        * unchanged.  In addition, the terminal has already been reset
>        * correctly, so leave it alone.
>        */
> -     if (clp->killersig) {
> +     if (cl_sigterm) {
>               F_CLR(clp, CL_SCR_EX_INIT | CL_SCR_VI_INIT);
>               return (0);
>       }
> Index: cl/cl_main.c
> ===================================================================
> RCS file: /cvs/src/usr.bin/vi/cl/cl_main.c,v
> retrieving revision 1.34
> diff -u -p -r1.34 cl_main.c
> --- cl/cl_main.c      1 Sep 2021 14:28:15 -0000       1.34
> +++ cl/cl_main.c      1 Sep 2021 17:15:34 -0000
> @@ -33,7 +33,6 @@
>  
>  GS *__global_list;                           /* GLOBAL: List of screens. */
>  
> -volatile sig_atomic_t cl_sighup;
>  volatile sig_atomic_t cl_sigint;
>  volatile sig_atomic_t cl_sigterm;
>  volatile sig_atomic_t cl_sigwinch;
> @@ -120,9 +119,9 @@ main(int argc, char *argv[])
>       }
>  
>       /* If a killer signal arrived, pretend we just got it. */
> -     if (clp->killersig) {
> -             (void)signal(clp->killersig, SIG_DFL);
> -             (void)kill(getpid(), clp->killersig);
> +     if (cl_sigterm) {
> +             (void)signal(cl_sigterm, SIG_DFL);
> +             (void)kill(getpid(), cl_sigterm);
>               /* NOTREACHED */
>       }
>  
> @@ -215,17 +214,6 @@ term_init(char *ttype)
>       }
>  }
>  
> -#define      GLOBAL_CLP \
> -     CL_PRIVATE *clp = GCLP(__global_list);
> -static void
> -h_hup(int signo)
> -{
> -     GLOBAL_CLP;
> -
> -     cl_sighup = 1;
> -     clp->killersig = SIGHUP;
> -}
> -
>  static void
>  h_int(int signo)
>  {
> @@ -235,10 +223,7 @@ h_int(int signo)
>  static void
>  h_term(int signo)
>  {
> -     GLOBAL_CLP;
> -
> -     cl_sigterm = 1;
> -     clp->killersig = SIGTERM;
> +     cl_sigterm = signo;
>  }
>  
>  static void
> @@ -246,7 +231,6 @@ h_winch(int signo)
>  {
>       cl_sigwinch = 1;
>  }
> -#undef       GLOBAL_CLP
>  
>  /*
>   * sig_init --
> @@ -261,20 +245,19 @@ sig_init(GS *gp, SCR *sp)
>  
>       clp = GCLP(gp);
>  
> -     cl_sighup = 0;
>       cl_sigint = 0;
>       cl_sigterm = 0;
>       cl_sigwinch = 0;
>  
>       if (sp == NULL) {
> -             if (setsig(SIGHUP, &clp->oact[INDX_HUP], h_hup) ||
> +             if (setsig(SIGHUP, &clp->oact[INDX_HUP], h_term) ||
>                   setsig(SIGINT, &clp->oact[INDX_INT], h_int) ||
>                   setsig(SIGTERM, &clp->oact[INDX_TERM], h_term) ||
>                   setsig(SIGWINCH, &clp->oact[INDX_WINCH], h_winch)
>                   )
>                       err(1, NULL);
>       } else
> -             if (setsig(SIGHUP, NULL, h_hup) ||
> +             if (setsig(SIGHUP, NULL, h_term) ||
>                   setsig(SIGINT, NULL, h_int) ||
>                   setsig(SIGTERM, NULL, h_term) ||
>                   setsig(SIGWINCH, NULL, h_winch)
> Index: cl/cl_read.c
> ===================================================================
> RCS file: /cvs/src/usr.bin/vi/cl/cl_read.c,v
> retrieving revision 1.22
> diff -u -p -r1.22 cl_read.c
> --- cl/cl_read.c      1 Sep 2021 14:28:15 -0000       1.22
> +++ cl/cl_read.c      1 Sep 2021 17:15:34 -0000
> @@ -62,13 +62,15 @@ retest:   if (LF_ISSET(EC_INTERRUPT) || cl
>                       evp->e_event = E_TIMEOUT;
>               return (0);
>       }
> -     if (cl_sighup) {
> +     switch (cl_sigterm) {
> +     case SIGHUP:
>               evp->e_event = E_SIGHUP;
>               return (0);
> -     }
> -     if (cl_sigterm) {
> +     case SIGTERM:
>               evp->e_event = E_SIGTERM;
>               return (0);
> +     default:
> +             break;
>       }
>       if (cl_sigwinch) {
>               cl_sigwinch = 0;

Reply via email to