Author: ache
Date: Thu Aug 25 19:55:31 2016
New Revision: 304816
URL: https://svnweb.freebsd.org/changeset/base/304816

Log:
  MFC r295632
  
  getln: We cannot expand the buffer beyond INT_MAX (_size overflows).
  
  In such cases return ENOMEM. This is a limitation of our
  implementation, alternatively you may consider getline(3).
  
  Differential Revision:  https://reviews.freebsd.org/D442 (Partial)
  Obtained from:  Apple Inc. (Libc 997.90.3)

Modified:
  stable/10/lib/libc/stdio/fgetln.3
  stable/10/lib/libc/stdio/fgetln.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/lib/libc/stdio/fgetln.3
==============================================================================
--- stable/10/lib/libc/stdio/fgetln.3   Thu Aug 25 19:40:25 2016        
(r304815)
+++ stable/10/lib/libc/stdio/fgetln.3   Thu Aug 25 19:55:31 2016        
(r304816)
@@ -28,7 +28,7 @@
 .\"     @(#)fgetln.3   8.3 (Berkeley) 4/19/94
 .\" $FreeBSD$
 .\"
-.Dd April 19, 1994
+.Dd February 15, 2016
 .Dt FGETLN 3
 .Os
 .Sh NAME
@@ -97,6 +97,9 @@ These changes are lost as soon as the po
 The argument
 .Fa stream
 is not a stream open for reading.
+.It Bq Er ENOMEM
+The internal line buffer could not be expanded due to lack of available memory,
+or because it would need to expand beyond INT_MAX in size.
 .El
 .Pp
 The

Modified: stable/10/lib/libc/stdio/fgetln.c
==============================================================================
--- stable/10/lib/libc/stdio/fgetln.c   Thu Aug 25 19:40:25 2016        
(r304815)
+++ stable/10/lib/libc/stdio/fgetln.c   Thu Aug 25 19:55:31 2016        
(r304816)
@@ -37,6 +37,8 @@ static char sccsid[] = "@(#)fgetln.c  8.2
 __FBSDID("$FreeBSD$");
 
 #include "namespace.h"
+#include <errno.h>
+#include <limits.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -61,6 +63,10 @@ __slbexpand(FILE *fp, size_t newsize)
 #endif
        if (fp->_lb._size >= newsize)
                return (0);
+       if (newsize > INT_MAX) {
+               errno = ENOMEM;
+               return (-1);
+       }
        if ((p = realloc(fp->_lb._base, newsize)) == NULL)
                return (-1);
        fp->_lb._base = p;
@@ -152,7 +158,7 @@ fgetln(FILE *fp, size_t *lenp)
        }
        *lenp = len;
 #ifdef notdef
-       fp->_lb._base[len] = 0;
+       fp->_lb._base[len] = '\0';
 #endif
        FUNLOCKFILE(fp);
        return ((char *)fp->_lb._base);
_______________________________________________
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