|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
From fc808616227115ccab8c04f00f8f7472c7353ae5 Mon Sep 17 00:00:00 2001
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
From: David Herrmann <dh.herrmann@gmail.com>
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
Date: Thu, 2 Oct 2014 08:31:28 +0200
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
Subject: [PATCH] barrier: fix up constructor error handling
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
We cannot rely on "errno" to be non-zero on failure, if we perform
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
multiple glibc calls. That is, if the first eventfd() call fails, but the
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
second succeeds, we cleanup the barrier but return 0.
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
Fix this by always testing the return value immediately. This should also
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
fix all the coverity warnings.
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
---
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
src/shared/barrier.c | 19 ++++++++++++++-----
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
src/shared/barrier.h | 2 ++
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
2 files changed, 16 insertions(+), 5 deletions(-)
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
diff --git a/src/shared/barrier.c b/src/shared/barrier.c
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
index 4a5544de27..f65363a67b 100644
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
--- a/src/shared/barrier.c
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+++ b/src/shared/barrier.c
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
@@ -112,15 +112,24 @@
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
* Returns: 0 on success, negative error code on failure.
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
*/
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
int barrier_create(Barrier *b) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ _cleanup_(barrier_destroyp) Barrier *staging = b;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ int r;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
assert(b);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- if ((b->me = eventfd(0, EFD_CLOEXEC | EFD_NONBLOCK)) < 0 ||
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- (b->them = eventfd(0, EFD_CLOEXEC | EFD_NONBLOCK)) < 0 ||
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- pipe2(b->pipe, O_CLOEXEC | O_NONBLOCK) < 0) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- barrier_destroy(b);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ b->me = eventfd(0, EFD_CLOEXEC | EFD_NONBLOCK);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ if (b->me < 0)
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ return -errno;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ b->them = eventfd(0, EFD_CLOEXEC | EFD_NONBLOCK);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ if (b->them < 0)
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ return -errno;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ r = pipe2(b->pipe, O_CLOEXEC | O_NONBLOCK);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ if (r < 0)
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
return -errno;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- }
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ staging = NULL;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
return 0;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
}
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
diff --git a/src/shared/barrier.h b/src/shared/barrier.h
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
index 53b4439fb2..c55e311344 100644
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
--- a/src/shared/barrier.h
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+++ b/src/shared/barrier.h
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
@@ -62,6 +62,8 @@ struct Barrier {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
int barrier_create(Barrier *obj);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
void barrier_destroy(Barrier *b);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+DEFINE_TRIVIAL_CLEANUP_FUNC(Barrier*, barrier_destroy);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
void barrier_set_role(Barrier *b, unsigned int role);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
bool barrier_place(Barrier *b);
|