aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/libexpr/eval.hh8
-rw-r--r--src/nix-env/nix-env.cc4
2 files changed, 8 insertions, 4 deletions
diff --git a/src/libexpr/eval.hh b/src/libexpr/eval.hh
index ed648fba8..f7415fb78 100644
--- a/src/libexpr/eval.hh
+++ b/src/libexpr/eval.hh
@@ -39,10 +39,10 @@ public:
typedef uint32_t size_t;
private:
- size_t size_, capacity;
+ size_t size_, capacity_;
Attr attrs[0];
- Bindings(uint32_t capacity) : size_(0), capacity(capacity) { }
+ Bindings(size_t capacity) : size_(0), capacity_(capacity) { }
Bindings(const Bindings & bindings) = delete;
public:
@@ -54,7 +54,7 @@ public:
void push_back(const Attr & attr)
{
- assert(size_ < capacity);
+ assert(size_ < capacity_);
attrs[size_++] = attr;
}
@@ -76,6 +76,8 @@ public:
void sort();
+ size_t capacity() { return capacity_; }
+
friend class EvalState;
};
diff --git a/src/nix-env/nix-env.cc b/src/nix-env/nix-env.cc
index f5e8ee08c..f3c8d3ba8 100644
--- a/src/nix-env/nix-env.cc
+++ b/src/nix-env/nix-env.cc
@@ -132,6 +132,8 @@ static void getAllExprs(EvalState & state,
Value & vArg(*state.allocValue());
state.getBuiltin("import", vFun);
mkString(vArg, path2);
+ if (v.attrs->size() == v.attrs->capacity())
+ throw Error(format("too many Nix expressions in directory ‘%1%’") % path);
mkApp(*state.allocAttr(v, state.symbols.create(attrName)), vFun, vArg);
}
else if (S_ISDIR(st.st_mode))
@@ -160,7 +162,7 @@ static void loadSourceExpr(EvalState & state, const Path & path, Value & v)
~/.nix-defexpr directory that includes some system-wide
directory). */
if (S_ISDIR(st.st_mode)) {
- state.mkAttrs(v, 16);
+ state.mkAttrs(v, 1024);
state.mkList(*state.allocAttr(v, state.symbols.create("_combineChannels")), 0);
StringSet attrs;
getAllExprs(state, path, attrs, v);