This is the mail archive of the
cygwin-patches
mailing list for the Cygwin project.
[PATCH] Fix 32-bit SSIZE_MAX
- From: Eric Blake <eblake at redhat dot com>
- To: cygwin-patches at cygwin dot com
- Date: Wed, 13 Jul 2016 15:02:28 -0600
- Subject: [PATCH] Fix 32-bit SSIZE_MAX
- Authentication-results: sourceware.org; auth=none
POSIX requires that SSIZE_MAX have the same type as ssize_t, but
on 32-bit, we were defining it as a long even though ssize_t
resolves to an int. It also requires that SSIZE_MAX be usable
via preprocessor #if, so we can't cheat and use a cast.
If this were newlib, I'd have had to hack _intsup.h to probe the
qualities of size_t (via gcc's __SIZE_TYPE__), similar to how we
already probe the qualities of int8_t and friends, then cross our
fingers that ssize_t happens to have the same rank (most systems
do, but POSIX permits a system where they differ such as size_t
being long while ssize_t is int). Unfortunately gcc gives us
neither __SSIZE_TYPE__ nor __SSIZE_MAX__. On the other hand, our
limits.h is specific to cygwin, we can just shortcut to the
correct results rather than being generic to all possible ABI.
Signed-off-by: Eric Blake <eblake@redhat.com>
---
winsup/cygwin/include/limits.h | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/winsup/cygwin/include/limits.h b/winsup/cygwin/include/limits.h
index 2083e3e..cf3c8d0 100644
--- a/winsup/cygwin/include/limits.h
+++ b/winsup/cygwin/include/limits.h
@@ -128,9 +128,17 @@ details. */
#undef ULLONG_MAX
#define ULLONG_MAX (LLONG_MAX * 2ULL + 1)
-/* Maximum size of ssize_t */
+/* Maximum size of ssize_t. Sadly, gcc doesn't give us __SSIZE_MAX__
+ the way it does for __SIZE_MAX__. On the other hand, we happen to
+ know that for Cygwin, ssize_t is 'int' on 32-bit and 'long' on
+ 64-bit, and this particular header is specific to Cygwin, so we
+ don't have to jump through hoops. */
#undef SSIZE_MAX
+#if __WORDSIZE == 64
#define SSIZE_MAX (__LONG_MAX__)
+#else
+#define SSIZE_MAX (__INT_MAX__)
+#endif
/* Runtime Invariant Values */
--
2.5.5