---
 sysdeps/htl/pt-rwlock-timedrdlock.c | 9 ++++++++-
 sysdeps/htl/pt-rwlock-tryrdlock.c   | 9 ++++++++-
 2 files changed, 16 insertions(+), 2 deletions(-)

diff --git a/sysdeps/htl/pt-rwlock-timedrdlock.c 
b/sysdeps/htl/pt-rwlock-timedrdlock.c
index 25b761433a..ecde14c56a 100644
--- a/sysdeps/htl/pt-rwlock-timedrdlock.c
+++ b/sysdeps/htl/pt-rwlock-timedrdlock.c
@@ -51,7 +51,14 @@ __pthread_rwlock_timedrdlock_internal (struct 
__pthread_rwlock *rwlock,
     /* Just add ourself to number of readers.  */
     {
       assert (rwlock->__readerqueue == 0);
-      rwlock->__readers++;
+      unsigned int new__readers = rwlock->__readers + 1;
+      if (new__readers < rwlock->__readers)
+       {
+         /* We would wrap around */
+         __pthread_spin_unlock (&rwlock->__lock);
+         return EAGAIN;
+       }
+      rwlock->__readers = new__readers;
       __pthread_spin_unlock (&rwlock->__lock);
       return 0;
     }
diff --git a/sysdeps/htl/pt-rwlock-tryrdlock.c 
b/sysdeps/htl/pt-rwlock-tryrdlock.c
index 6a626c6954..41a3704d61 100644
--- a/sysdeps/htl/pt-rwlock-tryrdlock.c
+++ b/sysdeps/htl/pt-rwlock-tryrdlock.c
@@ -42,7 +42,14 @@ __pthread_rwlock_tryrdlock (struct __pthread_rwlock *rwlock)
   if (rwlock->__readers > 0)
     {
       assert (rwlock->__readerqueue == 0);
-      rwlock->__readers++;
+      unsigned int new__readers = rwlock->__readers + 1;
+      if (new__readers < rwlock->__readers)
+       {
+         /* We would wrap around */
+         __pthread_spin_unlock (&rwlock->__lock);
+         return EAGAIN;
+       }
+      rwlock->__readers = new__readers;
       __pthread_spin_unlock (&rwlock->__lock);
       return 0;
     }
-- 
2.53.0


Reply via email to