svn commit: r351691 - in stable/12: include/rpcsvc lib/libc/net lib/libc/rpc usr.sbin/rpc.yppasswdd usr.sbin/rpc.ypupdated usr.sbin/ypldap usr.sbin/yppush usr.sbin/ypserv

Pedro Giffuni pfg at FreeBSD.org
Tue Sep 3 01:54:17 UTC 2019


On 2019-09-02 20:42, Rick Macklem wrote:
> Oh, and RPC_MAXDATASIZE seems to be set at 9000.
> (This is probably only a limit for UDP, but may be wired into all RPCs?)
>
> rick

FWIW, the previous value matches what illumos has in 
usr/src/head/rpcsvc/yp_prot.h :

#define YPMAXRECORD ((uint_t)1024)

> ________________________________________
> From: owner-src-committers at freebsd.org <owner-src-committers at freebsd.org> on behalf of Rick Macklem <rmacklem at uoguelph.ca>
> Sent: Monday, September 2, 2019 9:30:45 PM
> To: Konstantin Belousov; src-committers at freebsd.org; svn-src-all at freebsd.org; svn-src-stable at freebsd.org; svn-src-stable-12 at freebsd.org
> Subject: Re: svn commit: r351691 - in stable/12: include/rpcsvc lib/libc/net lib/libc/rpc usr.sbin/rpc.yppasswdd usr.sbin/rpc.ypupdated usr.sbin/ypldap usr.sbin/yppush usr.sbin/ypserv
>
> Konstantin Belousov wrote:
>> Author: kib
>> Date: Mon Sep  2 08:20:02 2019
>> New Revision: 351691
>> URL: https://svnweb.freebsd.org/changeset/base/351691
>>
>> Log:
>>   MFC r350957:
>>   Increase YPMAXRECORD to 16M to be compatible with Linux.
> I am not familiar with the userland RPC libraries, but for the krpc, the size of an
> RPC message is limited by the maximum sockbuf size allowed, as set by
> soreserve() and limited by kern.maxsockbuf.
>
> You might want to look to see if the userland RPC library does the setsockopt()
> { or whatever it is? } that does the soreserve()/sbreserve() for the socket in the
> kernel, to see how large it gets set.
>
> I think you can get to about 2M by default?
>
> To be honest, I'm surprised (but maybe not amazed) that people still use
> NIS/YP.
> Just in case it matters, rick
>
>    Sponsored by: Mellanox Technologies
>
> Modified:
>    stable/12/include/rpcsvc/yp.x
>    stable/12/include/rpcsvc/yp_prot.h
>    stable/12/include/rpcsvc/ypxfrd.x
>    stable/12/lib/libc/net/gethostbynis.c
>    stable/12/lib/libc/net/getnetbynis.c
>    stable/12/lib/libc/net/getservent.c
>    stable/12/lib/libc/rpc/getrpcent.c
>    stable/12/usr.sbin/rpc.yppasswdd/yppasswdd_server.c
>    stable/12/usr.sbin/rpc.ypupdated/yp_dbupdate.c
>    stable/12/usr.sbin/ypldap/yp.c
>    stable/12/usr.sbin/yppush/yppush_main.c
>    stable/12/usr.sbin/ypserv/yp_server.c
> Directory Properties:
>    stable/12/   (props changed)
>
> Modified: stable/12/include/rpcsvc/yp.x
> ==============================================================================
> --- stable/12/include/rpcsvc/yp.x       Mon Sep  2 08:03:29 2019        (r351690)
> +++ stable/12/include/rpcsvc/yp.x       Mon Sep  2 08:20:02 2019        (r351691)
> @@ -40,7 +40,7 @@
>   %__FBSDID("$FreeBSD$");
>   #endif
>
> -const YPMAXRECORD = 1024;
> +const YPMAXRECORD = 16777216;
>   const YPMAXDOMAIN = 64;
>   const YPMAXMAP = 64;
>   const YPMAXPEER = 64;
>
> Modified: stable/12/include/rpcsvc/yp_prot.h
> ==============================================================================
> --- stable/12/include/rpcsvc/yp_prot.h  Mon Sep  2 08:03:29 2019        (r351690)
> +++ stable/12/include/rpcsvc/yp_prot.h  Mon Sep  2 08:20:02 2019        (r351691)
> @@ -79,7 +79,7 @@ typedef u_int bool;
>   #define YPPROG         ((u_long)100004)
>   #define YPVERS         ((u_long)2)
>   #define YPVERS_ORIG    ((u_long)1)
> -#define YPMAXRECORD    ((u_long)1024)
> +#define YPMAXRECORD    ((u_long)16 * 1024 * 1024)
>   #define YPMAXDOMAIN    ((u_long)64)
>   #define YPMAXMAP       ((u_long)64)
>   #define YPMAXPEER      ((u_long)256)
>
> Modified: stable/12/include/rpcsvc/ypxfrd.x
> ==============================================================================
> --- stable/12/include/rpcsvc/ypxfrd.x   Mon Sep  2 08:03:29 2019        (r351690)
> +++ stable/12/include/rpcsvc/ypxfrd.x   Mon Sep  2 08:20:02 2019        (r351691)
> @@ -70,7 +70,7 @@
>   #endif
>
>   /* XXX cribbed from yp.x */
> -const _YPMAXRECORD = 1024;
> +const _YPMAXRECORD = 16777216;
>   const _YPMAXDOMAIN = 64;
>   const _YPMAXMAP = 64;
>   const _YPMAXPEER = 64;
>
> Modified: stable/12/lib/libc/net/gethostbynis.c
> ==============================================================================
> --- stable/12/lib/libc/net/gethostbynis.c       Mon Sep  2 08:03:29 2019        (r351690)
> +++ stable/12/lib/libc/net/gethostbynis.c       Mon Sep  2 08:20:02 2019        (r351691)
> @@ -58,7 +58,7 @@ _gethostbynis(const char *name, char *map, int af, str
>          char *cp, **q;
>          char *result;
>          int resultlen, size, addrok = 0;
> -       char ypbuf[YPMAXRECORD + 2];
> +       char *ypbuf;
>          res_state statp;
>
>          statp = __res_state();
> @@ -88,10 +88,11 @@ _gethostbynis(const char *name, char *map, int af, str
>          }
>
>          /* avoid potential memory leak */
> -       bcopy((char *)result, (char *)&ypbuf, resultlen);
> +       ypbuf = alloca(resultlen + 2);
> +       bcopy(result, ypbuf, resultlen);
>          ypbuf[resultlen] = '\0';
>          free(result);
> -       result = (char *)&ypbuf;
> +       result = ypbuf;
>
>          if ((cp = strchr(result, '\n')))
>                  *cp = '\0';
>
> Modified: stable/12/lib/libc/net/getnetbynis.c
> ==============================================================================
> --- stable/12/lib/libc/net/getnetbynis.c        Mon Sep  2 08:03:29 2019        (r351690)
> +++ stable/12/lib/libc/net/getnetbynis.c        Mon Sep  2 08:20:02 2019        (r351691)
> @@ -58,7 +58,7 @@ _getnetbynis(const char *name, char *map, int af, stru
>          char *cp, **q;
>          char *result;
>          int resultlen, len;
> -       char ypbuf[YPMAXRECORD + 2];
> +       char *ypbuf;
>
>          switch(af) {
>          case AF_INET:
> @@ -77,10 +77,11 @@ _getnetbynis(const char *name, char *map, int af, stru
>              &resultlen))
>                  return (-1);
>
> -       bcopy((char *)result, (char *)&ypbuf, resultlen);
> +       ypbuf = alloca(resultlen + 2);
> +       bcopy(result, ypbuf, resultlen);
>          ypbuf[resultlen] = '\0';
>          free(result);
> -       result = (char *)&ypbuf;
> +       result = ypbuf;
>
>          if ((cp = strchr(result, '\n')))
>                  *cp = '\0';
>
> Modified: stable/12/lib/libc/net/getservent.c
> ==============================================================================
> --- stable/12/lib/libc/net/getservent.c Mon Sep  2 08:03:29 2019        (r351690)
> +++ stable/12/lib/libc/net/getservent.c Mon Sep  2 08:20:02 2019        (r351691)
> @@ -664,7 +664,7 @@ nis_servent(void *retval, void *mdata, va_list ap)
>   {
>          char *resultbuf, *lastkey;
>          int resultbuflen;
> -       char buf[YPMAXRECORD + 2];
> +       char *buf;
>
>          struct nis_state *st;
>          int rv;
> @@ -681,6 +681,7 @@ nis_servent(void *retval, void *mdata, va_list ap)
>
>          name = NULL;
>          proto = NULL;
> +       buf = NULL;
>          how = (enum nss_lookup_type)mdata;
>          switch (how) {
>          case nss_lt_name:
> @@ -716,7 +717,10 @@ nis_servent(void *retval, void *mdata, va_list ap)
>          do {
>                  switch (how) {
>                  case nss_lt_name:
> -                       snprintf(buf, sizeof(buf), "%s/%s", name, proto);
> +                       free(buf);
> +                       asprintf(&buf, "%s/%s", name, proto);
> +                       if (buf == NULL)
> +                               return (NS_TRYAGAIN);
>                          if (yp_match(st->yp_domain, "services.byname", buf,
>                              strlen(buf), &resultbuf, &resultbuflen)) {
>                                  rv = NS_NOTFOUND;
> @@ -724,8 +728,10 @@ nis_servent(void *retval, void *mdata, va_list ap)
>                          }
>                          break;
>                  case nss_lt_id:
> -                       snprintf(buf, sizeof(buf), "%d/%s", ntohs(port),
> -                           proto);
> +                       free(buf);
> +                       asprintf(&buf, "%d/%s", ntohs(port), proto);
> +                       if (buf == NULL)
> +                               return (NS_TRYAGAIN);
>
>                          /*
>                           * We have to be a little flexible
> @@ -791,6 +797,7 @@ nis_servent(void *retval, void *mdata, va_list ap)
>          } while (!(rv & NS_TERMINATE) && how == nss_lt_all);
>
>   fin:
> +       free(buf);
>          if (rv == NS_SUCCESS && retval != NULL)
>                  *(struct servent **)retval = serv;
>
>
> Modified: stable/12/lib/libc/rpc/getrpcent.c
> ==============================================================================
> --- stable/12/lib/libc/rpc/getrpcent.c  Mon Sep  2 08:03:29 2019        (r351690)
> +++ stable/12/lib/libc/rpc/getrpcent.c  Mon Sep  2 08:20:02 2019        (r351691)
> @@ -400,7 +400,7 @@ nis_rpcent(void *retval, void *mdata, va_list ap)
>          char    *lastkey;
>          char    *resultbuf;
>          int     resultbuflen;
> -       char    buf[YPMAXRECORD + 2];
> +       char    *buf;
>
>          struct nis_state        *st;
>          int             rv;
> @@ -422,6 +422,7 @@ nis_rpcent(void *retval, void *mdata, va_list ap)
>                  return (NS_NOTFOUND);
>          }
>
> +       buf = NULL;
>          rpc = va_arg(ap, struct rpcent *);
>          buffer = va_arg(ap, char *);
>          bufsize = va_arg(ap, size_t);
> @@ -445,7 +446,10 @@ nis_rpcent(void *retval, void *mdata, va_list ap)
>                  case nss_lt_name:
>                          if (!st->no_name_map)
>                          {
> -                               snprintf(buf, sizeof buf, "%s", name);
> +                               free(buf);
> +                               asprintf(&buf, "%s", name);
> +                               if (buf == NULL)
> +                                       return (NS_TRYAGAIN);
>                                  rv = yp_match(st->domain, "rpc.byname", buf,
>                                          strlen(buf), &resultbuf, &resultbuflen);
>
> @@ -473,7 +477,10 @@ nis_rpcent(void *retval, void *mdata, va_list ap)
>                          }
>                  break;
>                  case nss_lt_id:
> -                       snprintf(buf, sizeof buf, "%d", number);
> +                       free(buf);
> +                       asprintf(&buf, "%d", number);
> +                       if (buf == NULL)
> +                               return (NS_TRYAGAIN);
>                          if (yp_match(st->domain, "rpc.bynumber", buf,
>                                  strlen(buf), &resultbuf, &resultbuflen)) {
>                                  rv = NS_NOTFOUND;
> @@ -560,6 +567,7 @@ done:
>          } while (!(rv & NS_TERMINATE) && (how == nss_lt_all));
>
>   fin:
> +       free(buf);
>          if ((rv == NS_SUCCESS) && (retval != NULL))
>                  *((struct rpcent **)retval) = rpc;
>
>
> Modified: stable/12/usr.sbin/rpc.yppasswdd/yppasswdd_server.c
> ==============================================================================
> --- stable/12/usr.sbin/rpc.yppasswdd/yppasswdd_server.c Mon Sep  2 08:03:29 2019        (r351690)
> +++ stable/12/usr.sbin/rpc.yppasswdd/yppasswdd_server.c Mon Sep  2 08:20:02 2019        (r351691)
> @@ -323,15 +323,16 @@ update_inplace(struct passwd *pw, char *domain)
>          DB *dbp = NULL;
>          DBT key = { NULL, 0 };
>          DBT data = { NULL, 0 };
> -       char pwbuf[YPMAXRECORD];
> +       char *pwbuf;
>          char keybuf[20];
>          int i;
>          char *ptr = NULL;
>          static char yp_last[] = "YP_LAST_MODIFIED";
> -       char yplastbuf[YPMAXRECORD];
> +       char yplastbuf[64];
>
>          snprintf(yplastbuf, sizeof yplastbuf, "%llu",
>              (unsigned long long)time(NULL));
> +       pwbuf = NULL;
>
>          for (i = 0; i < 4; i++) {
>
> @@ -364,12 +365,12 @@ update_inplace(struct passwd *pw, char *domain)
>                  if (yp_get_record(domain,maps[i],&key,&data,1) != YP_TRUE) {
>                          yp_error("couldn't read %s/%s: %s", domain,
>                                                  maps[i], strerror(errno));
> -                       return(1);
> +                       goto ret1;
>                  }
>
>                  if ((ptr = strchr(data.data, ':')) == NULL) {
>                          yp_error("no colon in passwd record?!");
> -                       return(1);
> +                       goto ret1;
>                  }
>
>                  /*
> @@ -393,8 +394,12 @@ with the same UID - continuing");
>                           * We're really being ultra-paranoid here.
>                           * This is generally a 'can't happen' condition.
>                           */
> -                       snprintf(pwbuf, sizeof pwbuf, ":%d:%d:", pw->pw_uid,
> -                                                                 pw->pw_gid);
> +                       free(pwbuf);
> +                       asprintf(&pwbuf, ":%d:%d:", pw->pw_uid, pw->pw_gid);
> +                       if (pwbuf == NULL) {
> +                               yp_error("no memory");
> +                               goto ret1;
> +                       }
>                          if (!strstr(data.data, pwbuf)) {
>                                  yp_error("warning: found entry for user %s \
>   in map %s@%s with wrong UID", pw->pw_name, maps[i], domain);
> @@ -405,24 +410,30 @@ with the same name - continuing");
>                  }
>
>                  if (i < 2) {
> -                       snprintf(pwbuf, sizeof pwbuf, formats[i],
> +                       free(pwbuf);
> +                       asprintf(&pwbuf, formats[i],
>                             pw->pw_name, pw->pw_passwd, pw->pw_uid,
>                             pw->pw_gid, pw->pw_class, pw->pw_change,
>                             pw->pw_expire, pw->pw_gecos, pw->pw_dir,
>                             pw->pw_shell);
>                  } else {
> -                       snprintf(pwbuf, sizeof pwbuf, formats[i],
> +                       free(pwbuf);
> +                       asprintf(&pwbuf, formats[i],
>                             pw->pw_name, *(ptr+1) == '*' ? "*" : pw->pw_passwd,
>                             pw->pw_uid, pw->pw_gid, pw->pw_gecos, pw->pw_dir,
>                             pw->pw_shell);
>                  }
> +               if (pwbuf == NULL) {
> +                       yp_error("no memory");
> +                       goto ret1;
> +               }
>
>   #define FLAGS O_RDWR|O_CREAT
>
>                  if ((dbp = yp_open_db_rw(domain, maps[i], FLAGS)) == NULL) {
>                          yp_error("couldn't open %s/%s r/w: %s",domain,
>                                                  maps[i],strerror(errno));
> -                       return(1);
> +                       goto ret1;
>                  }
>
>                  data.data = pwbuf;
> @@ -432,7 +443,7 @@ with the same name - continuing");
>                          yp_error("failed to update record in %s/%s", domain,
>                                                                  maps[i]);
>                          (void)(dbp->close)(dbp);
> -                       return(1);
> +                       goto ret1;
>                  }
>
>                  key.data = yp_last;
> @@ -444,13 +455,17 @@ with the same name - continuing");
>                          yp_error("failed to update timestamp in %s/%s", domain,
>                                                                  maps[i]);
>                          (void)(dbp->close)(dbp);
> -                       return(1);
> +                       goto ret1;
>                  }
>
>                  (void)(dbp->close)(dbp);
>          }
>
> -       return(0);
> +       free(pwbuf);
> +       return (0);
> +ret1:
> +       free(pwbuf);
> +       return (1);
>   }
>
>   int *
>
> Modified: stable/12/usr.sbin/rpc.ypupdated/yp_dbupdate.c
> ==============================================================================
> --- stable/12/usr.sbin/rpc.ypupdated/yp_dbupdate.c      Mon Sep  2 08:03:29 2019        (r351690)
> +++ stable/12/usr.sbin/rpc.ypupdated/yp_dbupdate.c      Mon Sep  2 08:20:02 2019        (r351691)
> @@ -81,7 +81,7 @@ ypmap_update(char *netname, char *map, unsigned int op
>          DB *dbp;
>          DBT key = { NULL, 0 }, data = { NULL, 0 };
>          char *yp_last = "YP_LAST_MODIFIED";
> -       char yplastbuf[YPMAXRECORD];
> +       char yplastbuf[32];
>          char *domptr;
>          int rval = 0;
>
>
> Modified: stable/12/usr.sbin/ypldap/yp.c
> ==============================================================================
> --- stable/12/usr.sbin/ypldap/yp.c      Mon Sep  2 08:03:29 2019        (r351690)
> +++ stable/12/usr.sbin/ypldap/yp.c      Mon Sep  2 08:20:02 2019        (r351691)
> @@ -323,7 +323,7 @@ ypproc_match_2_svc(ypreq_key *arg, struct svc_req *req
>          static struct ypresp_val res;
>          const char              *estr;
>          char                    *bp, *cp;
> -       char                     key[YPMAXRECORD+1];
> +       char                     *key;
>
>          log_debug("matching '%.*s' in map %s", arg->key.keydat_len,
>             arg->key.keydat_val, arg->map);
> @@ -342,7 +342,9 @@ ypproc_match_2_svc(ypreq_key *arg, struct svc_req *req
>                  log_debug("argument too long");
>                  return (NULL);
>          }
> -       memset(key, 0, sizeof(key));
> +       key = calloc(arg->key.keydat_len + 1, 1);
> +       if (key == NULL)
> +               return (NULL);
>          (void)strncpy(key, arg->key.keydat_val, arg->key.keydat_len);
>
>          if (strcmp(arg->map, "passwd.byname") == 0 ||
> @@ -351,23 +353,23 @@ ypproc_match_2_svc(ypreq_key *arg, struct svc_req *req
>                  if ((ue = RB_FIND(user_name_tree, env->sc_user_names,
>                      &ukey)) == NULL) {
>                          res.stat = YP_NOKEY;
> -                       return (&res);
> +                       goto out;
>                  }
>
>                  yp_make_val(&res, ue->ue_line, 1);
> -               return (&res);
> +               goto out;
>          } else if (strcmp(arg->map, "passwd.byuid") == 0 ||
>                     strcmp(arg->map, "master.passwd.byuid") == 0) {
>                  ukey.ue_uid = strtonum(key, 0, UID_MAX, &estr);
>                  if (estr) {
>                          res.stat = YP_BADARGS;
> -                       return (&res);
> +                       goto out;
>                  }
>
>                  if ((ue = RB_FIND(user_uid_tree, &env->sc_user_uids,
>                      &ukey)) == NULL) {
>                          res.stat = YP_NOKEY;
> -                       return (&res);
> +                       goto out;
>                  }
>
>                  yp_make_val(&res, ue->ue_line, 1);
> @@ -376,12 +378,12 @@ ypproc_match_2_svc(ypreq_key *arg, struct svc_req *req
>                  gkey.ge_gid = strtonum(key, 0, GID_MAX, &estr);
>                  if (estr) {
>                          res.stat = YP_BADARGS;
> -                       return (&res);
> +                       goto out;
>                  }
>                  if ((ge = RB_FIND(group_gid_tree, &env->sc_group_gids,
>                      &gkey)) == NULL) {
>                          res.stat = YP_NOKEY;
> -                       return (&res);
> +                       goto out;
>                  }
>
>                  yp_make_val(&res, ge->ge_line, 1);
> @@ -391,7 +393,7 @@ ypproc_match_2_svc(ypreq_key *arg, struct svc_req *req
>                  if ((ge = RB_FIND(group_name_tree, env->sc_group_names,
>                      &gkey)) == NULL) {
>                          res.stat = YP_NOKEY;
> -                       return (&res);
> +                       goto out;
>                  }
>
>                  yp_make_val(&res, ge->ge_line, 1);
> @@ -401,46 +403,49 @@ ypproc_match_2_svc(ypreq_key *arg, struct svc_req *req
>
>                  if (strncmp(bp, "unix.", strlen("unix.")) != 0) {
>                          res.stat = YP_BADARGS;
> -                       return (&res);
> +                       goto out;
>                  }
>
>                  bp += strlen("unix.");
>
>                  if (*bp == '\0') {
>                          res.stat = YP_BADARGS;
> -                       return (&res);
> +                       goto out;
>                  }
>
>                  if (!(cp = strsep(&bp, "@"))) {
>                          res.stat = YP_BADARGS;
> -                       return (&res);
> +                       goto out;
>                  }
>
>                  if (strcmp(bp, arg->domain) != 0) {
>                          res.stat = YP_BADARGS;
> -                       return (&res);
> +                       goto out;
>                  }
>
>                  ukey.ue_uid = strtonum(cp, 0, UID_MAX, &estr);
>                  if (estr) {
>                          res.stat = YP_BADARGS;
> -                       return (&res);
> +                       goto out;
>                  }
>
>                  if ((ue = RB_FIND(user_uid_tree, &env->sc_user_uids,
>                      &ukey)) == NULL) {
>                          res.stat = YP_NOKEY;
> -                       return (&res);
> +                       goto out;
>                  }
>
>                  yp_make_val(&res, ue->ue_netid_line, 0);
> -               return (&res);
> +               goto out;
>
>          } else {
>                  log_debug("unknown map %s", arg->map);
>                  res.stat = YP_NOMAP;
> -               return (&res);
> +               goto out;
>          }
> +out:
> +       free(key);
> +       return (&res);
>   }
>
>   ypresp_key_val *
> @@ -479,14 +484,19 @@ ypproc_next_2_svc(ypreq_key *arg, struct svc_req *req)
>          struct groupent                 *ge;
>          char                            *line;
>          static struct ypresp_key_val     res;
> -       char                             key[YPMAXRECORD+1];
> +       char                             *key;
>
>          if (yp_valid_domain(arg->domain, (struct ypresp_val *)&res) == -1)
>                  return (&res);
>
> +       key = NULL;
>          if (strcmp(arg->map, "passwd.byname") == 0 ||
>              strcmp(arg->map, "master.passwd.byname") == 0) {
> -               memset(key, 0, sizeof(key));
> +               key = calloc(arg->key.keydat_len + 1, 1);
> +               if (key == NULL) {
> +                       res.stat = YP_YPERR;
> +                       return (&res);
> +               }
>                  (void)strncpy(key, arg->key.keydat_val,
>                      arg->key.keydat_len);
>                  ukey.ue_line = key;
> @@ -506,6 +516,7 @@ ypproc_next_2_svc(ypreq_key *arg, struct svc_req *req)
>                                  RB_REMOVE(user_name_tree, env->sc_user_names,
>                                      &ukey);
>                                  res.stat = YP_NOKEY;
> +                               free(key);
>                                  return (&res);
>                          }
>                          RB_REMOVE(user_name_tree, env->sc_user_names, &ukey);
> @@ -513,11 +524,16 @@ ypproc_next_2_svc(ypreq_key *arg, struct svc_req *req)
>                  line = ue->ue_line + (strlen(ue->ue_line) + 1);
>                  line = line + (strlen(line) + 1);
>                  yp_make_keyval(&res, line, line);
> +               free(key);
>                  return (&res);
>
>
>          } else if (strcmp(arg->map, "group.byname") == 0) {
> -               memset(key, 0, sizeof(key));
> +               key = calloc(arg->key.keydat_len + 1, 1);
> +               if (key == NULL) {
> +                       res.stat = YP_YPERR;
> +                       return (&res);
> +               }
>                  (void)strncpy(key, arg->key.keydat_val,
>                      arg->key.keydat_len);
>
> @@ -533,6 +549,7 @@ ypproc_next_2_svc(ypreq_key *arg, struct svc_req *req)
>                                  RB_REMOVE(group_name_tree, env->sc_group_names,
>                                      &gkey);
>                                  res.stat = YP_NOKEY;
> +                               free(key);
>                                  return (&res);
>                          }
>                          RB_REMOVE(group_name_tree, env->sc_group_names, &gkey);
> @@ -541,6 +558,7 @@ ypproc_next_2_svc(ypreq_key *arg, struct svc_req *req)
>                  line = ge->ge_line + (strlen(ge->ge_line) + 1);
>                  line = line + (strlen(line) + 1);
>                  yp_make_keyval(&res, line, line);
> +               free(key);
>                  return (&res);
>          } else {
>                  log_debug("unknown map %s", arg->map);
>
> Modified: stable/12/usr.sbin/yppush/yppush_main.c
> ==============================================================================
> --- stable/12/usr.sbin/yppush/yppush_main.c     Mon Sep  2 08:03:29 2019        (r351690)
> +++ stable/12/usr.sbin/yppush/yppush_main.c     Mon Sep  2 08:20:02 2019        (r351691)
> @@ -438,15 +438,26 @@ static int
>   yppush_foreach(int status, char *key, int keylen, char *val, int vallen,
>       char *data)
>   {
> -       char server[YPMAXRECORD + 2];
> +       char *server;
>
>          if (status != YP_TRUE)
>                  return (status);
>
> -       snprintf(server, sizeof(server), "%.*s", vallen, val);
> -       if (skip_master && strcasecmp(server, yppush_master) == 0)
> +       asprintf(&server, "%.*s", vallen, val);
> +
> +       /*
> +        * Do not stop the iteration on the allocation failure.  We
> +        * cannot usefully react on low memory condition anyway, and
> +        * the failure is more likely due to insane val.
> +        */
> +       if (server == NULL)
>                  return (0);
>
> +       if (skip_master && strcasecmp(server, yppush_master) == 0) {
> +               free(server);
> +               return (0);
> +       }
> +
>          /*
>           * Restrict the number of concurrent jobs: if yppush_jobs number
>           * of jobs have already been dispatched and are still pending,
> @@ -456,12 +467,15 @@ yppush_foreach(int status, char *key, int keylen, char
>                  ;
>
>          /* Cleared for takeoff: set everything in motion. */
> -       if (yp_push(server, yppush_mapname, yppush_transid))
> +       if (yp_push(server, yppush_mapname, yppush_transid)) {
> +               free(server);
>                  return(yp_errno);
> +       }
>
>          /* Bump the job counter and transaction ID. */
>          yppush_running_jobs++;
>          yppush_transid++;
> +       free(server);
>          return (0);
>   }
>
>
> Modified: stable/12/usr.sbin/ypserv/yp_server.c
> ==============================================================================
> --- stable/12/usr.sbin/ypserv/yp_server.c       Mon Sep  2 08:03:29 2019        (r351690)
> +++ stable/12/usr.sbin/ypserv/yp_server.c       Mon Sep  2 08:20:02 2019        (r351691)
> @@ -173,8 +173,9 @@ ypproc_match_2_svc(ypreq_key *argp, struct svc_req *rq
>          if (do_dns && result.stat != YP_TRUE &&
>              (strstr(argp->map, "hosts") || strstr(argp->map, "ipnodes"))) {
>   #endif
> -               char                    nbuf[YPMAXRECORD];
> +               char *nbuf;
>
> +               nbuf = alloca(argp->key.keydat_len + 1);
>                  /* NUL terminate! NUL terminate!! NUL TERMINATE!!! */
>                  bcopy(argp->key.keydat_val, nbuf, argp->key.keydat_len);
>                  nbuf[argp->key.keydat_len] = '\0';
>
>
>


More information about the svn-src-stable-12 mailing list