Zero-initialize heartbeat test write buffer
authorMike Bland <mbland@acm.org>
Thu, 1 May 2014 14:10:14 +0000 (10:10 -0400)
committerBen Laurie <ben@links.org>
Mon, 19 May 2014 16:39:41 +0000 (17:39 +0100)
The previous calls to memset() were added to tear_down() when I noticed the
test spuriously failing in opt mode, with different results each time. This
appeared to be because the allocator zeros out memory in debug mode, but not
in opt mode. Since the heartbeat functions silently drop the request on error
without modifying the contents of the write buffer, whatever random contents
were in memory before being reallocated to the write buffer used in the test
would cause nondeterministic test failures in the Heartbleed regression cases.
Adding these calls allowed the test to pass in both debug and opt modes.

Ben Laurie notified me offline that the test was aborting in
debug-ben-debug-64-clang mode, configured with GitConfigure and built with
GitMake. Looking into this, I realized the first memset() call was zeroing out
a reference count used by SSL_free() that was checked in
debug-ben-debug-64-clang mode but not in the normal debug mode.

Removing the memset() calls from tear_down() and adding a memset() for the
write buffer in set_up() addresses the issue and allows the test to
successfully execute in debug, opt, and debug-ben-debug-64-clang modes.

ssl/heartbeat_test.c

index 23ae053..f86ec5f 100644 (file)
@@ -105,6 +105,12 @@ static HEARTBEAT_TEST_FIXTURE set_up(const char* const test_case_name,
                goto fail;
                }
 
+       /* Clear the memory for the return buffer, since this isn't automatically
+        * zeroed in opt mode and will cause spurious test failures that will change
+        * with each execution.
+        */
+       memset(fixture.s->s3->wbuf.buf, 0, fixture.s->s3->wbuf.len);
+
        fail:
        if (!setup_ok)
                {
@@ -160,9 +166,7 @@ static HEARTBEAT_TEST_FIXTURE set_up_tls(const char* const test_case_name)
 static void tear_down(HEARTBEAT_TEST_FIXTURE fixture)
        {
        ERR_print_errors_fp(stderr);
-       memset(fixture.s, 0, sizeof(*fixture.s));
        SSL_free(fixture.s);
-       memset(fixture.ctx, 0, sizeof(*fixture.ctx));
        SSL_CTX_free(fixture.ctx);
        }