aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2020-06-26 08:16:51 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2020-06-26 08:16:51 +0200
commit7fbc419525c76512b3fdc72987f636bec90554de (patch)
tree8690fcf83bc724fb39d15b1c9a957ecd7c1d12fd
parentef6bed5476d7b20aafd4a8a96945a5e603cc360e (diff)
Fix race in library metadata protocol
Specifically, we need to check whether the prerequisite_member is ad hoc before checking whether it is NULL because ad hoc ones are blanked out (set to NULL) during execute.
-rw-r--r--libbuild2/bash/rule.cxx2
-rw-r--r--libbuild2/cc/common.cxx5
-rw-r--r--libbuild2/cc/windows-rpath.cxx4
3 files changed, 6 insertions, 5 deletions
diff --git a/libbuild2/bash/rule.cxx b/libbuild2/bash/rule.cxx
index dd8940a..801f02c 100644
--- a/libbuild2/bash/rule.cxx
+++ b/libbuild2/bash/rule.cxx
@@ -237,7 +237,7 @@ namespace build2
const path* ap (nullptr);
for (const prerequisite_target& pt: t.prerequisite_targets[a])
{
- if (pt.target == nullptr || pt.adhoc)
+ if (pt.adhoc || pt.target == nullptr)
continue;
if (const bash* b = pt.target->is_a<bash> ())
diff --git a/libbuild2/cc/common.cxx b/libbuild2/cc/common.cxx
index 8150cfa..ce80e3f 100644
--- a/libbuild2/cc/common.cxx
+++ b/libbuild2/cc/common.cxx
@@ -240,9 +240,10 @@ namespace build2
for (const prerequisite_target& pt: l.prerequisite_targets[a])
{
// Note: adhoc prerequisites are not part of the library meta-
- // information protocol.
+ // information protocol (and we should check for adhoc first to
+ // avoid races).
//
- if (pt == nullptr || pt.adhoc)
+ if (pt.adhoc || pt == nullptr)
continue;
bool la;
diff --git a/libbuild2/cc/windows-rpath.cxx b/libbuild2/cc/windows-rpath.cxx
index f1d4749..eddb9c4 100644
--- a/libbuild2/cc/windows-rpath.cxx
+++ b/libbuild2/cc/windows-rpath.cxx
@@ -109,7 +109,7 @@ namespace build2
for (const prerequisite_target& pt: t.prerequisite_targets[a])
{
- if (pt == nullptr || pt.adhoc)
+ if (pt.adhoc || pt == nullptr)
continue;
bool la;
@@ -204,7 +204,7 @@ namespace build2
for (const prerequisite_target& pt: t.prerequisite_targets[a])
{
- if (pt == nullptr || pt.adhoc)
+ if (pt.adhoc || pt == nullptr)
continue;
bool la;