Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 15 Feb 2015 14:31:51 +0000 (UTC)
From:      "Pedro F. Giffuni" <pfg@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r278803 - head/lib/libc/gen
Message-ID:  <201502151431.t1FEVpaD070432@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: pfg
Date: Sun Feb 15 14:31:50 2015
New Revision: 278803
URL: https://svnweb.freebsd.org/changeset/base/278803

Log:
  ulimit(3): Fix broken check.
  
  The existing implementation had a broken comparison that could
  overflow and return confusing values.  Replace this with a check
  that avoids the overflow before it happens.
  
  Consistently return a maximum value also on the case of negative
  arguments since negative is considered an overflow and means
  infinity for our current setrlimit().
  
  New revamped version is credited to Bruce Evans.
  
  CID:		1199295
  MFC after:	1 week

Modified:
  head/lib/libc/gen/ulimit.c

Modified: head/lib/libc/gen/ulimit.c
==============================================================================
--- head/lib/libc/gen/ulimit.c	Sun Feb 15 14:25:00 2015	(r278802)
+++ head/lib/libc/gen/ulimit.c	Sun Feb 15 14:31:50 2015	(r278803)
@@ -33,6 +33,7 @@
 #include <errno.h>
 #include <limits.h>
 #include <stdarg.h>
+#include <stdint.h>
 #include <ulimit.h>
 
 long
@@ -40,6 +41,7 @@ ulimit(int cmd, ...)
 {
 	struct rlimit limit;
 	va_list ap;
+	volatile intmax_t targ;
 	long arg;
 
 	if (cmd == UL_GETFSIZE) {
@@ -51,16 +53,18 @@ ulimit(int cmd, ...)
 		return ((long)limit.rlim_cur);
 	} else if (cmd == UL_SETFSIZE) {
 		va_start(ap, cmd);
-		arg = va_arg(ap, long);
+		targ = arg = va_arg(ap, long);
 		va_end(ap);
-		limit.rlim_max = limit.rlim_cur = (rlim_t)arg * 512;
+		if (targ < 0)
+			targ = LONG_MAX;
+		if (targ > RLIM_INFINITY / 512)
+			targ = RLIM_INFINITY / 512;
+		limit.rlim_max = limit.rlim_cur = targ * 512;
 
 		/* The setrlimit() function sets errno to EPERM if needed. */
 		if (setrlimit(RLIMIT_FSIZE, &limit) == -1)
 			return (-1);
-		if (arg * 512 > LONG_MAX)
-			return (LONG_MAX);
-		return (arg);
+		return ((long)targ);
 	} else {
 		errno = EINVAL;
 		return (-1);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201502151431.t1FEVpaD070432>