svn commit: r365615 - head/lib/libc/sys

Kyle Evans kevans at FreeBSD.org
Thu Sep 10 21:25:17 UTC 2020


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);


More information about the svn-src-all mailing list