From 10f105d2bfe55fff1f735af7d4a0ee545bb21120 Mon Sep 17 00:00:00 2001 From: =?utf8?q?R=C3=A9mi=20Denis-Courmont?= Date: Sun, 14 Feb 2010 17:04:38 +0200 Subject: [PATCH] vlc_object_waitpipe: cancellation safety --- src/misc/objects.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/misc/objects.c b/src/misc/objects.c index f8b6044587..5d445a70d7 100644 --- a/src/misc/objects.c +++ b/src/misc/objects.c @@ -356,6 +356,9 @@ int vlc_object_waitpipe( vlc_object_t *obj ) /* This can only ever happen if someone killed us without locking: */ assert (internals->pipes[1] == -1); + /* pipe() is not a cancellation point, but write() is and eventfd() is + * unspecified (not in POSIX). */ + int canc = vlc_savecancel (); #if defined (HAVE_SYS_EVENTFD_H) internals->pipes[0] = internals->pipes[1] = eventfd (0, EFD_CLOEXEC); if (internals->pipes[0] == -1) @@ -370,6 +373,7 @@ int vlc_object_waitpipe( vlc_object_t *obj ) msg_Dbg (obj, "waitpipe: object already dying"); write (internals->pipes[1], &(uint64_t){ 1 }, sizeof (uint64_t)); } + vlc_restorecancel (canc); } vlc_mutex_unlock (&pipe_lock); return internals->pipes[0]; -- 2.39.2