Jason Kenny created TS-4027:
-------------------------------

             Summary: incorrect usage of mmap
                 Key: TS-4027
                 URL: https://issues.apache.org/jira/browse/TS-4027
             Project: Traffic Server
          Issue Type: Bug
            Reporter: Jason Kenny




The specific type of the crash caused by this failure (whether it is the 
SCT_SetReg assertion, or Unexpected memory deallocation error) is pretty random.

This is because the crash is caused by the application’s problematic/buggy 
behavior in a way I’ll describe below.

This is a trace of the syscalls invoked by traffic_server as generated with 
strace (running without Pin) - I highlighted the important syscalls:

open("/tmp/yts/var/trafficserver/host.db", O_RDWR|O_CREAT, 0644) = 118

fstat(118, {st_mode=S_IFREG|0644, st_size=25935872, ...}) = 0

open("/dev/zero", O_RDONLY) = 119

1.       mmap(NULL, 25935872, PROT_READ, MAP_SHARED|MAP_NORESERVE, 119, 0) = 
0x7fffef935000

2.       munmap(0x7fffef935000, 25935872) = 0

3.       mmap(0x7fffef935000, 966656, PROT_READ|PROT_WRITE, 
MAP_SHARED|MAP_FIXED|MAP_NORESERVE, 118, 0) = 0x7fffef935000

mmap(0x7fffefa21000, 7675904, PROT_READ|PROT_WRITE, 
MAP_SHARED|MAP_FIXED|MAP_NORESERVE, 118, 0xec000) = 0x7fffefa21000

mmap(0x7ffff0173000, 17285120, PROT_READ|PROT_WRITE, 
MAP_SHARED|MAP_FIXED|MAP_NORESERVE, 118, 0x83e000) = 0x7ffff0173000

mmap(0x7ffff11ef000, 8192, PROT_READ|PROT_WRITE, 
MAP_SHARED|MAP_FIXED|MAP_NORESERVE, 118, 0x18ba000) = 0x7ffff11ef000

close(119)                  = 0

close(118)                  = 0


1.       You can see that the application is first calling mmap with “addr” 
argument equal to NULL in order to get a memory region that covers the whole 
region requested for mapping of the file host.db (25935872 bytes).

2.       The application unmaps the allocated region (at address 
0x7fffef935000), but remembers this region as a “free” region.

3.       Then, the application tries to mmap each region of the file to 
addresses inside the region (from step 1) that it considers as “free”. These 
mmaps are called with the MAP_FIXED flag – meaning that if there is already a 
memory mapped in the requested region then the kernel should still map the 
requested memory in a way that the already mapped region will be discarded 
(zeroed).

 

As you probably guess, Between step 2 and 3 Pin is asking the OS to allocate 
memory for its own purpose and get some memory inside the unmapped region that 
the application considers as “free”.

This will cause the mapping in step 3 to overwrite Pin’s memory and corrupt it 
– leading to this crash.

This is a bug in the application (traffic_server) that needs to be fixed.

In a multi-threaded environment (traffic_server is multi-threaded) another 
thread can request memory mapping (by mmap) between step 2 and 3, and get a 
memory region that intersects with the problematic region.

This allocated memory will eventually be corrupted.

You don’t need Pin and dynamic instrumentation environment in order to 
reproduce this bug!

 

BTW, the application call-stack of this crash, as reported by Inspector is:

        <!-- [8]: pc = 0x00000000006df235, sp = 0x00007fffffffa560, min_sp = 
0x00007fffffffa560, _ZN14MultiCacheBase11mmap_regionEiPiPcRmbi, :0 -->

        <!-- [7]: pc = 0x00000000006dfc93, sp = 0x00007fffffffa610, min_sp = 
0x00007fffffffa610, _ZN14MultiCacheBase9mmap_dataEbb, :0 -->

        <!-- [6]: pc = 0x00000000006e0ec3, sp = 0x00007fffffffbb80, min_sp = 
0x00007fffffffbb80, _ZN14MultiCacheBase4openEP5StorePKcPcibbb, :0 -->

        <!-- [5]: pc = 0x00000000006ccfd5, sp = 0x00007fffffffcca0, min_sp = 
0x00007fffffffcca0, _ZN11HostDBCache5startEi, :0 -->

        <!-- [4]: pc = 0x00000000006cd31e, sp = 0x00007fffffffdd60, min_sp = 
0x00007fffffffdd60, _ZN15HostDBProcessor5startEim, :0 -->

        <!-- [3]: pc = 0x000000000053c771, sp = 0x00007fffffffddd0, min_sp = 
0x00007fffffffddd0, main, :0 -->

        <!-- [2]: pc = 0x0000003acbc1ed19, sp = 0x00007fffffffdf30, min_sp = 
0x00007fffffffdf30, __libc_start_main, :0 -->

        <!-- [1]: pc = 0x00000000004ee824, sp = 0x00007fffffffdff0, min_sp = 
0x00007fffffffdff0, _start, :0 -->

 



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to