[cfe-dev] Address sanitizer failures in readdir and statfs on Mac
Jason Haslam
jason.haslam at gmail.com
Sat Feb 22 15:17:13 PST 2014
The code in question is in Qt. I think that it must have been a real bug in the code since I can no longer reproduce after trying the most recent version of Qt. I also haven’t been able reproduce the error in a minimal sample. I’m pretty sure that I started seeing the issue when I switched from 10.8 to 10.9, but that doesn’t mean that it’s not a bug in the client code.
On a slightly different topic, I’m a little confused about why I even get errors in Qt the first place since it was built without address sanitizer instrumentation. I didn't expect to see any errors there. Is there any way that I can ignore errors in third party libraries like this?
In any case, I apologize for the false alarm. Thanks for the help!
Jason
On Feb 21, 2014, at 10:53 PM, Kostya Serebryany <kcc at google.com> wrote:
> +glider
> Are you certain that this is not a real bug in your code?
> Could you provide a minimal test case?
> Does test/asan/TestCases/Linux/interception_readdir_r_test.cc work on your machine?
> (or, simply, does 'make check-asan' work?)
>
> This might be something in 10.9 that has changed since 10.8.
> Afaict, we are still not testing asan on 10.9 (glider?)
> Could you please send a preprocessed source of a test calling readdir_r so that I can see the definition of struct dirent?
>
> Looking at your report I see:
> WRITE of size 48830 at 0x11617988 thread T0
> 0x11617988 is located 0 bytes to the right of 520-byte region [0x11617780,0x11617988)
>
> So, somewhere in your heap you've allocated 520 bytes of memory for dirent.
> Then our readdir_r interceptor does this:
> int res = REAL(readdir_r)(dirp, entry, result);
> if (!res) {
> COMMON_INTERCEPTOR_WRITE_RANGE(ctx, result, sizeof(*result));
> if (*result)
> COMMON_INTERCEPTOR_WRITE_RANGE(ctx, *result, (*result)->d_reclen);
> }
>
> Since we see "WRITE of size 48830", this is likely the second "COMMON_INTERCEPTOR_WRITE_RANGE"
> with d_reclen=48830. That's quite unexpected I think.
>
> --kcc
>
>
>
>
> On Sat, Feb 22, 2014 at 2:39 AM, Jason Haslam <jason.haslam at gmail.com> wrote:
> I see address sanitizer failures with TOT clang in readdir_r on Mac OS 10.9 like the following:
>
> =================================================================
> ==61104==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x11617988 at pc 0x7fff36a bp 0xbffc2698 sp 0xbffc2684
> WRITE of size 48830 at 0x11617988 thread T0
> #0 0x7fff369 in wrap_readdir_r (/Users/jason/llvm/build/release/lib/clang/3.5/lib/darwin/libclang_rt.asan_osx_dynamic.dylib+0x12369)
> ...
> 0x11617988 is located 0 bytes to the right of 520-byte region [0x11617780,0x11617988)
> allocated by thread T0 here:
> #0 0x800ab1f in wrap_malloc (/Users/jason/llvm/build/release/lib/clang/3.5/lib/darwin/libclang_rt.asan_osx_dynamic.dylib+0x1db1f)
> ...
> SUMMARY: AddressSanitizer: heap-buffer-overflow ??:0 wrap_readdir_r
> ...
> ==61104==ABORTING
>
> I get similar failures in statfs. Does anybody else see this? I got around these issues with the attached patch. Is there a better way to fix this without disabling these interceptors?
>
> Jason
>
>
>
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20140222/43576d35/attachment.html>
More information about the cfe-dev
mailing list