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]
>