summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorngie <ngie@FreeBSD.org>2015-01-11 19:15:28 +0000
committerngie <ngie@FreeBSD.org>2015-01-11 19:15:28 +0000
commit0a1f910d396bf47c3adf1608f16805eafce1c69c (patch)
treea6ea4260d0fa3a951d8063b29c894d9134fb675b /lib
parentaddcd434f9cfc53268eb0ba8220e61e410a48727 (diff)
downloadFreeBSD-src-0a1f910d396bf47c3adf1608f16805eafce1c69c.zip
FreeBSD-src-0a1f910d396bf47c3adf1608f16805eafce1c69c.tar.gz
MFC discussed with: jilles, -developers
MFC r266971: - Return NULL and set errno to EINVAL if size is 0 (as required by POSIX). Update the manpage to reflect this change. - Always set the current position to the first null-byte when opening in append mode. This makes the implementation compatible with glibc's. Update the test suite. Reported by: pho Approved by: cognet
Diffstat (limited to 'lib')
-rw-r--r--lib/libc/stdio/fmemopen.c17
-rw-r--r--lib/libc/stdio/fopen.39
2 files changed, 18 insertions, 8 deletions
diff --git a/lib/libc/stdio/fmemopen.c b/lib/libc/stdio/fmemopen.c
index 581a91e..ebd3596 100644
--- a/lib/libc/stdio/fmemopen.c
+++ b/lib/libc/stdio/fmemopen.c
@@ -57,6 +57,14 @@ fmemopen(void * __restrict buf, size_t size, const char * __restrict mode)
int flags, rc;
/*
+ * POSIX says we shall return EINVAL if size is 0.
+ */
+ if (size == 0) {
+ errno = EINVAL;
+ return (NULL);
+ }
+
+ /*
* Retrieve the flags as used by open(2) from the mode argument, and
* validate them.
*/
@@ -119,14 +127,7 @@ fmemopen(void * __restrict buf, size_t size, const char * __restrict mode)
*/
switch (mode[0]) {
case 'a':
- if (ck->bin) {
- /*
- * This isn't useful, since the buffer isn't allowed
- * to grow.
- */
- ck->off = ck->len = size;
- } else
- ck->off = ck->len = strnlen(ck->buf, ck->size);
+ ck->off = ck->len = strnlen(ck->buf, ck->size);
break;
case 'r':
ck->len = size;
diff --git a/lib/libc/stdio/fopen.3 b/lib/libc/stdio/fopen.3
index f11f4e0..b39cb5a 100644
--- a/lib/libc/stdio/fopen.3
+++ b/lib/libc/stdio/fopen.3
@@ -302,6 +302,15 @@ for any of the errors specified for the routines
.Xr fclose 3
and
.Xr fflush 3 .
+.Pp
+The
+.Fn fmemopen
+function
+may also fail and set
+.Va errno
+if the
+.Fa size
+argument is 0.
.Sh SEE ALSO
.Xr open 2 ,
.Xr fclose 3 ,
OpenPOWER on IntegriCloud