Skip to content

Commit

Permalink
src: Malloc/Calloc size 0 returns non-null pointer
Browse files Browse the repository at this point in the history
Change `Malloc()/Calloc()` so that size zero does not return a null
pointer, consistent with prior behavior.

Fixes: #8571
PR-URL: #8572
Reviewed-By: Anna Henningsen <[email protected]>
Reviewed-By: James M Snell <[email protected]>
Reviewed-By: Yorkie Liu <[email protected]>
Reviewed-By: Michael Dawson <[email protected]>
  • Loading branch information
Trott authored and Myles Borins committed Nov 22, 2016
1 parent 51e09d0 commit 62e83b3
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 1 deletion.
4 changes: 3 additions & 1 deletion src/util-inl.h
Original file line number Diff line number Diff line change
Expand Up @@ -234,11 +234,13 @@ void* Realloc(void* pointer, size_t size) {

// As per spec realloc behaves like malloc if passed nullptr.
void* Malloc(size_t size) {
if (size == 0) size = 1;
return Realloc(nullptr, size);
}

void* Calloc(size_t n, size_t size) {
if ((n == 0) || (size == 0)) return nullptr;
if (n == 0) n = 1;
if (size == 0) size = 1;
CHECK_GE(n * size, n); // Overflow guard.
return calloc(n, size);
}
Expand Down
14 changes: 14 additions & 0 deletions test/cctest/util.cc
Original file line number Diff line number Diff line change
Expand Up @@ -74,3 +74,17 @@ TEST(UtilTest, ToLower) {
EXPECT_EQ('a', ToLower('a'));
EXPECT_EQ('a', ToLower('A'));
}

TEST(UtilTest, Malloc) {
using node::Malloc;
EXPECT_NE(nullptr, Malloc(0));
EXPECT_NE(nullptr, Malloc(1));
}

TEST(UtilTest, Calloc) {
using node::Calloc;
EXPECT_NE(nullptr, Calloc(0, 0));
EXPECT_NE(nullptr, Calloc(1, 0));
EXPECT_NE(nullptr, Calloc(0, 1));
EXPECT_NE(nullptr, Calloc(1, 1));
}
8 changes: 8 additions & 0 deletions test/parallel/test-crypto-pbkdf2.js
Original file line number Diff line number Diff line change
Expand Up @@ -79,3 +79,11 @@ assert.throws(function() {
assert.throws(function() {
crypto.pbkdf2('password', 'salt', 1, -1, common.fail);
}, /Bad key length/);

// Should not get FATAL ERROR with empty password and salt
// https://github.com/nodejs/node/issues/8571
assert.doesNotThrow(() => {
crypto.pbkdf2('', '', 1, 32, 'sha256', common.mustCall((e) => {
assert.ifError(e);
}));
});

0 comments on commit 62e83b3

Please sign in to comment.