On Wed, Nov 05, 2014 at 02:44:54PM -0800, patrick keshishian wrote:
> On Wed, Nov 05, 2014 at 08:45:07PM +0100, Theo Buehler wrote:
> > Pausing a tetris game currently causes a segfault due to a a null
> > pointer dereference.
> > 
> > Fix this by checking that s is non-NULL before accessing its members.
> > 
> > A number of comments and an error message still refer to select()
> > instead of poll(). Correct this as well.
> > 
> > 
> > Index: input.c
> > ===================================================================
> > RCS file: /cvs/src/games/tetris/input.c,v
> > retrieving revision 1.13
> > diff -u -p -r1.13 input.c
> > --- input.c 3 Nov 2014 22:14:54 -0000       1.13
> > +++ input.c 5 Nov 2014 19:39:30 -0000
> > @@ -64,12 +64,12 @@
> >     }
> >  
> >  /*
> > - * Do a `read wait': select for reading from stdin, with timeout *tvp.
> > + * Do a `read wait': poll for reading from stdin, with timeout *tvp.
> >   * On return, modify *tvp to reflect the amount of time spent waiting.
> >   * It will be positive only if input appeared before the time ran out;
> >   * otherwise it will be zero or perhaps negative.
> >   *
> > - * If tvp is nil, wait forever, but return if select is interrupted.
> > + * If tvp is nil, wait forever, but return if poll is interrupted.
> >   *
> >   * Return 0 => no input, 1 => can read() from stdin
> >   */
> > @@ -90,14 +90,15 @@ rwait(struct timeval *tvp)
> >  again:
> >     pfd[0].fd = STDIN_FILENO;
> >     pfd[0].events = POLLIN;
> > -   switch (poll(pfd, 1, s->tv_sec * 1000 + s->tv_usec / 1000)) {
> > +   switch (poll(pfd, 1, s ? s->tv_sec * 1000 + s->tv_usec / 1000 :
> 
> 
> I propose getting rid of the s pointer all together as such:

After replacing select() with poll(), not removing
`struct timeval *s' seems an oversight; Its use was
solely for select()'s benefit.

Once more, proposing removal of `struct timeval *s' and
using an `int timo' for the time-out value, that gets fed
into poll(). It also improves readability of the code;
rumors floating around that that is a good thing.

Index: input.c
===================================================================
RCS file: /cvs/obsd/src/games/tetris/input.c,v
retrieving revision 1.14
diff -u -p -u -r1.14 input.c
--- input.c     5 Nov 2014 20:23:38 -0000       1.14
+++ input.c     7 Nov 2014 19:37:07 -0000
@@ -76,7 +76,8 @@
 int
 rwait(struct timeval *tvp)
 {
-       struct timeval starttv, endtv, *s;
+       int     timo = INFTIM;
+       struct timeval starttv, endtv;
        struct pollfd pfd[1];
 
 #define        NILTZ ((struct timezone *)0)
@@ -84,15 +85,12 @@ rwait(struct timeval *tvp)
        if (tvp) {
                (void) gettimeofday(&starttv, NILTZ);
                endtv = *tvp;
-               s = &endtv;
-       } else
-               s = NULL;
+               timo = endtv.tv_sec * 1000 + endtv.tv_usec / 1000;
+       }
 again:
        pfd[0].fd = STDIN_FILENO;
        pfd[0].events = POLLIN;
-       switch (poll(pfd, 1, s ? s->tv_sec * 1000 + s->tv_usec / 1000 :
-           INFTIM)) {
-
+       switch (poll(pfd, 1, timo)) {
        case -1:
                if (tvp == 0)
                        return (-1);


> 
> Index: input.c
> ===================================================================
> RCS file: /cvs/obsd/src/games/tetris/input.c,v
> retrieving revision 1.13
> diff -u -p -u -p -r1.13 input.c
> --- input.c   3 Nov 2014 22:14:54 -0000       1.13
> +++ input.c   5 Nov 2014 22:40:47 -0000
> @@ -64,19 +64,20 @@
>       }
>  
>  /*
> - * Do a `read wait': select for reading from stdin, with timeout *tvp.
> + * Do a `read wait': poll for reading from stdin, with timeout *tvp.
>   * On return, modify *tvp to reflect the amount of time spent waiting.
>   * It will be positive only if input appeared before the time ran out;
>   * otherwise it will be zero or perhaps negative.
>   *
> - * If tvp is nil, wait forever, but return if select is interrupted.
> + * If tvp is nil, wait forever, but return if poll is interrupted.
>   *
>   * Return 0 => no input, 1 => can read() from stdin
>   */
>  int
>  rwait(struct timeval *tvp)
>  {
> -     struct timeval starttv, endtv, *s;
> +     int     timo = INFTIM;
> +     struct timeval starttv, endtv;
>       struct pollfd pfd[1];
>  
>  #define      NILTZ ((struct timezone *)0)
> @@ -84,20 +85,19 @@ rwait(struct timeval *tvp)
>       if (tvp) {
>               (void) gettimeofday(&starttv, NILTZ);
>               endtv = *tvp;
> -             s = &endtv;
> -     } else
> -             s = NULL;
> +             timo = endtv.tv_sec * 1000 + endtv.tv_usec / 1000;
> +     }
>  again:
>       pfd[0].fd = STDIN_FILENO;
>       pfd[0].events = POLLIN;
> -     switch (poll(pfd, 1, s->tv_sec * 1000 + s->tv_usec / 1000)) {
> +     switch (poll(pfd, 1, timo)) {
>  
>       case -1:
>               if (tvp == 0)
>                       return (-1);
>               if (errno == EINTR)
>                       goto again;
> -             stop("select failed, help");
> +             stop("poll failed, help");
>               /* NOTREACHED */
>  
>       case 0: /* timed out */
> @@ -115,7 +115,7 @@ again:
>  }
>  
>  /*
> - * `sleep' for the current turn time (using select).
> + * `sleep' for the current turn time (using poll).
>   * Eat any input that might be available.
>   */
>  void
> 
> 
> 
> --patrick
> 
> 
> 
> 
> 
> 
> 
> 
> 
> > +       INFTIM)) {
> >  
> >     case -1:
> >             if (tvp == 0)
> >                     return (-1);
> >             if (errno == EINTR)
> >                     goto again;
> > -           stop("select failed, help");
> > +           stop("poll failed, help");
> >             /* NOTREACHED */
> >  
> >     case 0: /* timed out */
> > @@ -115,7 +116,7 @@ again:
> >  }
> >  
> >  /*
> > - * `sleep' for the current turn time (using select).
> > + * `sleep' for the current turn time (using poll).
> >   * Eat any input that might be available.
> >   */
> >  void
> > 
> 

Reply via email to