On Mon, Sep 03, 2018 at 11:43:02PM +0800, Michael Mikonos wrote: > On Mon, Sep 03, 2018 at 02:24:49PM +0800, Michael Mikonos wrote: > > On Sat, Sep 01, 2018 at 11:31:49PM +0200, Gilles Chehade wrote: > > > On Sat, Sep 01, 2018 at 09:20:59PM +0800, Michael Mikonos wrote: > > > > Hello, > > > > > > > > Replace a malloc+strlcpy with strndup in cmdline_symset(). > > > > Parameter s is a "keyname=value" string and sym is the > > > > "keyname" part. > > > > > > > > If s is "=value", sym will be an empty string. > > > > The patch doesn't change this behaviour although > > > > it might be undesirable to call symset() with > > > > an empty string. Possibly it could also return -1 > > > > if len is zero. Thoughts? > > > > > > > > > > Not opposed to the diff but at this late hour I find it easier to read > > > the malloc+strlcpy and be sure there's not an off-by-one than with the > > > strndup version, I'll read again tomorrow. > > > > In my understanding the length argument of strndup(3) doesn't include > > the terminating NUL character. I think the linux manual for strndup(3) > > is slightly clearer on this because it has the text: > > > > ... only n bytes are copied, and a terminating null byte ('\0') is > > added. > > > > > Just wanted to remind you that this function is shared between daemons > > > so this can't be an smtpd-only change :-) > > Thanks for the reminder. Here is a new version of the patch to include > other daemons. I also followed a suggestion from halex@ to remove the > strlen() calls and determine length using val-s. Did I miss anything? >
this looks good to me > Index: acme-client/parse.y > =================================================================== > RCS file: /cvs/src/usr.sbin/acme-client/parse.y,v > retrieving revision 1.29 > diff -u -p -u -r1.29 parse.y > --- acme-client/parse.y 3 Aug 2018 17:57:21 -0000 1.29 > +++ acme-client/parse.y 3 Sep 2018 15:18:23 -0000 > @@ -839,17 +839,12 @@ cmdline_symset(char *s) > { > char *sym, *val; > int ret; > - size_t len; > > if ((val = strrchr(s, '=')) == NULL) > return -1; > - > - len = strlen(s) - strlen(val) + 1; > - if ((sym = malloc(len)) == NULL) > - errx(EXIT_FAILURE, "cmdline_symset: malloc"); > - > - strlcpy(sym, s, len); > - > + sym = strndup(s, val - s); > + if (sym == NULL) > + errx(EXIT_FAILURE, "%s: strndup", __func__); > ret = symset(sym, val + 1, 1); > free(sym); > > Index: bgpd/parse.y > =================================================================== > RCS file: /cvs/src/usr.sbin/bgpd/parse.y,v > retrieving revision 1.331 > diff -u -p -u -r1.331 parse.y > --- bgpd/parse.y 27 Aug 2018 19:32:37 -0000 1.331 > +++ bgpd/parse.y 3 Sep 2018 15:18:24 -0000 > @@ -3145,17 +3145,12 @@ cmdline_symset(char *s) > { > char *sym, *val; > int ret; > - size_t len; > > if ((val = strrchr(s, '=')) == NULL) > return (-1); > - > - len = strlen(s) - strlen(val) + 1; > - if ((sym = malloc(len)) == NULL) > - fatal("cmdline_symset: malloc"); > - > - strlcpy(sym, s, len); > - > + sym = strndup(s, val - s); > + if (sym == NULL) > + fatal("%s: strndup", __func__); > ret = symset(sym, val + 1, 1); > free(sym); > > Index: dvmrpd/parse.y > =================================================================== > RCS file: /cvs/src/usr.sbin/dvmrpd/parse.y,v > retrieving revision 1.36 > diff -u -p -u -r1.36 parse.y > --- dvmrpd/parse.y 11 Jul 2018 07:39:22 -0000 1.36 > +++ dvmrpd/parse.y 3 Sep 2018 15:18:24 -0000 > @@ -834,17 +834,12 @@ cmdline_symset(char *s) > { > char *sym, *val; > int ret; > - size_t len; > > if ((val = strrchr(s, '=')) == NULL) > return (-1); > - > - len = strlen(s) - strlen(val) + 1; > - if ((sym = malloc(len)) == NULL) > - errx(1, "cmdline_symset: malloc"); > - > - strlcpy(sym, s, len); > - > + sym = strndup(s, val - s); > + if (sym == NULL) > + errx(1, "%s: strndup", __func__); > ret = symset(sym, val + 1, 1); > free(sym); > > Index: eigrpd/parse.y > =================================================================== > RCS file: /cvs/src/usr.sbin/eigrpd/parse.y,v > retrieving revision 1.27 > diff -u -p -u -r1.27 parse.y > --- eigrpd/parse.y 11 Jul 2018 07:39:22 -0000 1.27 > +++ eigrpd/parse.y 3 Sep 2018 15:18:24 -0000 > @@ -1094,17 +1094,12 @@ cmdline_symset(char *s) > { > char *sym, *val; > int ret; > - size_t len; > > if ((val = strrchr(s, '=')) == NULL) > return (-1); > - > - len = strlen(s) - strlen(val) + 1; > - if ((sym = malloc(len)) == NULL) > - errx(1, "cmdline_symset: malloc"); > - > - strlcpy(sym, s, len); > - > + sym = strndup(s, val - s); > + if (sym == NULL) > + errx(1, "%s: strndup", __func__); > ret = symset(sym, val + 1, 1); > free(sym); > > Index: httpd/parse.y > =================================================================== > RCS file: /cvs/src/usr.sbin/httpd/parse.y,v > retrieving revision 1.105 > diff -u -p -u -r1.105 parse.y > --- httpd/parse.y 11 Jul 2018 07:39:22 -0000 1.105 > +++ httpd/parse.y 3 Sep 2018 15:18:25 -0000 > @@ -1819,17 +1819,12 @@ cmdline_symset(char *s) > { > char *sym, *val; > int ret; > - size_t len; > > if ((val = strrchr(s, '=')) == NULL) > return (-1); > - > - len = strlen(s) - strlen(val) + 1; > - if ((sym = malloc(len)) == NULL) > - errx(1, "cmdline_symset: malloc"); > - > - (void)strlcpy(sym, s, len); > - > + sym = strndup(s, val - s); > + if (sym == NULL) > + errx(1, "%s: strndup", __func__); > ret = symset(sym, val + 1, 1); > free(sym); > > Index: ifstated/parse.y > =================================================================== > RCS file: /cvs/src/usr.sbin/ifstated/parse.y,v > retrieving revision 1.52 > diff -u -p -u -r1.52 parse.y > --- ifstated/parse.y 11 Jul 2018 07:39:22 -0000 1.52 > +++ ifstated/parse.y 3 Sep 2018 15:18:25 -0000 > @@ -871,17 +871,12 @@ cmdline_symset(char *s) > { > char *sym, *val; > int ret; > - size_t len; > > if ((val = strrchr(s, '=')) == NULL) > return (-1); > - > - len = strlen(s) - strlen(val) + 1; > - if ((sym = malloc(len)) == NULL) > + sym = strndup(s, val - s); > + if (sym == NULL) > err(1, "%s", __func__); > - > - strlcpy(sym, s, len); > - > ret = symset(sym, val + 1, 1); > free(sym); > > Index: iscsictl/parse.y > =================================================================== > RCS file: /cvs/src/usr.sbin/iscsictl/parse.y,v > retrieving revision 1.15 > diff -u -p -u -r1.15 parse.y > --- iscsictl/parse.y 11 Jul 2018 07:39:22 -0000 1.15 > +++ iscsictl/parse.y 3 Sep 2018 15:18:25 -0000 > @@ -739,17 +739,12 @@ cmdline_symset(char *s) > { > char *sym, *val; > int ret; > - size_t len; > > if ((val = strrchr(s, '=')) == NULL) > return (-1); > - > - len = strlen(s) - strlen(val) + 1; > - if ((sym = malloc(len)) == NULL) > - errx(1, "cmdline_symset: malloc"); > - > - strlcpy(sym, s, len); > - > + sym = strndup(s, val - s); > + if (sym == NULL) > + errx(1, "%s: strndup", __func__); > ret = symset(sym, val + 1, 1); > free(sym); > > Index: ldapd/parse.y > =================================================================== > RCS file: /cvs/src/usr.sbin/ldapd/parse.y,v > retrieving revision 1.32 > diff -u -p -u -r1.32 parse.y > --- ldapd/parse.y 11 Jul 2018 07:39:22 -0000 1.32 > +++ ldapd/parse.y 3 Sep 2018 15:18:25 -0000 > @@ -911,17 +911,12 @@ cmdline_symset(char *s) > { > char *sym, *val; > int ret; > - size_t len; > > if ((val = strrchr(s, '=')) == NULL) > return (-1); > - > - len = strlen(s) - strlen(val) + 1; > - if ((sym = malloc(len)) == NULL) > - fatal("cmdline_symset: malloc"); > - > - strlcpy(sym, s, len); > - > + sym = strndup(s, val - s); > + if (sym == NULL) > + fatal("%s: strndup", __func__); > ret = symset(sym, val + 1, 1); > free(sym); > > Index: ldpd/parse.y > =================================================================== > RCS file: /cvs/src/usr.sbin/ldpd/parse.y,v > retrieving revision 1.65 > diff -u -p -u -r1.65 parse.y > --- ldpd/parse.y 11 Jul 2018 07:39:22 -0000 1.65 > +++ ldpd/parse.y 3 Sep 2018 15:18:26 -0000 > @@ -1317,17 +1317,12 @@ cmdline_symset(char *s) > { > char *sym, *val; > int ret; > - size_t len; > > if ((val = strrchr(s, '=')) == NULL) > return (-1); > - > - len = strlen(s) - strlen(val) + 1; > - if ((sym = malloc(len)) == NULL) > - errx(1, "cmdline_symset: malloc"); > - > - strlcpy(sym, s, len); > - > + sym = strndup(s, val - s); > + if (sym == NULL) > + errx(1, "%s: strndup", __func__); > ret = symset(sym, val + 1, 1); > free(sym); > > Index: lpd/parse.y > =================================================================== > RCS file: /cvs/src/usr.sbin/lpd/parse.y,v > retrieving revision 1.3 > diff -u -p -u -r1.3 parse.y > --- lpd/parse.y 11 Jul 2018 07:39:22 -0000 1.3 > +++ lpd/parse.y 3 Sep 2018 15:18:26 -0000 > @@ -682,17 +682,12 @@ cmdline_symset(char *s) > { > char *sym, *val; > int ret; > - size_t len; > > if ((val = strrchr(s, '=')) == NULL) > return (-1); > - > - len = strlen(s) - strlen(val) + 1; > - if ((sym = malloc(len)) == NULL) > - errx(1, "%s", __func__); > - > - (void)strlcpy(sym, s, len); > - > + sym = strndup(s, val - s); > + if (sym == NULL) > + errx(1, "%s: strndup", __func__); > ret = symset(sym, val + 1, 1); > free(sym); > > Index: ospf6d/parse.y > =================================================================== > RCS file: /cvs/src/usr.sbin/ospf6d/parse.y,v > retrieving revision 1.38 > diff -u -p -u -r1.38 parse.y > --- ospf6d/parse.y 12 Jul 2018 13:45:03 -0000 1.38 > +++ ospf6d/parse.y 3 Sep 2018 15:18:26 -0000 > @@ -1095,17 +1095,12 @@ cmdline_symset(char *s) > { > char *sym, *val; > int ret; > - size_t len; > > if ((val = strrchr(s, '=')) == NULL) > return (-1); > - > - len = strlen(s) - strlen(val) + 1; > - if ((sym = malloc(len)) == NULL) > - errx(1, "cmdline_symset: malloc"); > - > - strlcpy(sym, s, len); > - > + sym = strndup(s, val - s); > + if (sym == NULL) > + errx(1, "%s: strndup", __func__); > ret = symset(sym, val + 1, 1); > free(sym); > > Index: ospfd/parse.y > =================================================================== > RCS file: /cvs/src/usr.sbin/ospfd/parse.y,v > retrieving revision 1.91 > diff -u -p -u -r1.91 parse.y > --- ospfd/parse.y 11 Jul 2018 07:39:22 -0000 1.91 > +++ ospfd/parse.y 3 Sep 2018 15:18:27 -0000 > @@ -1294,17 +1294,12 @@ cmdline_symset(char *s) > { > char *sym, *val; > int ret; > - size_t len; > > if ((val = strrchr(s, '=')) == NULL) > return (-1); > - > - len = strlen(s) - strlen(val) + 1; > - if ((sym = malloc(len)) == NULL) > - errx(1, "cmdline_symset: malloc"); > - > - strlcpy(sym, s, len); > - > + sym = strndup(s, val - s); > + if (sym == NULL) > + errx(1, "%s: strndup", __func__); > ret = symset(sym, val + 1, 1); > free(sym); > > Index: rad/parse.y > =================================================================== > RCS file: /cvs/src/usr.sbin/rad/parse.y,v > retrieving revision 1.8 > diff -u -p -u -r1.8 parse.y > --- rad/parse.y 3 Aug 2018 13:14:46 -0000 1.8 > +++ rad/parse.y 3 Sep 2018 15:18:27 -0000 > @@ -914,17 +914,12 @@ cmdline_symset(char *s) > { > char *sym, *val; > int ret; > - size_t len; > > if ((val = strrchr(s, '=')) == NULL) > return (-1); > - > - len = strlen(s) - strlen(val) + 1; > - if ((sym = malloc(len)) == NULL) > - errx(1, "cmdline_symset: malloc"); > - > - strlcpy(sym, s, len); > - > + sym = strndup(s, val - s); > + if (sym == NULL) > + errx(1, "%s: strndup", __func__); > ret = symset(sym, val + 1, 1); > free(sym); > > Index: relayd/parse.y > =================================================================== > RCS file: /cvs/src/usr.sbin/relayd/parse.y,v > retrieving revision 1.227 > diff -u -p -u -r1.227 parse.y > --- relayd/parse.y 6 Aug 2018 17:31:31 -0000 1.227 > +++ relayd/parse.y 3 Sep 2018 15:18:27 -0000 > @@ -2902,17 +2902,12 @@ cmdline_symset(char *s) > { > char *sym, *val; > int ret; > - size_t len; > > if ((val = strrchr(s, '=')) == NULL) > return (-1); > - > - len = strlen(s) - strlen(val) + 1; > - if ((sym = malloc(len)) == NULL) > - errx(1, "cmdline_symset: malloc"); > - > - (void)strlcpy(sym, s, len); > - > + sym = strndup(s, val - s); > + if (sym == NULL) > + errx(1, "%s: strndup", __func__); > ret = symset(sym, val + 1, 1); > free(sym); > > Index: ripd/parse.y > =================================================================== > RCS file: /cvs/src/usr.sbin/ripd/parse.y,v > retrieving revision 1.41 > diff -u -p -u -r1.41 parse.y > --- ripd/parse.y 11 Jul 2018 07:39:22 -0000 1.41 > +++ ripd/parse.y 3 Sep 2018 15:18:28 -0000 > @@ -850,17 +850,12 @@ cmdline_symset(char *s) > { > char *sym, *val; > int ret; > - size_t len; > > if ((val = strrchr(s, '=')) == NULL) > return (-1); > - > - len = strlen(s) - strlen(val) + 1; > - if ((sym = malloc(len)) == NULL) > - errx(1, "cmdline_symset: malloc"); > - > - strlcpy(sym, s, len); > - > + sym = strndup(s, val - s); > + if (sym == NULL) > + errx(1, "%s: strndup", __func__); > ret = symset(sym, val + 1, 1); > free(sym); > > Index: smtpd/parse.y > =================================================================== > RCS file: /cvs/src/usr.sbin/smtpd/parse.y,v > retrieving revision 1.219 > diff -u -p -u -r1.219 parse.y > --- smtpd/parse.y 1 Sep 2018 21:20:32 -0000 1.219 > +++ smtpd/parse.y 3 Sep 2018 15:18:28 -0000 > @@ -2124,17 +2124,12 @@ cmdline_symset(char *s) > { > char *sym, *val; > int ret; > - size_t len; > > if ((val = strrchr(s, '=')) == NULL) > return (-1); > - > - len = strlen(s) - strlen(val) + 1; > - if ((sym = malloc(len)) == NULL) > - errx(1, "cmdline_symset: malloc"); > - > - (void)strlcpy(sym, s, len); > - > + sym = strndup(s, val - s); > + if (sym == NULL) > + errx(1, "%s: strndup", __func__); > ret = symset(sym, val + 1, 1); > free(sym); > > Index: snmpd/parse.y > =================================================================== > RCS file: /cvs/src/usr.sbin/snmpd/parse.y,v > retrieving revision 1.51 > diff -u -p -u -r1.51 parse.y > --- snmpd/parse.y 11 Jul 2018 07:39:22 -0000 1.51 > +++ snmpd/parse.y 3 Sep 2018 15:18:28 -0000 > @@ -1127,17 +1127,12 @@ cmdline_symset(char *s) > { > char *sym, *val; > int ret; > - size_t len; > > if ((val = strrchr(s, '=')) == NULL) > return (-1); > - > - len = strlen(s) - strlen(val) + 1; > - if ((sym = malloc(len)) == NULL) > - errx(1, "cmdline_symset: malloc"); > - > - (void)strlcpy(sym, s, len); > - > + sym = strndup(s, val - s); > + if (sym == NULL) > + errx(1, "%s: strndup", __func__); > ret = symset(sym, val + 1, 1); > free(sym); > > Index: switchd/parse.y > =================================================================== > RCS file: /cvs/src/usr.sbin/switchd/parse.y,v > retrieving revision 1.10 > diff -u -p -u -r1.10 parse.y > --- switchd/parse.y 11 Jul 2018 07:39:22 -0000 1.10 > +++ switchd/parse.y 3 Sep 2018 15:18:28 -0000 > @@ -705,17 +705,12 @@ cmdline_symset(char *s) > { > char *sym, *val; > int ret; > - size_t len; > > if ((val = strrchr(s, '=')) == NULL) > return (-1); > - > - len = (val - s) + 1; > - if ((sym = malloc(len)) == NULL) > - fatal("cmdline_symset: malloc"); > - > - (void)strlcpy(sym, s, len); > - > + sym = strndup(s, val - s); > + if (sym == NULL) > + fatal("%s: strndup", __func__); > ret = symset(sym, val + 1, 1); > free(sym); > > Index: vmd/parse.y > =================================================================== > RCS file: /cvs/src/usr.sbin/vmd/parse.y,v > retrieving revision 1.42 > diff -u -p -u -r1.42 parse.y > --- vmd/parse.y 13 Jul 2018 08:42:49 -0000 1.42 > +++ vmd/parse.y 3 Sep 2018 15:18:28 -0000 > @@ -1154,17 +1154,12 @@ cmdline_symset(char *s) > { > char *sym, *val; > int ret; > - size_t len; > > if ((val = strrchr(s, '=')) == NULL) > return (-1); > - > - len = (val - s) + 1; > - if ((sym = malloc(len)) == NULL) > - fatal("cmdline_symset: malloc"); > - > - (void)strlcpy(sym, s, len); > - > + sym = strndup(s, val - s); > + if (sym == NULL) > + fatal("%s: strndup", __func__); > ret = symset(sym, val + 1, 1); > free(sym); > > Index: ypldap/parse.y > =================================================================== > RCS file: /cvs/src/usr.sbin/ypldap/parse.y,v > retrieving revision 1.28 > diff -u -p -u -r1.28 parse.y > --- ypldap/parse.y 11 Jul 2018 07:39:22 -0000 1.28 > +++ ypldap/parse.y 3 Sep 2018 15:18:29 -0000 > @@ -930,17 +930,12 @@ cmdline_symset(char *s) > { > char *sym, *val; > int ret; > - size_t len; > > if ((val = strrchr(s, '=')) == NULL) > return (-1); > - > - len = strlen(s) - strlen(val) + 1; > - if ((sym = malloc(len)) == NULL) > - errx(1, "%s", __func__); > - > - (void)strlcpy(sym, s, len); > - > + sym = strndup(s, val - s); > + if (sym == NULL) > + errx(1, "%s: strndup", __func__); > ret = symset(sym, val + 1, 1); > free(sym); > > -- Gilles Chehade https://www.poolp.org @poolpOrg