Переполнение буфера в буфере getifaddrs в 32-битном приложении, скомпилированном из 64-битной системы BSD

Я сталкиваюсь со странной проблемой при отладке моей программы с помощью AddressSanitizer Clang. Точно такой же код работает в другой 64-битной системе, но выдает ошибку переполнения кучи-буфера в другой.

Обе машины работают под управлением одной и той же операционной системы (BSD 10 64-битная) с одним и тем же набором инструментов и т. Д., За исключением того, что работающая система компилируется как 64-битная (то есть 64-битное приложение, работающее в 64-битной системе), а та, которая вызывает проблемы, компилируется как 32-битное приложение в 64-битной системе.

Там не так много кода, чтобы показать, так как проблема заключается только в одном вызове:

struct ifaddrs * ifAddrStruct = NULL;
getifaddrs(&ifAddrStruct);

Это трассировка стека, созданная ASan:

==19706==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x2e603e78 at pc 0x0832bbb2 bp 0xffff3288 sp 0xffff2e60
READ of size 256 at 0x2e603e78 thread T0
#0 0x832bbb1 in memcpy /home/dim/llvm-3.8.0/final/llvm.src/projects/compiler-rt/lib/asan/asan_interceptors.cc:438:3
#1 0x2bdbed49 in getifaddrs (/usr/lib32//libc.so.7+0xecd49)

0x2e603e78 is located 0 bytes to the right of 1528-byte region [0x2e603880,0x2e603e78)
allocated by thread T0 here:
#0 0x8337df0 in __interceptor_malloc /home/dim/llvm-3.8.0/final/llvm.src/projects/compiler-rt/lib/asan/asan_malloc_linux.cc:52:3
#1 0x2bdbe87f in getifaddrs (/usr/lib32//libc.so.7+0xec87f)
#2 0x8325799 in getifaddrs /home/dim/llvm-3.8.0/final/llvm.src/projects/compiler-rt/lib/asan/../sanitizer_common/sanitizer_common_interceptors.inc:4368:13
#3 0x8f1a443 in GetIPInfo(void) ...../src/config.cpp:243:2
#4 0x8f22837 in config_init(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) ...../src/config.cpp:329:7
#5 0xadf1cf9 in start(int, char**) (app+0xadf1cf9)
#6 0xade5a6c in main (app+0xade5a6c)
#7 0x82db629 in _start1 (app+0x82db629)
#8 0x82db4e7 in _start (app+0x82db4e7)
#9 0x0  (<unknown module>)

SUMMARY: AddressSanitizer: heap-buffer-overflow /home/dim/llvm-3.8.0/final/llvm.src/projects/compiler-rt/lib/asan/asan_interceptors.cc:438:3 in memcpy
Shadow bytes around the buggy address:
0x45cc0770: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x45cc0780: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x45cc0790: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x45cc07a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x45cc07b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
=>0x45cc07c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00[fa]
0x45cc07d0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
0x45cc07e0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
0x45cc07f0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
0x45cc0800: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
0x45cc0810: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa

Я использую одинаковые CFLAGS на обеих машинах, один и тот же компилятор (Clang 3.8), те же версии библиотеки. Некоторое время я смотрел на Google и на StackOverflow, но это, похоже, единичный случай, так как я не смог найти никого другого, у которого была бы та же самая проблема.

Надеюсь, кто-то знает больше по этому вопросу.

Заранее спасибо тому, кто может мне помочь.

Edit1: я только что понял, что я использую Clang 3.8.1 в системе, где все работает нормально (64-битное приложение в 64-битной системе), в то время как у другого все еще был 3.8.0. Я не уверен, но на данный момент я подозреваю, что это ошибка в компиляторе. Обновление до 3.8.1 теперь со всеми связанными 32-битными библиотеками (ASan и т. Д.) Сообщит мне, когда у меня появятся новости.

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector