Author: scottl
Date: Sun Nov 15 07:48:52 2020
New Revision: 367701
URL: https://svnweb.freebsd.org/changeset/base/367701

Log:
  Because getlocalbase() returns -1 on error, it needs to use a signed type
  internally.  Do that, and make sure that conversations between signed and
  unsigned don't overflow

Modified:
  head/lib/libutil/getlocalbase.c

Modified: head/lib/libutil/getlocalbase.c
==============================================================================
--- head/lib/libutil/getlocalbase.c     Sun Nov 15 01:54:44 2020        
(r367700)
+++ head/lib/libutil/getlocalbase.c     Sun Nov 15 07:48:52 2020        
(r367701)
@@ -41,7 +41,7 @@ __FBSDID("$FreeBSD$");
 ssize_t
 getlocalbase(char *path, size_t pathlen)
 {
-       size_t tmplen;
+       ssize_t tmplen;
        const char *tmppath;
 
        if ((pathlen == 0) || (path == NULL)) {
@@ -49,13 +49,20 @@ getlocalbase(char *path, size_t pathlen)
                return (-1);
        }
 
+       /* It's unlikely that the buffer would be this big */
+       if (pathlen > SSIZE_MAX) {
+               errno = ENOMEM;
+               return (-1);
+       }
+
        tmppath = NULL;
-       tmplen = pathlen;
+       tmplen = (size_t)pathlen;
        if (issetugid() == 0)
                tmppath = getenv("LOCALBASE");
 
        if ((tmppath == NULL) &&
-           (sysctlbyname("user.localbase", path, &tmplen, NULL, 0) == 0)) {
+           (sysctlbyname("user.localbase", path, (size_t *)&tmplen, NULL,
+           0) == 0)) {
                return (tmplen);
        }
 
@@ -67,13 +74,13 @@ getlocalbase(char *path, size_t pathlen)
 #endif
 
        tmplen = strlcpy(path, tmppath, pathlen);
-       if ((tmplen < 0) || (tmplen >= pathlen)) {
+       if ((tmplen < 0) || (tmplen >= (ssize_t)pathlen)) {
                errno = ENOMEM;
                return (-1);
        }
 
        /* It's unlikely that the buffer would be this big */
-       if (tmplen >= SSIZE_MAX) {
+       if (tmplen > SSIZE_MAX) {
                errno = ENOMEM;
                return (-1);
        }
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to