[compiler-rt] r313294 - [scudo] Fix bad request handling when allocator has not been initialized
Diana Picus via llvm-commits
llvm-commits at lists.llvm.org
Wed Sep 27 10:54:22 PDT 2017
Hi Kostya,
The valloc test doesn't seem to work nicely on ARM:
http://lab.llvm.org:8011/builders/clang-cmake-thumbv7-a15-full-sh/builds/2398
http://lab.llvm.org:8011/builders/clang-cmake-armv7-a15-full/builds/10933
Any idea what the problem might be?
Thanks,
Diana
PS: Sorry I didn't notice earlier, I was on vacation.
On 14 September 2017 at 13:34, Kostya Kortchinsky via llvm-commits
<llvm-commits at lists.llvm.org> wrote:
> Author: cryptoad
> Date: Thu Sep 14 13:34:32 2017
> New Revision: 313294
>
> URL: http://llvm.org/viewvc/llvm-project?rev=313294&view=rev
> Log:
> [scudo] Fix bad request handling when allocator has not been initialized
>
> Summary:
> In a few functions (`scudoMemalign` and the like), we would call
> `ScudoAllocator::FailureHandler::OnBadRequest` if the parameters didn't check
> out. The issue is that if the allocator had not been initialized (eg: if this
> is the first heap related function called), we would use variables like
> `allocator_may_return_null` and `exitcode` that still had their default value
> (as opposed to the one set by the user or the initialization path).
>
> To solve this, we introduce `handleBadRequest` that will call `initThreadMaybe`,
> allowing the options to be correctly initialized.
>
> Unfortunately, the tests were passing because `exitcode` was still 0, so the
> results looked like success. Change those tests to do what they were supposed
> to.
>
> Reviewers: alekseyshl
>
> Reviewed By: alekseyshl
>
> Subscribers: llvm-commits
>
> Differential Revision: https://reviews.llvm.org/D37853
>
> Modified:
> compiler-rt/trunk/lib/scudo/scudo_allocator.cpp
> compiler-rt/trunk/test/scudo/memalign.cpp
> compiler-rt/trunk/test/scudo/valloc.cpp
>
> Modified: compiler-rt/trunk/lib/scudo/scudo_allocator.cpp
> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/scudo/scudo_allocator.cpp?rev=313294&r1=313293&r2=313294&view=diff
> ==============================================================================
> --- compiler-rt/trunk/lib/scudo/scudo_allocator.cpp (original)
> +++ compiler-rt/trunk/lib/scudo/scudo_allocator.cpp Thu Sep 14 13:34:32 2017
> @@ -620,6 +620,11 @@ struct ScudoAllocator {
> BackendAllocator.getStats(stats);
> return stats[StatType];
> }
> +
> + void *handleBadRequest() {
> + initThreadMaybe();
> + return FailureHandler::OnBadRequest();
> + }
> };
>
> static ScudoAllocator Instance(LINKER_INITIALIZED);
> @@ -677,7 +682,7 @@ void *scudoPvalloc(uptr Size) {
> uptr PageSize = GetPageSizeCached();
> if (UNLIKELY(CheckForPvallocOverflow(Size, PageSize))) {
> errno = errno_ENOMEM;
> - return ScudoAllocator::FailureHandler::OnBadRequest();
> + return Instance.handleBadRequest();
> }
> // pvalloc(0) should allocate one page.
> Size = Size ? RoundUpTo(Size, PageSize) : PageSize;
> @@ -687,14 +692,14 @@ void *scudoPvalloc(uptr Size) {
> void *scudoMemalign(uptr Alignment, uptr Size) {
> if (UNLIKELY(!IsPowerOfTwo(Alignment))) {
> errno = errno_EINVAL;
> - return ScudoAllocator::FailureHandler::OnBadRequest();
> + return Instance.handleBadRequest();
> }
> return SetErrnoOnNull(Instance.allocate(Size, Alignment, FromMemalign));
> }
>
> int scudoPosixMemalign(void **MemPtr, uptr Alignment, uptr Size) {
> if (UNLIKELY(!CheckPosixMemalignAlignment(Alignment))) {
> - ScudoAllocator::FailureHandler::OnBadRequest();
> + Instance.handleBadRequest();
> return errno_EINVAL;
> }
> void *Ptr = Instance.allocate(Size, Alignment, FromMemalign);
> @@ -707,7 +712,7 @@ int scudoPosixMemalign(void **MemPtr, up
> void *scudoAlignedAlloc(uptr Alignment, uptr Size) {
> if (UNLIKELY(!CheckAlignedAllocAlignmentAndSize(Alignment, Size))) {
> errno = errno_EINVAL;
> - return ScudoAllocator::FailureHandler::OnBadRequest();
> + return Instance.handleBadRequest();
> }
> return SetErrnoOnNull(Instance.allocate(Size, Alignment, FromMalloc));
> }
>
> Modified: compiler-rt/trunk/test/scudo/memalign.cpp
> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/scudo/memalign.cpp?rev=313294&r1=313293&r2=313294&view=diff
> ==============================================================================
> --- compiler-rt/trunk/test/scudo/memalign.cpp (original)
> +++ compiler-rt/trunk/test/scudo/memalign.cpp Thu Sep 14 13:34:32 2017
> @@ -1,6 +1,7 @@
> // RUN: %clang_scudo %s -o %t
> -// RUN: %run %t valid 2>&1
> -// RUN: %run %t invalid 2>&1
> +// RUN: %run %t valid 2>&1
> +// RUN: not %run %t invalid 2>&1
> +// RUN: SCUDO_OPTIONS=allocator_may_return_null=1 %run %t invalid 2>&1
>
> // Tests that the various aligned allocation functions work as intended. Also
> // tests for the condition where the alignment is not a power of 2.
>
> Modified: compiler-rt/trunk/test/scudo/valloc.cpp
> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/scudo/valloc.cpp?rev=313294&r1=313293&r2=313294&view=diff
> ==============================================================================
> --- compiler-rt/trunk/test/scudo/valloc.cpp (original)
> +++ compiler-rt/trunk/test/scudo/valloc.cpp Thu Sep 14 13:34:32 2017
> @@ -1,6 +1,7 @@
> // RUN: %clang_scudo %s -o %t
> -// RUN: %run %t valid 2>&1
> -// RUN: %run %t invalid 2>&1
> +// RUN: %run %t valid 2>&1
> +// RUN: not %run %t invalid 2>&1
> +// RUN: SCUDO_OPTIONS=allocator_may_return_null=1 %run %t invalid 2>&1
>
> // Tests that valloc and pvalloc work as intended.
>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list