Fix incorrect range check for size in setvbuf
authorgnezdo <gnezdo@openbsd.org>
Wed, 28 Sep 2022 16:44:14 +0000 (16:44 +0000)
committergnezdo <gnezdo@openbsd.org>
Wed, 28 Sep 2022 16:44:14 +0000 (16:44 +0000)
From enh AT google.com:

The existing test is wrong for LP64, where size_t has twice as many
relevant bits as int, not just one. (Found by inspection by
rprichard.)

Looks good to deraadt@ and millert@

lib/libc/stdio/setvbuf.c

index 9a08d13..74a1695 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: setvbuf.c,v 1.14 2016/09/21 04:38:56 guenther Exp $ */
+/*     $OpenBSD: setvbuf.c,v 1.15 2022/09/28 16:44:14 gnezdo Exp $ */
 /*-
  * Copyright (c) 1990, 1993
  *     The Regents of the University of California.  All rights reserved.
@@ -31,6 +31,7 @@
  * SUCH DAMAGE.
  */
 
+#include <limits.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include "local.h"
@@ -52,7 +53,7 @@ setvbuf(FILE *fp, char *buf, int mode, size_t size)
         * when setting _IONBF.
         */
        if (mode != _IONBF)
-               if ((mode != _IOFBF && mode != _IOLBF) || (int)size < 0)
+               if ((mode != _IOFBF && mode != _IOLBF) || size > INT_MAX)
                        return (EOF);
 
        /*