Skip to content

ネームサーバーの起動時にエラーが発生する事がある #9

Description

@Nobu19800

ネームサーバー起動時に以下のように解放済みの領域にアクセスするエラーが発生する場合がある。

=================================================================
==914616==ERROR: AddressSanitizer: heap-use-after-free on address 0x504000000e90 at pc 0x7f613783b5b3 bp 0x7fffeaa0b6a0 sp 0x7fffeaa0ae48
READ of size 1 at 0x504000000e90 thread T0
    #0 0x7f613783b5b2 in __interceptor_strcmp ../../../../src/libsanitizer/sanitizer_common/sanitizer_common_interceptors.inc:466
    #1 0x7f6136f09759 in cmp_string /home/nobu/work/RtORB/lib/hashtable.c:52
    #2 0x7f6136f0a400 in getNewKey /home/nobu/work/RtORB/lib/hashtable.c:202
    #3 0x7f6136f0a9fe in registerItem /home/nobu/work/RtORB/lib/hashtable.c:290
    #4 0x7f6136f305e4 in register_PortableServer_Servant /home/nobu/work/RtORB/lib/poa.c:504
    #5 0x7f6136f30cf7 in PortableServer_POA_reinstall_object /home/nobu/work/RtORB/lib/poa.c:581
    #6 0x55893fc7fc13 in main /home/nobu/work/OpenRTM-aist/utils/openrtmNames/openrtmNames.cpp:167
    #7 0x7f6135f06d8f in __libc_start_call_main ../sysdeps/nptl/libc_start_call_main.h:58
    #8 0x7f6135f06e3f in __libc_start_main_impl ../csu/libc-start.c:392
    #9 0x55893fc80574 in _start (/home/nobu/work/rtorbinstall/bin/openrtmNames+0x21574)

0x504000000e90 is located 0 bytes inside of 37-byte region [0x504000000e90,0x504000000eb5)
freed by thread T0 here:
    #0 0x7f613785d537 in __interceptor_free ../../../../src/libsanitizer/asan/asan_malloc_linux.cpp:127
    #1 0x7f6136f30c78 in PortableServer_POA_reinstall_object /home/nobu/work/RtORB/lib/poa.c:577
    #2 0x55893fc7fc13 in main /home/nobu/work/OpenRTM-aist/utils/openrtmNames/openrtmNames.cpp:167
    #3 0x7f6135f06d8f in __libc_start_call_main ../sysdeps/nptl/libc_start_call_main.h:58

previously allocated by thread T0 here:
    #0 0x7f613785d887 in __interceptor_malloc ../../../../src/libsanitizer/asan/asan_malloc_linux.cpp:145
    #1 0x7f6136f0cb63 in new_ObjectID /home/nobu/work/RtORB/lib/util.c:170
    #2 0x7f6136f28581 in new_CORBA_Object /home/nobu/work/RtORB/lib/orb.c:308
    #3 0x7f6136f30839 in RtORB_POA_Object__create /home/nobu/work/RtORB/lib/poa.c:541
    #4 0x7f6136f3e099 in POA_CosNaming_NamingContextExt__init /home/nobu/work/RtORB/build/lib/CosName/CosNaming-skels.c:509
    #5 0x7f6136ed70fd in impl_CosNaming_NamingContextExt__create_servant /home/nobu/work/RtORB/lib/CXX/CosNaming-skelimpl.cc:720
    #6 0x55893fca899b in POA_CosNaming::NamingContextExt::NamingContextExt() /home/nobu/work/rtorbinstall/include/CosName/CosNaming.h:1612
    #7 0x55893fc8c826 in RTM::NamingContext::NamingContext(PortableServer::POA*) /home/nobu/work/OpenRTM-aist/utils/openrtmNames/NamingContext.cpp:49
    #8 0x55893fc7f914 in main /home/nobu/work/OpenRTM-aist/utils/openrtmNames/openrtmNames.cpp:147
    #9 0x7f6135f06d8f in __libc_start_call_main ../sysdeps/nptl/libc_start_call_main.h:58

SUMMARY: AddressSanitizer: heap-use-after-free ../../../../src/libsanitizer/sanitizer_common/sanitizer_common_interceptors.inc:466 in __interceptor_strcmp
Shadow bytes around the buggy address:
  0x0a087fff8180: fa fa 00 00 00 00 00 fa fa fa 00 00 00 00 00 fa
  0x0a087fff8190: fa fa 00 00 00 00 00 fa fa fa 00 00 00 00 00 00
  0x0a087fff81a0: fa fa 00 00 00 00 05 fa fa fa 00 00 00 00 00 fa
  0x0a087fff81b0: fa fa 00 00 00 00 00 00 fa fa 00 00 00 00 05 fa
  0x0a087fff81c0: fa fa 00 00 00 00 00 fa fa fa 00 00 00 00 00 00
=>0x0a087fff81d0: fa fa[fd]fd fd fd fd fa fa fa 00 00 00 00 00 03
  0x0a087fff81e0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x0a087fff81f0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x0a087fff8200: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x0a087fff8210: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x0a087fff8220: 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
  Freed heap region:       fd
  Stack left redzone:      f1
  Stack mid redzone:       f2
  Stack right redzone:     f3
  Stack after return:      f5
  Stack use after scope:   f8
  Global redzone:          f9
  Global init order:       f6
  Poisoned by user:        f7
  Container overflow:      fc
  Array cookie:            ac
  Intra object redzone:    bb
  ASan internal:           fe
  Left alloca redzone:     ca
  Right alloca redzone:    cb
  Shadow gap:              cc
==914616==ABORTING

おそらくelfhash関数とgetNewKey関数あたりに問題がありそうだが、まだ原因は特定できていない。

RtORB/lib/hashtable.c

Lines 40 to 49 in 21e2f7f

uint32_t elfhash(const unsigned char *name) {
uint32_t h = 0, g;
while (*name) {
h = (h << 4) + *name++;
g = h & 0xF0000000L;
if (g) h ^= g >> 24;
h &= ~g;
}
return h;
}

RtORB/lib/hashtable.c

Lines 193 to 214 in 21e2f7f

int32_t getNewKey(hashtable *tbl, void *k){
int size;
int key;
size = tbl->size;
key = (*tbl->hash_func)((const unsigned char*)k) % tbl->size;
while(size){
if(tbl->items[key].key == 0|| (*tbl->cmp_func)((char*)tbl->items[key].key, (char*)k)) return key;
else key = hashtableNextKey(tbl, key);
size--;
}
fprintf(stderr, "No space left.....\n");
return -1;
}
int32_t hashtableNextKey(hashtable *tbl, int32_t k){
int key = (k+1) % tbl->size;
return key;
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions