Skip to content

heap-use-after-free on std::thread #12985

@emaxx-google

Description

@emaxx-google

The following program:

#include <thread>
int main() {
  std::thread([]{}).join();
}

compiled with -fsanitize=address (Emscripten 2.0.6):

emcc main-thread.cc -pthread -fsanitize=address -s INITIAL_MEMORY=134217728 -s PROXY_TO_PTHREAD=1 -s EXIT_RUNTIME=1

results in the following errors:

Pthread 0x3d03d80 exited.
Proxied main thread 0x3d03ec0 finished with return code 0. EXIT_RUNTIME=1 set, quitting process.
Pthread 0x3d03ec0 exited.
=================================================================
==42==ERROR: AddressSanitizer: heap-use-after-free on address 0x03d03d8c at pc 0x00033f16 bp 0x0196a6b0 sp 0x0196a6bc
WRITE of size 4 at 0x03d03d8c thread T0
    #0 0x33f16 in wasm-function[1157]+0x33f16 (a.out.wasm+0x33f16)

0x03d03d8c is located 12 bytes inside of 232-byte region [0x03d03d80,0x03d03e68)
freed by thread T0 here:
    #0 0x234e4 in wasm-function[759]+0x234e4 (a.out.wasm+0x234e4)
    #1 0x80000521  (JavaScript+0x521)
    #2 0x800007bc in Object.freeThreadData a.out.js:1980:4
    #3 0x800007c7 in Object.returnWorkerToPool a.out.js:1991:11
    #4 0x800007f4 in Worker.worker.onmessage a.out.js:2036:14
    #5 0x8000080e in Worker.<anonymous> a.out.js:2062:12
    #6 0x8000013b in Worker.emit events.js:315:20
    #7 0x800000c0 in MessagePort.<anonymous> internal/worker.js:192:55

previously allocated by thread T0 here:
    #0 0x2367d in wasm-function[760]+0x2367d (a.out.wasm+0x2367d)
    #1 0x80000521  (JavaScript+0x521)
    #2 0x80001403 in _emscripten_builtin_pthread_create a.out.js:5123:25
    #3 0x108bf in wasm-function[483]+0x108bf (a.out.wasm+0x108bf)
    #4 0x10217 in wasm-function[482]+0x10217 (a.out.wasm+0x10217)
    #5 0x15029 in wasm-function[500]+0x15029 (a.out.wasm+0x15029)
    #6 0x80000521  (JavaScript+0x521)
    #7 0x800007db in Worker.worker.onmessage a.out.js:2011:5

SUMMARY: AddressSanitizer: heap-use-after-free (a.out.wasm+0x33f15) in wasm-function[1157]+0x33f15
Shadow bytes around the buggy address:
  0x007a0760: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x007a0770: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x007a0780: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x007a0790: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x007a07a0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
=>0x007a07b0: fd[fd]fd fd fd fd fd fd fd fd fd fd fd fd fd fd
  0x007a07c0: fd fd fd fd fd fd fd fd fd fd fd fd fd fa fa fa
  0x007a07d0: fa fa fa fa fa fa fa fa 00 00 00 00 00 00 00 00
  0x007a07e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x007a07f0: 00 00 00 00 00 fa fa fa fa fa fa fa fa fa fa fa
  0x007a0800: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
Shadow byte legend (one shadow byte represents 8 application bytes):
  Addressable:           00
  Partially addressable: 01 02 03 04 05 06 07
  Heap left redzone:       fa
  Freed heap region:       fd
  Stack left redzone:      f1
  Stack mid redzone:       f2
  Stack right redzone:     f3
  Stack after return:      f5
  Stack use after scope:   f8
  Global redzone:          f9
  Global init order:       f6
  Poisoned by user:        f7
  Container overflow:      fc
  Array cookie:            ac
  Intra object redzone:    bb
  ASan internal:           fe
  Left alloca redzone:     ca
  Right alloca redzone:    cb
  Shadow gap:              cc
==42==ABORTING

=================================================================
==42==ERROR: LeakSanitizer: detected memory leaks

Direct leak of 4 byte(s) in 1 object(s) allocated from:
    #0 0x23a29 in wasm-function[778]+0x23a29 (a.out.wasm+0x23a29)
    #1 0x19c1 in wasm-function[62]+0x19c1 (a.out.wasm+0x19c1)
    #2 0x1809 in wasm-function[61]+0x1809 (a.out.wasm+0x1809)
    #3 0x3d36 in wasm-function[128]+0x3d36 (a.out.wasm+0x3d36)
    #4 0x800000cb  (JavaScript+0xcb)
    #5 0x800000cb  (JavaScript+0xcb)
    #6 0x15a43 in wasm-function[503]+0x15a43 (a.out.wasm+0x15a43)
    #7 0x16b98 in wasm-function[543]+0x16b98 (a.out.wasm+0x16b98)

Indirect leak of 24 byte(s) in 1 object(s) allocated from:
    #0 0x23a29 in wasm-function[778]+0x23a29 (a.out.wasm+0x23a29)
    #1 0x9581 in wasm-function[311]+0x9581 (a.out.wasm+0x9581)
    #2 0x19c8 in wasm-function[62]+0x19c8 (a.out.wasm+0x19c8)
    #3 0x1809 in wasm-function[61]+0x1809 (a.out.wasm+0x1809)
    #4 0x3d36 in wasm-function[128]+0x3d36 (a.out.wasm+0x3d36)
    #5 0x800000cb  (JavaScript+0xcb)
    #6 0x800000cb  (JavaScript+0xcb)
    #7 0x15a43 in wasm-function[503]+0x15a43 (a.out.wasm+0x15a43)

SUMMARY: AddressSanitizer: 28 byte(s) leaked in 2 allocation(s).

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions