summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--debug/tst-backtrace5.c19
-rw-r--r--nptl/tst-cancel4.c8
3 files changed, 24 insertions, 9 deletions
diff --git a/ChangeLog b/ChangeLog
index b190eb8eac..b695780b0d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
2019-01-03 Adhemerval Zanella <adhemerval.zanella@linaro.org>
+ * debug/tst-backtrace5.c (handle_signal): Avoid cancellable wrappers
+ in backtrace analysis.
+ * nptl/tst-cancel4.c (tf_write): Handle cancelled syscall with
+ side-effects.
+ (tf_send): Likewise.
+
* io/creat.c (LIBC_CANCEL_HANDLED): Remove macro.
* io/ppoll.c (LIBC_CANCEL_HANDLED): Likewise.
* misc/pselect.c (LIBC_CANCEL_HANDLED): Likewise.
diff --git a/debug/tst-backtrace5.c b/debug/tst-backtrace5.c
index dfbe4c1912..5a5ce8bc79 100644
--- a/debug/tst-backtrace5.c
+++ b/debug/tst-backtrace5.c
@@ -69,17 +69,18 @@ handle_signal (int signum)
FAIL ();
return;
}
- /* Do not check name for signal trampoline. */
- i = 2;
- if (!match (symbols[i++], "read"))
+
+ /* Do not check name for signal trampoline or cancellable syscall
+ wrappers (__syscall_cancel*). */
+ for (; i < n - 1; i++)
+ if (match (symbols[i], "read"))
+ break;
+ if (i == n - 1)
{
- /* Perhaps symbols[2] is __kernel_vsyscall? */
- if (!match (symbols[i++], "read"))
- {
- FAIL ();
- return;
- }
+ FAIL ();
+ return;
}
+
for (; i < n - 1; i++)
if (!match (symbols[i], "fn"))
{
diff --git a/nptl/tst-cancel4.c b/nptl/tst-cancel4.c
index a0fc30fab9..60a965d23a 100644
--- a/nptl/tst-cancel4.c
+++ b/nptl/tst-cancel4.c
@@ -166,6 +166,10 @@ tf_write (void *arg)
char buf[WRITE_BUFFER_SIZE];
memset (buf, '\0', sizeof (buf));
s = write (fd, buf, sizeof (buf));
+ /* The write can return a value higher than 0 (meaning partial write)
+ due to the SIGCANCEL, but the thread may still be pending
+ cancellation. */
+ pthread_testcancel ();
pthread_cleanup_pop (0);
@@ -743,6 +747,10 @@ tf_send (void *arg)
char mem[WRITE_BUFFER_SIZE];
send (tempfd2, mem, arg == NULL ? sizeof (mem) : 1, 0);
+ /* The send can return a value higher than 0 (meaning partial send)
+ due to the SIGCANCEL, but the thread may still be pending
+ cancellation. */
+ pthread_testcancel ();
pthread_cleanup_pop (0);