RAND_add(): fix heap corruption in error path
authorDr. Matthias St. Pierre <Matthias.St.Pierre@ncp-e.com>
Sat, 20 Oct 2018 14:53:09 +0000 (16:53 +0200)
committerDr. Matthias St. Pierre <Matthias.St.Pierre@ncp-e.com>
Mon, 22 Oct 2018 12:54:55 +0000 (14:54 +0200)
commit5b4cb385c18a5bb4e118e300f1c746bf7c2a5628
tree825a25f217a939e86d424cae221dd60987099f20
parentd8cac50b023be249cdaba054f43acecf17025ce4
RAND_add(): fix heap corruption in error path

This bug was introduced by #7382 which enhanced RAND_add() to
accept large buffer sizes. As a consequence, RAND_add() now fails
for buffer sizes less than 32 bytes (i.e. less than 256 bits).
In addition, rand_drbg_get_entropy() forgets to reset the attached
drbg->pool in the case of an error, which leads to the heap corruption.

The problem occurred with RAND_load_file(), which reads the file in
chunks of 1024 bytes each. If the size of the final chunk is less than
32 bytes, then RAND_add() fails, whence RAND_load_file() fails
silently for buffer sizes n = k * 1024 + r with r = 1,...,31.

This commit fixes the heap corruption only. The other issues will
be addressed in a separate pull request.

Thanks to Gisle Vanem for reporting this issue.

Fixes #7449

Reviewed-by: Paul Dale <paul.dale@oracle.com>
(Merged from https://github.com/openssl/openssl/pull/7455)
crypto/rand/rand_lib.c