Closes #1064
The culprit here is that `genGraphString` is only invoked with the
store-paths associated with the outputs of the derivation, so when
filling `dependents`, the `graph_data.find(p)` call would return the end
of the iterator when doing this for references to other store-paths.
As a result, the code wrote information behind the graph data-structure
causing a corruption. For me, this resulted in a SIGSEGV most of the
time and in a few cases in an uncaught `map::at`-exception as reported
by Niklas.
This patch changes two aspects of the original implementation:
* When filling `dependents` in the node-set, use `map.at()` instead of
`map.find()->second`. The latter doesn't make any sense and was the
cause of corrupting memory. The `at` would've made it far easier to
spot this in the first place.
* Filter out store-paths that don't belong to a different output of the
derivation when creating `outputGraph`. This variable is used on two
places, `genGraphString` and for topological sorting.
The latter already filters out store-paths from a different drv, so
this is happening now when creating the variable in the first place
such that `genGraphString` never ends up with corrupt data in the
first place. This is the actual bugfix.
Implemented a regression-test for this case to be sure.
Change-Id: Ie02144d89c32b0a776cb1ece0601d0229315ebc3
(cherry picked from commit 0a5f474a25)
38 lines
826 B
Nix
38 lines
826 B
Nix
with import ./config.nix;
|
|
|
|
rec {
|
|
dep = import ./dependencies.nix {};
|
|
|
|
cycle = mkDerivation {
|
|
name = "cycle";
|
|
inherit dep;
|
|
outputs = [ "foo" "bar" "baz" ];
|
|
builder = builtins.toFile "builder.sh" ''
|
|
mkdir -p $foo/bin $bar/lib $baz/share
|
|
echo $bar > $foo/bin/alarm
|
|
echo $baz > $bar/lib/libfoo
|
|
echo $foo > $baz/share/lalala
|
|
'';
|
|
};
|
|
|
|
cycle-with-deps = mkDerivation {
|
|
name = "cycle-with-deps";
|
|
inherit dep;
|
|
outputs = [ "foo" "bar" ];
|
|
builder = builtins.toFile "builder.sh" ''
|
|
mkdir -p $foo/bin $bar/lib
|
|
ln -sf $dep $bar/lib
|
|
echo $foo > $bar/txt
|
|
echo $bar > $foo/txt
|
|
'';
|
|
};
|
|
|
|
as_dependency = mkDerivation {
|
|
name = "depends-on-cycle";
|
|
inherit cycle;
|
|
builder = builtins.toFile "builder.sh" ''
|
|
touch $out
|
|
'';
|
|
};
|
|
}
|