aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/libexpr/attr-set.cc3
-rw-r--r--src/libexpr/eval.cc7
2 files changed, 5 insertions, 5 deletions
diff --git a/src/libexpr/attr-set.cc b/src/libexpr/attr-set.cc
index 910428c02..b284daa3c 100644
--- a/src/libexpr/attr-set.cc
+++ b/src/libexpr/attr-set.cc
@@ -7,13 +7,14 @@
namespace nix {
+/* Note: Various places expect the allocated memory to be zeroed. */
static void * allocBytes(size_t n)
{
void * p;
#if HAVE_BOEHMGC
p = GC_malloc(n);
#else
- p = malloc(n);
+ p = calloc(n, 1);
#endif
if (!p) throw std::bad_alloc();
return p;
diff --git a/src/libexpr/eval.cc b/src/libexpr/eval.cc
index b94bc597b..48542d8e5 100644
--- a/src/libexpr/eval.cc
+++ b/src/libexpr/eval.cc
@@ -43,13 +43,14 @@ static char * dupString(const char * s)
}
+/* Note: Various places expect the allocated memory to be zeroed. */
static void * allocBytes(size_t n)
{
void * p;
#if HAVE_BOEHMGC
p = GC_malloc(n);
#else
- p = malloc(n);
+ p = calloc(n, 1);
#endif
if (!p) throw std::bad_alloc();
return p;
@@ -582,9 +583,7 @@ Env & EvalState::allocEnv(unsigned int size)
Env * env = (Env *) allocBytes(sizeof(Env) + size * sizeof(Value *));
env->size = size;
- /* Clear the values because maybeThunk() and lookupVar fromWith expect this. */
- for (unsigned i = 0; i < size; ++i)
- env->values[i] = 0;
+ /* We assume that env->values has been cleared by the allocator; maybeThunk() and lookupVar fromWith expect this. */
return *env;
}