Author: kevans
Date: Thu Sep 10 21:25:16 2020
New Revision: 365615
URL: https://svnweb.freebsd.org/changeset/base/365615

Log:
  memfd_create: fix return values
  
  Literally returning EINVAL from a function designed to return an fd makes
  for interesting scenarios.
  
  I cannot assign enough pointy hats to cover this one.

Modified:
  head/lib/libc/sys/shm_open.c

Modified: head/lib/libc/sys/shm_open.c
==============================================================================
--- head/lib/libc/sys/shm_open.c        Thu Sep 10 21:01:22 2020        
(r365614)
+++ head/lib/libc/sys/shm_open.c        Thu Sep 10 21:25:16 2020        
(r365615)
@@ -115,18 +115,26 @@ memfd_create(const char *name, unsigned int flags)
        struct shm_largepage_conf slc;
        int error, fd, i, npgs, oflags, pgidx, saved_errno, shmflags;
 
-       if (name == NULL)
-               return (EBADF);
+       if (name == NULL) {
+               errno = EBADF;
+               return (-1);
+       }
        namelen = strlen(name);
-       if (namelen + sizeof(MEMFD_NAME_PREFIX) - 1 > NAME_MAX)
-               return (EINVAL);
+       if (namelen + sizeof(MEMFD_NAME_PREFIX) - 1 > NAME_MAX) {
+               errno = EINVAL;
+               return (-1);
+       }
        if ((flags & ~(MFD_CLOEXEC | MFD_ALLOW_SEALING | MFD_HUGETLB |
-           MFD_HUGE_MASK)) != 0)
-               return (EINVAL);
+           MFD_HUGE_MASK)) != 0) {
+               errno = EINVAL;
+               return (-1);
+       }
        /* Size specified but no HUGETLB. */
        if (((flags & MFD_HUGE_MASK) != 0 && (flags & MFD_HUGETLB) == 0) ||
-           __bitcount(flags & MFD_HUGE_MASK) > 1)
-               return (EINVAL);
+           __bitcount(flags & MFD_HUGE_MASK) > 1) {
+               errno = EINVAL;
+               return (-1);
+       }
 
        /* We've already validated that we're sufficiently sized. */
        snprintf(memfd_name, NAME_MAX + 1, "%s%s", MEMFD_NAME_PREFIX, name);
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to