aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog60
-rw-r--r--debug/pread64_chk.c2
-rw-r--r--debug/pread_chk.c2
-rw-r--r--debug/tst-chk1.c231
-rw-r--r--libio/bits/stdio2.h57
-rw-r--r--malloc/malloc.c15
-rw-r--r--math/test-misc.c42
-rw-r--r--misc/sys/cdefs.h7
-rw-r--r--posix/bits/unistd.h18
-rw-r--r--posix/regcomp.c12
-rw-r--r--posix/regex_internal.c27
-rw-r--r--socket/bits/socket2.h36
-rw-r--r--string/bits/string3.h27
13 files changed, 459 insertions, 77 deletions
diff --git a/ChangeLog b/ChangeLog
index 3455a57514..683c403199 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,7 +1,65 @@
+2005-03-10 Jakub Jelinek <jakub@redhat.com>
+
+ * math/test-misc.c (main): Add some more tests.
+
+2005-03-17 Jakub Jelinek <jakub@redhat.com>
+
+ * posix/regcomp.c (re_compile_fastmap_iter): Fix check for failed
+ __wcrtomb. Check return values of other __wcrtomb calls.
+ * posix/regex_internal.c (build_wcs_buffer, re_string_skip_chars):
+ Change mbclen type to size_t.
+ (build_wcs_upper_buffer): Change mbclen and mbcdlen type to size_t.
+ Handle mb chars whose upper case doesn't have multibyte representation
+ in locale's charset.
+
+2005-03-15 Jakub Jelinek <jakub@redhat.com>
+
+ * malloc/malloc.c (_int_icalloc, _int_icomalloc, iALLOc,
+ public_iCALLOc, public_iCALLOc, public_iCOMALLOc): Protect with
+ #ifndef _LIBC.
+
+ [BZ #779]
+ * malloc/malloc.c (public_mTRIm): Initialize malloc if not yet
+ initialized.
+
+2005-03-10 Jakub Jelinek <jakub@redhat.com>
+
+ * misc/sys/cdefs.h (__always_inline): Define.
+ * posix/bits/unistd.h (read, pread, pread64, readlink, getcwd, getwd):
+ Use __always_inline instead of __inline.
+ * socket/bits/socket2.h (recv, recvfrom): Likewise.
+ * libio/bits/stdio2.h (gets, fgets, fgets_unlocked): Likewise.
+ * string/bits/string3.h (__memcpy_ichk, __memmove_ichk, __mempcpy_ichk,
+ __memset_ichk, __strcpy_ichk, __stpcpy_ichk, __strncpy_ichk,
+ __strcat_ichk, __strncat_ichk): Use __always_inline instead of
+ __inline__ __attribute__ ((__always_inline__)).
+
+2005-03-09 Jakub Jelinek <jakub@redhat.com>
+
+ * debug/tst-chk1.c: Include sys/socket.h and sys/un.h.
+ (do_test): Add new tests for recv, recvfrom, getcwd, getwd and
+ readlink. Add some more tests for read, pread, pread64, fgets and
+ fgets_unlocked.
+
+ * posix/bits/unistd.h (read, pread, pread64, readlink,
+ getcwd, getwd): Change macros into extern inline functions.
+ (__read_alias, __pread_alias, __pread64_alias, __readlink_alias,
+ __getcwd_alias, __getwd_alias): New prototypes.
+ * socket/bits/socket2.h (recv, recvfrom): Change macros into
+ extern inline functions.
+ (__recv_alias, __recvfrom_alias): New prototypes.
+ * libio/bits/stdio2.h (gets, fgets, fgets_unlocked): Change macros
+ into extern inline functions.
+ (__gets_alias, __fgets_alias, __fgets_unlocked_alias): New prototypes.
+
+ * debug/pread_chk.c (__pread_chk): Fix order of arguments passed
+ to __pread.
+ * debug/pread64_chk.c (__pread64_chk): Fix order of arguments passed
+ to __pread64.
+
2005-03-18 Daniel Jacobowitz <dan@codesourcery.com>
* configure.in: Use %function instead of @function.
- * configure: Regenerated.
2005-03-18 Ulrich Drepper <drepper@redhat.com>
diff --git a/debug/pread64_chk.c b/debug/pread64_chk.c
index 93e5151ddc..4958881455 100644
--- a/debug/pread64_chk.c
+++ b/debug/pread64_chk.c
@@ -26,5 +26,5 @@ __pread64_chk (int fd, void *buf, size_t nbytes, off64_t offset, size_t buflen)
if (nbytes > buflen)
__chk_fail ();
- return __pread64 (fd, buf, offset, nbytes);
+ return __pread64 (fd, buf, nbytes, offset);
}
diff --git a/debug/pread_chk.c b/debug/pread_chk.c
index 24c13103dd..de111eaf82 100644
--- a/debug/pread_chk.c
+++ b/debug/pread_chk.c
@@ -26,5 +26,5 @@ __pread_chk (int fd, void *buf, size_t nbytes, off_t offset, size_t buflen)
if (nbytes > buflen)
__chk_fail ();
- return __pread (fd, buf, offset, nbytes);
+ return __pread (fd, buf, nbytes, offset);
}
diff --git a/debug/tst-chk1.c b/debug/tst-chk1.c
index 3ed1cd9825..6389d1150e 100644
--- a/debug/tst-chk1.c
+++ b/debug/tst-chk1.c
@@ -24,6 +24,8 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <sys/socket.h>
+#include <sys/un.h>
#include <unistd.h>
char *temp_filename;
@@ -463,11 +465,22 @@ do_test (void)
if (fgets (buf, sizeof (buf), stdin) != buf || memcmp (buf, "ABCDEFGHI", 10))
FAIL ();
+ rewind (stdin);
+
+ if (fgets (buf, l0 + sizeof (buf), stdin) != buf
+ || memcmp (buf, "abcdefgh\n", 10))
+ FAIL ();
+
#if __USE_FORTIFY_LEVEL >= 1
CHK_FAIL_START
if (fgets (buf, sizeof (buf) + 1, stdin) != buf)
FAIL ();
CHK_FAIL_END
+
+ CHK_FAIL_START
+ if (fgets (buf, l0 + sizeof (buf) + 1, stdin) != buf)
+ FAIL ();
+ CHK_FAIL_END
#endif
rewind (stdin);
@@ -479,11 +492,22 @@ do_test (void)
|| memcmp (buf, "ABCDEFGHI", 10))
FAIL ();
+ rewind (stdin);
+
+ if (fgets_unlocked (buf, l0 + sizeof (buf), stdin) != buf
+ || memcmp (buf, "abcdefgh\n", 10))
+ FAIL ();
+
#if __USE_FORTIFY_LEVEL >= 1
CHK_FAIL_START
if (fgets_unlocked (buf, sizeof (buf) + 1, stdin) != buf)
FAIL ();
CHK_FAIL_END
+
+ CHK_FAIL_START
+ if (fgets_unlocked (buf, l0 + sizeof (buf) + 1, stdin) != buf)
+ FAIL ();
+ CHK_FAIL_END
#endif
lseek (fileno (stdin), 0, SEEK_SET);
@@ -495,6 +519,12 @@ do_test (void)
|| memcmp (buf, "ABCDEFGHI", 9))
FAIL ();
+ lseek (fileno (stdin), 0, SEEK_SET);
+
+ if (read (fileno (stdin), buf, l0 + sizeof (buf) - 1) != sizeof (buf) - 1
+ || memcmp (buf, "abcdefgh\n", 9))
+ FAIL ();
+
#if __USE_FORTIFY_LEVEL >= 1
CHK_FAIL_START
if (read (fileno (stdin), buf, sizeof (buf) + 1) != sizeof (buf) + 1)
@@ -502,12 +532,16 @@ do_test (void)
CHK_FAIL_END
#endif
+ if (pread (fileno (stdin), buf, sizeof (buf) - 1, sizeof (buf) - 2)
+ != sizeof (buf) - 1
+ || memcmp (buf, "\nABCDEFGH", 9))
+ FAIL ();
if (pread (fileno (stdin), buf, sizeof (buf) - 1, 0) != sizeof (buf) - 1
|| memcmp (buf, "abcdefgh\n", 9))
FAIL ();
- if (pread (fileno (stdin), buf, sizeof (buf) - 1, sizeof (buf) - 1)
+ if (pread (fileno (stdin), buf, l0 + sizeof (buf) - 1, sizeof (buf) - 3)
!= sizeof (buf) - 1
- || memcmp (buf, "ABCDEFGHI", 9))
+ || memcmp (buf, "h\nABCDEFG", 9))
FAIL ();
#if __USE_FORTIFY_LEVEL >= 1
@@ -518,17 +552,21 @@ do_test (void)
CHK_FAIL_END
#endif
+ if (pread64 (fileno (stdin), buf, sizeof (buf) - 1, sizeof (buf) - 2)
+ != sizeof (buf) - 1
+ || memcmp (buf, "\nABCDEFGH", 9))
+ FAIL ();
if (pread64 (fileno (stdin), buf, sizeof (buf) - 1, 0) != sizeof (buf) - 1
|| memcmp (buf, "abcdefgh\n", 9))
FAIL ();
- if (pread64 (fileno (stdin), buf, sizeof (buf) - 1, sizeof (buf) - 1)
+ if (pread64 (fileno (stdin), buf, l0 + sizeof (buf) - 1, sizeof (buf) - 3)
!= sizeof (buf) - 1
- || memcmp (buf, "ABCDEFGHI", 9))
+ || memcmp (buf, "h\nABCDEFG", 9))
FAIL ();
#if __USE_FORTIFY_LEVEL >= 1
CHK_FAIL_START
- if (pread64 (fileno (stdin), buf, sizeof (buf) + 1, 2 * (sizeof (buf) - 1))
+ if (pread64 (fileno (stdin), buf, sizeof (buf) + 1, 2 * sizeof (buf))
!= sizeof (buf) + 1)
FAIL ();
CHK_FAIL_END
@@ -570,5 +608,188 @@ do_test (void)
snprintf (buf, sizeof (buf), "%3$d\n", 1, 2, 3, 4);
CHK_FAIL2_END
+ int sp[2];
+ if (socketpair (PF_UNIX, SOCK_STREAM, 0, sp))
+ FAIL ();
+ else
+ {
+ const char *sendstr = "abcdefgh\nABCDEFGH\n0123456789\n";
+ if (send (sp[0], sendstr, strlen (sendstr), 0) != strlen (sendstr))
+ FAIL ();
+
+ char recvbuf[12];
+ if (recv (sp[1], recvbuf, sizeof recvbuf, MSG_PEEK)
+ != sizeof recvbuf
+ || memcmp (recvbuf, sendstr, sizeof recvbuf) != 0)
+ FAIL ();
+
+ if (recv (sp[1], recvbuf + 6, l0 + sizeof recvbuf - 7, MSG_PEEK)
+ != sizeof recvbuf - 7
+ || memcmp (recvbuf + 6, sendstr, sizeof recvbuf - 7) != 0)
+ FAIL ();
+
+#if __USE_FORTIFY_LEVEL >= 1
+ CHK_FAIL_START
+ if (recv (sp[1], recvbuf + 1, sizeof recvbuf, MSG_PEEK)
+ != sizeof recvbuf)
+ FAIL ();
+ CHK_FAIL_END
+
+ CHK_FAIL_START
+ if (recv (sp[1], recvbuf + 4, l0 + sizeof recvbuf - 3, MSG_PEEK)
+ != sizeof recvbuf - 3)
+ FAIL ();
+ CHK_FAIL_END
+#endif
+
+ socklen_t sl;
+ struct sockaddr_un sa_un;
+
+ sl = sizeof (sa_un);
+ if (recvfrom (sp[1], recvbuf, sizeof recvbuf, MSG_PEEK, &sa_un, &sl)
+ != sizeof recvbuf
+ || memcmp (recvbuf, sendstr, sizeof recvbuf) != 0)
+ FAIL ();
+
+ sl = sizeof (sa_un);
+ if (recvfrom (sp[1], recvbuf + 6, l0 + sizeof recvbuf - 7, MSG_PEEK,
+ &sa_un, &sl) != sizeof recvbuf - 7
+ || memcmp (recvbuf + 6, sendstr, sizeof recvbuf - 7) != 0)
+ FAIL ();
+
+#if __USE_FORTIFY_LEVEL >= 1
+ CHK_FAIL_START
+ sl = sizeof (sa_un);
+ if (recvfrom (sp[1], recvbuf + 1, sizeof recvbuf, MSG_PEEK, &sa_un, &sl)
+ != sizeof recvbuf)
+ FAIL ();
+ CHK_FAIL_END
+
+ CHK_FAIL_START
+ sl = sizeof (sa_un);
+ if (recvfrom (sp[1], recvbuf + 4, l0 + sizeof recvbuf - 3, MSG_PEEK,
+ &sa_un, &sl) != sizeof recvbuf - 3)
+ FAIL ();
+ CHK_FAIL_END
+#endif
+
+ close (sp[0]);
+ close (sp[1]);
+ }
+
+ char fname[] = "/tmp/tst-chk1-dir-XXXXXX\0foo";
+ char *enddir = strchr (fname, '\0');
+ if (mkdtemp (fname) == NULL)
+ {
+ printf ("mkdtemp failed: %m\n");
+ return 1;
+ }
+ *enddir = '/';
+ if (symlink ("bar", fname) != 0)
+ FAIL ();
+
+ char readlinkbuf[4];
+ if (readlink (fname, readlinkbuf, 4) != 3
+ || memcmp (readlinkbuf, "bar", 3) != 0)
+ FAIL ();
+ if (readlink (fname, readlinkbuf + 1, l0 + 3) != 3
+ || memcmp (readlinkbuf, "bbar", 4) != 0)
+ FAIL ();
+
+#if __USE_FORTIFY_LEVEL >= 1
+ CHK_FAIL_START
+ if (readlink (fname, readlinkbuf + 2, l0 + 3) != 3)
+ FAIL ();
+ CHK_FAIL_END
+
+ CHK_FAIL_START
+ if (readlink (fname, readlinkbuf + 3, 4) != 3)
+ FAIL ();
+ CHK_FAIL_END
+#endif
+
+ char *cwd1 = getcwd (NULL, 0);
+ if (cwd1 == NULL)
+ FAIL ();
+
+ char *cwd2 = getcwd (NULL, 250);
+ if (cwd2 == NULL)
+ FAIL ();
+
+ if (cwd1 && cwd2)
+ {
+ if (strcmp (cwd1, cwd2) != 0)
+ FAIL ();
+
+ *enddir = '\0';
+ if (chdir (fname))
+ FAIL ();
+
+ char *cwd3 = getcwd (NULL, 0);
+ if (cwd3 == NULL)
+ FAIL ();
+ if (strcmp (fname, cwd3) != 0)
+ printf ("getcwd after chdir is '%s' != '%s',"
+ "get{c,}wd tests skipped\n", cwd3, fname);
+ else
+ {
+ char getcwdbuf[sizeof fname - 3];
+
+ char *cwd4 = getcwd (getcwdbuf, sizeof getcwdbuf);
+ if (cwd4 != getcwdbuf
+ || strcmp (getcwdbuf, fname) != 0)
+ FAIL ();
+
+ cwd4 = getcwd (getcwdbuf + 1, l0 + sizeof getcwdbuf - 1);
+ if (cwd4 != getcwdbuf + 1
+ || getcwdbuf[0] != fname[0]
+ || strcmp (getcwdbuf + 1, fname) != 0)
+ FAIL ();
+
+#if __USE_FORTIFY_LEVEL >= 1
+ CHK_FAIL_START
+ if (getcwd (getcwdbuf + 2, l0 + sizeof getcwdbuf)
+ != getcwdbuf + 2)
+ FAIL ();
+ CHK_FAIL_END
+
+ CHK_FAIL_START
+ if (getcwd (getcwdbuf + 2, sizeof getcwdbuf)
+ != getcwdbuf + 2)
+ FAIL ();
+ CHK_FAIL_END
+#endif
+
+ if (getwd (getcwdbuf) != getcwdbuf
+ || strcmp (getcwdbuf, fname) != 0)
+ FAIL ();
+
+ if (getwd (getcwdbuf + 1) != getcwdbuf + 1
+ || strcmp (getcwdbuf + 1, fname) != 0)
+ FAIL ();
+
+#if __USE_FORTIFY_LEVEL >= 1
+ CHK_FAIL_START
+ if (getwd (getcwdbuf + 2) != getcwdbuf + 2)
+ FAIL ();
+ CHK_FAIL_END
+#endif
+ }
+
+ if (chdir (cwd1) != 0)
+ FAIL ();
+ free (cwd3);
+ }
+
+ free (cwd1);
+ free (cwd2);
+ *enddir = '/';
+ if (unlink (fname) != 0)
+ FAIL ();
+
+ *enddir = '\0';
+ if (rmdir (fname) != 0)
+ FAIL ();
+
return ret;
}
diff --git a/libio/bits/stdio2.h b/libio/bits/stdio2.h
index 4181f8a9a9..0582edbccb 100644
--- a/libio/bits/stdio2.h
+++ b/libio/bits/stdio2.h
@@ -72,18 +72,45 @@ extern int __vprintf_chk (int __flag, __const char *__restrict __format,
#endif
-extern char *__gets_chk (char *__str, size_t);
-#define gets(__str) \
- ((__bos (__str) == (size_t) -1) \
- ? gets (__str) : __gets_chk (__str, __bos (__str)))
-
-extern char *__fgets_chk (char *s, size_t size, int n, FILE *stream);
-#define fgets(__str, __n, __fp) \
- ((__bos (__str) == (size_t) -1) \
- ? fgets (__str, __n, __fp) : __fgets_chk (__str, __bos (__str), __n, __fp))
-
-extern char *__fgets_unlocked_chk (char *s, size_t size, int n, FILE *stream);
-#define fgets_unlocked(__str, __n, __fp) \
- ((__bos (__str) == (size_t) -1) \
- ? fgets_unlocked (__str, __n, __fp) \
- : __fgets_unlocked_chk (__str, __bos (__str), __n, __fp))
+extern char *__gets_chk (char *__str, size_t) __wur;
+extern char *__REDIRECT (__gets_alias, (char *__str), gets) __wur;
+
+extern __always_inline __wur char *
+gets (char *__str)
+{
+ if (__bos (__str) != (size_t) -1)
+ return __gets_chk (__str, __bos (__str));
+ return __gets_alias (__str);
+}
+
+extern char *__fgets_chk (char *__restrict __s, size_t __size, int __n,
+ FILE *__restrict __stream) __wur;
+extern char *__REDIRECT (__fgets_alias,
+ (char *__restrict __s, int __n,
+ FILE *__restrict __stream), fgets) __wur;
+
+extern __always_inline __wur char *
+fgets (char *__restrict __s, int __n, FILE *__restrict __stream)
+{
+ if (__bos (__s) != (size_t) -1
+ && (!__builtin_constant_p (__n) || (size_t) __n > __bos (__s)))
+ return __fgets_chk (__s, __bos (__s), __n, __stream);
+ return __fgets_alias (__s, __n, __stream);
+}
+
+#ifdef __USE_GNU
+extern char *__fgets_unlocked_chk (char *__restrict __s, size_t __size,
+ int __n, FILE *__restrict __stream) __wur;
+extern char *__REDIRECT (__fgets_unlocked_alias,
+ (char *__restrict __s, int __n,
+ FILE *__restrict __stream), fgets_unlocked) __wur;
+
+extern __always_inline __wur char *
+fgets_unlocked (char *__restrict __s, int __n, FILE *__restrict __stream)
+{
+ if (__bos (__s) != (size_t) -1
+ && (!__builtin_constant_p (__n) || (size_t) __n > __bos (__s)))
+ return __fgets_unlocked_chk (__s, __bos (__s), __n, __stream);
+ return __fgets_unlocked_alias (__s, __n, __stream);
+}
+#endif
diff --git a/malloc/malloc.c b/malloc/malloc.c
index b91f11bdb1..44831bbb1d 100644
--- a/malloc/malloc.c
+++ b/malloc/malloc.c
@@ -1006,6 +1006,7 @@ struct mallinfo public_mALLINFo(void);
struct mallinfo public_mALLINFo();
#endif
+#ifndef _LIBC
/*
independent_calloc(size_t n_elements, size_t element_size, Void_t* chunks[]);
@@ -1129,6 +1130,8 @@ Void_t** public_iCOMALLOc(size_t, size_t*, Void_t**);
Void_t** public_iCOMALLOc();
#endif
+#endif /* _LIBC */
+
/*
pvalloc(size_t n);
@@ -1507,8 +1510,10 @@ Void_t* _int_memalign(mstate, size_t, size_t);
Void_t* _int_valloc(mstate, size_t);
static Void_t* _int_pvalloc(mstate, size_t);
/*static Void_t* cALLOc(size_t, size_t);*/
+#ifndef _LIBC
static Void_t** _int_icalloc(mstate, size_t, size_t, Void_t**);
static Void_t** _int_icomalloc(mstate, size_t, size_t*, Void_t**);
+#endif
static int mTRIm(size_t);
static size_t mUSABLe(Void_t*);
static void mSTATs(void);
@@ -2305,7 +2310,9 @@ static void malloc_init_state(av) mstate av;
static Void_t* sYSMALLOc(INTERNAL_SIZE_T, mstate);
static int sYSTRIm(size_t, mstate);
static void malloc_consolidate(mstate);
+#ifndef _LIBC
static Void_t** iALLOc(mstate, size_t, size_t*, int, Void_t**);
+#endif
#else
static Void_t* sYSMALLOc();
static int sYSTRIm();
@@ -3729,6 +3736,8 @@ public_cALLOc(size_t n, size_t elem_size)
return mem;
}
+#ifndef _LIBC
+
Void_t**
public_iCALLOc(size_t n, size_t elem_size, Void_t** chunks)
{
@@ -3759,8 +3768,6 @@ public_iCOMALLOc(size_t n, size_t sizes[], Void_t** chunks)
return m;
}
-#ifndef _LIBC
-
void
public_cFREe(Void_t* m)
{
@@ -3774,6 +3781,8 @@ public_mTRIm(size_t s)
{
int result;
+ if(__malloc_initialized < 0)
+ ptmalloc_init ();
(void)mutex_lock(&main_arena.mutex);
result = mTRIm(s);
(void)mutex_unlock(&main_arena.mutex);
@@ -4962,6 +4971,7 @@ Void_t* cALLOc(n_elements, elem_size) size_t n_elements; size_t elem_size;
}
#endif /* 0 */
+#ifndef _LIBC
/*
------------------------- independent_calloc -------------------------
*/
@@ -5125,6 +5135,7 @@ mstate av; size_t n_elements; size_t* sizes; int opts; Void_t* chunks[];
return marray;
}
+#endif /* _LIBC */
/*
diff --git a/math/test-misc.c b/math/test-misc.c
index fa958d486c..d2393cc840 100644
--- a/math/test-misc.c
+++ b/math/test-misc.c
@@ -1,5 +1,5 @@
/* Miscellaneous tests which don't fit anywhere else.
- Copyright (C) 2000, 2001 Free Software Foundation, Inc.
+ Copyright (C) 2000, 2001, 2004, 2005 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -1143,5 +1143,45 @@ main (void)
}
#endif
+ /* The tests here are very similar to tests earlier in this file,
+ the important difference is just that there are no intervening
+ union variables that cause some GCC versions to hide possible
+ bugs in nextafter* implementation. */
+ if (nextafterf (nextafterf (FLT_MIN, FLT_MIN / 2.0), FLT_MIN) != FLT_MIN)
+ {
+ puts ("nextafterf FLT_MIN test failed");
+ result = 1;
+ }
+ if (nextafterf (nextafterf (-FLT_MIN, -FLT_MIN / 2.0), -FLT_MIN)
+ != -FLT_MIN)
+ {
+ puts ("nextafterf -FLT_MIN test failed");
+ result = 1;
+ }
+ if (nextafter (nextafter (DBL_MIN, DBL_MIN / 2.0), DBL_MIN) != DBL_MIN)
+ {
+ puts ("nextafter DBL_MIN test failed");
+ result = 1;
+ }
+ if (nextafter (nextafter (-DBL_MIN, -DBL_MIN / 2.0), -DBL_MIN) != -DBL_MIN)
+ {
+ puts ("nextafter -DBL_MIN test failed");
+ result = 1;
+ }
+#ifndef NO_LONG_DOUBLE
+ if (nextafterl (nextafterl (LDBL_MIN, LDBL_MIN / 2.0), LDBL_MIN)
+ != LDBL_MIN)
+ {
+ puts ("nextafterl LDBL_MIN test failed");
+ result = 1;
+ }
+ if (nextafterl (nextafterl (-LDBL_MIN, -LDBL_MIN / 2.0), -LDBL_MIN)
+ != -LDBL_MIN)
+ {
+ puts ("nextafterl -LDBL_MIN test failed");
+ result = 1;
+ }
+#endif
+
return result;
}
diff --git a/misc/sys/cdefs.h b/misc/sys/cdefs.h
index 6f562e56d0..eb192cca49 100644
--- a/misc/sys/cdefs.h
+++ b/misc/sys/cdefs.h
@@ -271,6 +271,13 @@
# define __wur /* Ignore */
#endif
+/* Forces a function to be always inlined. */
+#if __GNUC_PREREQ (3,2)
+# define __always_inline __inline __attribute__ ((__always_inline__))
+#else
+# define __always_inline __inline
+#endif
+
/* It is possible to compile containing GCC extensions even if GCC is
run in pedantic mode if the uses are carefully marked using the
`__extension__' keyword. But this is not generally available before
diff --git a/posix/bits/unistd.h b/posix/bits/unistd.h
index 6cf95acc0b..219b0560dd 100644
--- a/posix/bits/unistd.h
+++ b/posix/bits/unistd.h
@@ -26,7 +26,7 @@ extern ssize_t __read_chk (int __fd, void *__buf, size_t __nbytes,
extern ssize_t __REDIRECT (__read_alias, (int __fd, void *__buf,
size_t __nbytes), read) __wur;
-extern __inline __wur ssize_t
+extern __always_inline __wur ssize_t
read (int __fd, void *__buf, size_t __nbytes)
{
if (__bos0 (__buf) != (size_t) -1
@@ -46,8 +46,9 @@ extern ssize_t __REDIRECT (__pread_alias,
extern ssize_t __REDIRECT (__pread64_alias,
(int __fd, void *__buf, size_t __nbytes,
__off64_t __offset), pread64) __wur;
+
# ifndef __USE_FILE_OFFSET64
-extern __inline __wur ssize_t
+extern __always_inline __wur ssize_t
pread (int __fd, void *__buf, size_t __nbytes, __off_t __offset)
{
if (__bos0 (__buf) != (size_t) -1
@@ -56,7 +57,7 @@ pread (int __fd, void *__buf, size_t __nbytes, __off_t __offset)
return __pread_alias (__fd, __buf, __nbytes, __offset);
}
# else
-extern __inline __wur ssize_t
+extern __always_inline __wur ssize_t
pread (int __fd, void *__buf, size_t __nbytes, __off_t __offset)
{
if (__bos0 (__buf) != (size_t) -1
@@ -67,7 +68,7 @@ pread (int __fd, void *__buf, size_t __nbytes, __off_t __offset)
# endif
# ifdef __USE_LARGEFILE64