On Wed, Mar 10, 2021 at 02:03:33PM -0700, Todd C. Miller wrote:
> On Wed, 10 Mar 2021 21:15:13 +0100, Christian Weisgerber wrote:
> 
> > Right.  Next iteration:
> 
> Looks better, one minor nit inline.
> 
>  - todd

My ok doesn't weigh much, but I wanted to chime in to say thanks for
picking this up!

I've got one small addition inline. Otherwise, I've applied it and
tested that the multi-line bug is fixed--looks good to me.

Thanks,
Alex

> 
> > Index: quiz.c
> > ===================================================================
> > RCS file: /cvs/src/games/quiz/quiz.c,v
> > retrieving revision 1.30
> > diff -u -p -r1.30 quiz.c
> > --- quiz.c  24 Aug 2018 11:14:49 -0000      1.30
> > +++ quiz.c  10 Mar 2021 20:04:37 -0000
> > @@ -48,7 +48,6 @@ static QE qlist;
> >  static int catone, cattwo, tflag;
> >  static u_int qsize;
> >  
> > -char       *appdstr(char *, const char *, size_t);
> >  void        downcase(char *);
> >  void        get_cats(char *, char *);
> >  void        get_file(const char *);
> > @@ -110,7 +109,8 @@ get_file(const char *file)
> >  {
> >     FILE *fp;
> >     QE *qp;
> > -   size_t len;
> > +   ssize_t len;
> > +   size_t qlen, size;
> >     char *lp;
> >  
> >     if ((fp = fopen(file, "r")) == NULL)
> > @@ -123,26 +123,36 @@ get_file(const char *file)
> >      */
> >     qp = &qlist;
> >     qsize = 0;
> > -   while ((lp = fgetln(fp, &len)) != NULL) {
> > +   lp = NULL;
> > +   size = 0;
> > +   while ((len = getline(&lp, &size, fp)) != -1) {
> >             if (lp[len - 1] == '\n')
> > -                   --len;
> > +                   lp[--len] = '\0';
> > +           if (qp->q_text)
> > +                   qlen = strlen(qp->q_text);
> >             if (qp->q_text && qp->q_text[0] != '\0' &&
> 
>           This would now be clearer as:
> 
>               if (qlen > 0 && qp->q_text[qlen - 1] == '\\') {

I agree this is clearer, but I think we'll need a `qlen = 0`
initialization up above the while loop if we go with this variation
(otherwise an uninitialized qlen could be > 0, causing indexing a null
q_text, right?). Apologies if this was implied by your comment, thought
it couldn't hurt to flag!

> 
> > -               qp->q_text[strlen(qp->q_text) - 1] == '\\')
> > -                   qp->q_text = appdstr(qp->q_text, lp, len);
> > -           else {
> > +               qp->q_text[qlen - 1] == '\\') {
> > +                   qp->q_text[--qlen] = '\0';
> > +                   qlen += len;
> > +                   qp->q_text = realloc(qp->q_text, qlen + 1);
> > +                   if (qp->q_text == NULL)
> > +                           errx(1, "realloc");
> > +                   strlcat(qp->q_text, lp, qlen + 1);
> > +           } else {
> >                     if ((qp->q_next = malloc(sizeof(QE))) == NULL)
> >                             errx(1, "malloc");
> >                     qp = qp->q_next;
> > -                   if ((qp->q_text = malloc(len + 1)) == NULL)
> > -                           errx(1, "malloc");
> > -                   /* lp may not be zero-terminated; cannot use strlcpy */
> > -                   strncpy(qp->q_text, lp, len);
> > -                   qp->q_text[len] = '\0';
> > +                   qp->q_text = strdup(lp);
> > +                   if (qp->q_text == NULL)
> > +                           errx(1, "strdup");
> >                     qp->q_asked = qp->q_answered = FALSE;
> >                     qp->q_next = NULL;
> >                     ++qsize;
> >             }
> >     }
> > +   free(lp);
> > +   if (ferror(fp))
> > +           err(1, "getline");
> >     (void)fclose(fp);
> >  }
> >  
> > @@ -316,32 +326,6 @@ next_cat(const char *s)
> >                     esc = 0;
> >                     break;
> >             }
> > -}
> > -
> > -char *
> > -appdstr(char *s, const char *tp, size_t len)
> > -{
> > -   char *mp;
> > -   const char *sp;
> > -   int ch;
> > -   char *m;
> > -
> > -   if ((m = malloc(strlen(s) + len + 1)) == NULL)
> > -           errx(1, "malloc");
> > -   for (mp = m, sp = s; (*mp++ = *sp++) != '\0'; )
> > -           ;
> > -   --mp;
> > -   if (*(mp - 1) == '\\')
> > -           --mp;
> > -
> > -   while ((ch = *mp++ = *tp++) && ch != '\n')
> > -           ;
> > -   if (*(mp - 2) == '\\')
> > -           mp--;
> > -   *mp = '\0';
> > -
> > -   free(s);
> > -   return (m);
> >  }
> >  
> >  void
> > -- 
> > Christian "naddy" Weisgerber                          [email protected]
> 

Reply via email to