Commit 2ab26c62 authored by David Gibson's avatar David Gibson

aga: Fix initialization bug in aga_for_each_edge_info

The aga_for_each_edge_info macro is constructed so that if the edge_info
callback returns an error, the for loop terminates early and leaves the
_err parameter set to the error.  On successful completion of the loop,
_err should be zero.

However, on a node with no edges, _err will not be initialized, meaning
that it could be non-zero even on successful (trivial) completion of the
loop.  This fixes the bug.
Signed-off-by: default avatarDavid Gibson <david@gibson.dropbear.id.au>
parent bd0400d6
...@@ -239,7 +239,7 @@ int aga_edge_info(const struct aga_graph *g, const struct aga_node *n, ...@@ -239,7 +239,7 @@ int aga_edge_info(const struct aga_graph *g, const struct aga_node *n,
(_e) = aga_next_edge((_g), (_n), (_e))) (_e) = aga_next_edge((_g), (_n), (_e)))
#define aga_for_each_edge_info(_e, _ei, _err, _g, _n) \ #define aga_for_each_edge_info(_e, _ei, _err, _g, _n) \
for ((_e) = aga_first_edge((_g), (_n)); \ for ((_err) = 0, (_e) = aga_first_edge((_g), (_n)); \
(_e) && ((((_err) = aga_edge_info((_g), (_n), (_e), &(_ei)))) == 0); \ (_e) && ((((_err) = aga_edge_info((_g), (_n), (_e), &(_ei)))) == 0); \
(_e) = aga_next_edge((_g), (_n), (_e))) \ (_e) = aga_next_edge((_g), (_n), (_e))) \
if ((_ei).to) if ((_ei).to)
......
...@@ -20,7 +20,7 @@ static void test_adjacency(const char *name, ...@@ -20,7 +20,7 @@ static void test_adjacency(const char *name,
struct aga_edge_info ei; struct aga_edge_info ei;
int j = 0; int j = 0;
const struct aga_node *from; const struct aga_node *from;
int err; int err = 0xdeadbeef;
assert(i < MAX_NODES); assert(i < MAX_NODES);
...@@ -42,6 +42,8 @@ static void test_adjacency(const char *name, ...@@ -42,6 +42,8 @@ static void test_adjacency(const char *name,
ok(err == at[i].to[j], "%s: %p #%d -> ERROR %d", ok(err == at[i].to[j], "%s: %p #%d -> ERROR %d",
name, e, at[i].from, at[i].to[j]); name, e, at[i].from, at[i].to[j]);
continue; /* Move onto next node on errors */ continue; /* Move onto next node on errors */
} else {
ok1(err == 0);
} }
assert(j < MAX_EDGES); assert(j < MAX_EDGES);
ok(at[i].to[j] == 0, ok(at[i].to[j] == 0,
...@@ -60,7 +62,7 @@ int main(void) ...@@ -60,7 +62,7 @@ int main(void)
struct error_graph eg; struct error_graph eg;
struct traversal1_graph t1g; struct traversal1_graph t1g;
plan_tests(1 + 5 + 30 + 22 + 21 + 33 + 6 + 21); plan_tests(2 + 7 + 35 + 30 + 30 + 42 + 9 + 30);
trivial_graph_init(&tg); trivial_graph_init(&tg);
test_adjacency("trivial", &tg.sg, trivial_adjacency); test_adjacency("trivial", &tg.sg, trivial_adjacency);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment