Subject: [Boost-bugs] [Boost C++ Libraries] #10485: Boost.Filesystem: heap-use-after-free using C++11 range loop
From: Boost C++ Libraries (noreply_at_[hidden])
Date: 2014-09-09 16:14:17
#10485: Boost.Filesystem: heap-use-after-free using C++11 range loop
----------------------+------------------------------
Reporter: iamvfx@⦠| Type: Bugs
Status: new | Milestone: To Be Determined
Component: None | Version: Boost 1.54.0
Severity: Problem | Keywords:
----------------------+------------------------------
Repro code:
{{{
#include <stdio.h>
#include <boost/filesystem.hpp>
int main() {
boost::filesystem::path dir("/");
for (char c : dir.filename().string())
printf("%c\n", c);
}
}}}
I know if I want to fix it I should store dir.filename().string() in a
variable (and it works), but in this case it will either crash application
or print garbage. Here's what Clang Address Sanitizer prints:
{{{
=================================================================
==12324==ERROR: AddressSanitizer: heap-use-after-free on address
0x60300000ef50 at pc 0x48448a bp 0x7fff08f73990 sp 0x7fff08f73988
READ of size 8 at 0x60300000ef50 thread T0
#0 0x484489 in std::string::size() const /usr/bin/../lib/gcc/x86_64
-redhat-linux/4.8.3/../../../../include/c++/4.8.3/bits/basic_string.h:716
#1 0x484489 in ~path /usr/bin/../lib/gcc/x86_64-redhat-
linux/4.8.3/../../../../include/c++/4.8.3/bits/basic_string.h:636
#2 0x484489 in main
/run/media/constantine/Space/Boost_1.54.0_Bug_Repro_09.07.2014/main.cpp:6
#3 0x7f0679cd0d64 in __libc_start_main (/lib64/libc.so.6+0x21d64)
#4 0x483f1c in _start
(/run/media/constantine/Space/Boost_1.54.0_Bug_Repro_09.07.2014/Debug/app+0x483f1c)
0x60300000ef50 is located 0 bytes inside of 26-byte region
[0x60300000ef50,0x60300000ef6a)
freed by thread T0 here:
#0 0x46e7b9 in operator delete(void*)
(/run/media/constantine/Space/Boost_1.54.0_Bug_Repro_09.07.2014/Debug/app+0x46e7b9)
#1 0x4843f2 in std::string::_M_rep() const /usr/bin/../lib/gcc/x86_64
-redhat-linux/4.8.3/../../../../include/c++/4.8.3/bits/basic_string.h:249
#2 0x4843f2 in ~basic_string /usr/bin/../lib/gcc/x86_64-redhat-
linux/4.8.3/../../../../include/c++/4.8.3/bits/basic_string.h:539
#3 0x4843f2 in ~basic_string /usr/bin/../lib/gcc/x86_64-redhat-
linux/4.8.3/../../../../include/c++/4.8.3/bits/basic_string.h:539
#4 0x4843f2 in ~path /usr/include/boost/filesystem/path.hpp:55
#5 0x4843f2 in main
/run/media/constantine/Space/Boost_1.54.0_Bug_Repro_09.07.2014/main.cpp:6
#6 0x7f0679cd0d64 in __libc_start_main (/lib64/libc.so.6+0x21d64)
previously allocated by thread T0 here:
#0 0x46e4b9 in operator new(unsigned long)
(/run/media/constantine/Space/Boost_1.54.0_Bug_Repro_09.07.2014/Debug/app+0x46e4b9)
#1 0x7f067a3411d8 (/lib64/libstdc++.so.6+0xbe1d8)
#2 0x9
SUMMARY: AddressSanitizer: heap-use-after-free /usr/bin/../lib/gcc/x86_64
-redhat-linux/4.8.3/../../../../include/c++/4.8.3/bits/basic_string.h:716
std::string::size() const
Shadow bytes around the buggy address:
0x0c067fff9d90: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
0x0c067fff9da0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
0x0c067fff9db0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
0x0c067fff9dc0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
0x0c067fff9dd0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
=>0x0c067fff9de0: fa fa fa fa fa fa fa fa fa fa[fd]fd fd fd fa fa
0x0c067fff9df0: 00 00 00 02 fa fa 00 00 00 03 fa fa 00 00 00 02
0x0c067fff9e00: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
0x0c067fff9e10: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
0x0c067fff9e20: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
0x0c067fff9e30: 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
Heap right redzone: fb
Freed heap region: fd
Stack left redzone: f1
Stack mid redzone: f2
Stack right redzone: f3
Stack partial redzone: f4
Stack after return: f5
Stack use after scope: f8
Global redzone: f9
Global init order: f6
Poisoned by user: f7
ASan internal: fe
==12324==ABORTING
}}}
-- Ticket URL: <https://svn.boost.org/trac/boost/ticket/10485> Boost C++ Libraries <http://www.boost.org/> Boost provides free peer-reviewed portable C++ source libraries.
This archive was generated by hypermail 2.1.7 : 2017-02-16 18:50:16 UTC