Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 3 Nov 2010 09:23:08 +0000 (UTC)
From:      Konstantin Belousov <kib@FreeBSD.org>
To:        cvs-src-old@freebsd.org
Subject:   cvs commit: src/libexec/rtld-elf rtld.c rtld.h
Message-ID:  <201011030923.oA39NO3D017577@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
kib         2010-11-03 09:23:08 UTC

  FreeBSD src repository

  Modified files:
    libexec/rtld-elf     rtld.c rtld.h 
  Log:
  SVN rev 214728 on 2010-11-03 09:23:08Z by kib
  
  If dlopen() is called for the dso that has been already loaded as a
  dependency, then the dso never has its DAG initialized. Empty DAG
  makes ref_dag() call in dlopen() a nop, and the dso refcount is off
  by one.
  
  Initialize the DAG on the first dlopen() call, using a boolean flag
  to prevent double initialization.
  
  From the PR (edited):
  Assume we have a library liba.so, containing a function a(), and a
  library libb.so, containing function b(). liba.so needs functionality
  from libb.so, so liba.so links in libb.so.
  
  An application doesn't know about the relation between these libraries,
  but needs to call a() and b(). It dlopen()s liba.so and obtains a
  pointer to a(), then it dlopen()s libb.so and obtains a pointer to b().
  
  As soon as the application doesn't need a() anymore, it dlclose()s liba.so.
  
  Expected result: the pointer to b() is still valid and can be called
  Actual result: the pointer to b() has become invalid, even though the
  application did not dlclose() the handle to libb.so. On calling b(), the
  application crashes with a segmentation fault.
  
  PR:     misc/151861
  Based on patch by:      jh
  Reviewed by:    kan
  Tested by:      Arjan van Leeuwen <freebsd-maintainer opera com>
  MFC after:      1 week
  
  Revision  Changes    Path
  1.158     +13 -2     src/libexec/rtld-elf/rtld.c
  1.47      +1 -0      src/libexec/rtld-elf/rtld.h



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201011030923.oA39NO3D017577>