dtc(1): reproducible segmentation fault

From: George Abdelmalik <gabdelmalik_at_uniridge.com.au>
Date: Sat, 24 Oct 2015 01:10:45 +1100
Hi,

With recent amd64 11.0-current system (as of earlier this week) I can 
reproduciblycw
get a SIGSEGV when running a command such as

$ dtc -o zb.dtb /usr/src/sys/boot/fdt/dts/arm/zedboard.dts
Segmentation fault (core dumped)

I've investigated the issue and found that the problem is at line
241 of the /usr/src/usr.bin/dtc/input_buffer.cc where the call to
mmap(2) fails. Snippet below:

233 mmap_input_buffer::mmap_input_buffer(int fd) : input_buffer(0, 0)
234 {
235         struct stat sb;
236         if (fstat(fd, &sb))
237         {
238                 perror("Failed to stat file");
239         }
240         size = sb.st_size;
241         buffer = (const char*)mmap(0, size, PROT_READ,
242                 MAP_PREFAULT_READ, fd, 0);
243         if (buffer == 0)
244         {
245                 perror("Failed to mmap file");
246         }
247 }

The code incorrectly tests againts 0 instead of MAP_FAILED for failure
which is why the the perror message isn't seen at the terminal, the SIGSEGV
happens later when an attempt to access the buffer array is made.

Also the final parts of truss output are:

..
..
getrusage(0,{ u=0.000000,s=0.002578,in=2,out=0 }) = 0 (0x0)
mmap(0x0,2097152,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON,-1,0x0) = 
34384904192 (0x801800000)
openat(AT_FDCWD,"xxx.dtb",O_WRONLY|O_CREAT|O_TRUNC,0666) = 3 (0x3)
getrusage(0,{ u=0.000000,s=0.002697,in=2,out=0 }) = 0 (0x0)
openat(AT_FDCWD,"/usr/src/sys/boot/fdt/dts/arm/zedboard.dts",O_RDONLY,00) = 
4 (0x4)
fstat(4,{ mode=-rw-r--r-- ,inode=73360,size=5360,blksize=5632 }) = 0 (0x0)
fstat(4,{ mode=-rw-r--r-- ,inode=73360,size=5360,blksize=5632 }) = 0 (0x0)
mmap(0x0,5360,PROT_READ,MAP_PREFAULT_READ,4,0x0) ERR#22 'Invalid argument'
close(4)                     = 0 (0x0)
SIGNAL 11 (SIGSEGV)
process killed, signal = 11 (core dumped)

Any help debugging this futher would be much appreciated. I just can't 
understand why
the mmap in question would fail, and what's invalid about its arguments?

Regards,
George.

-- 
George Abdelmalik
Director
Principal Software Engineer
Uniridge Pty Ltd
http://www.uniridge.com.au/
Received on Fri Oct 23 2015 - 12:18:47 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:41:00 UTC