From 4141febf7984c938b67f93d7c568d908d2ebfc45 Mon Sep 17 00:00:00 2001 From: Stephan Bergmann Date: Wed, 26 May 2021 13:22:20 +0200 Subject: osl::Module::loadRelative against symbol from executable is unreliable It turns out that c8976bdfdfa361fec9e1e5ff342094e409981fad "tdf#137208 Assume that dladdr provides an absolute pathname" is wrong with glibc if the requested address is in the executable itself, not in a dso. In that case, glibc just returns argv[0] as Dl_info::dli_fname (see "Fill in correct information if symbol is in main program"), which need not be absolute. With > cp workdir/LinkTarget/Executable/fftester instdir/program/ that causes > LD_LIBRARY_PATH=`pwd`/instdir/program instdir/program/fftester sd/qa/unit/data/cgm/pass/binary_corvette.cgm cgm to crash (cf. comment at "tdf#137208 Assume that dladdr provides an absolute pathname"): The call to osl::Module::loadRelative dlopen's instdir/program/libsdlo.so with a relative pathname containing at least one slash, which in turn causes dladdr with an address from libdlso.so to also return a relative pathname, which causes osl_getModuleURLFromAddress on such an address to fail, which causes the CGMPointer ctor in sd/source/filter/cgm/sdcgmfilter.cxx to set m_pPointer to null, causing SIGSEGV when TestImportCGM dereferences it. (Whereas e.g. > (cd instdir/program && PATH= LD_LIBRARY_PATH=`pwd` fftester sd/qa/unit/data/cgm/pass/binary_corvette.cgm cgm) would dlopen libsdlo.so with a relative pathname consisting just of a filename without a slash, so dlopen would search for the library, record its absolute pathname and return that from dladdr, and the program would have worked.) Change-Id: Ifa23124090275a397d4a9b0672ab845af23cf4d9 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/116194 Tested-by: Jenkins Reviewed-by: Stephan Bergmann --- vcl/workben/fftester.cxx | 172 ++++++++++++----------------------------------- 1 file changed, 44 insertions(+), 128 deletions(-) diff --git a/vcl/workben/fftester.cxx b/vcl/workben/fftester.cxx index c9c792cbe340..e0696977a89c 100644 --- a/vcl/workben/fftester.cxx +++ b/vcl/workben/fftester.cxx @@ -27,6 +27,10 @@ DYLD_LIBRARY_PATH=`pwd`/instdir/LibreOfficeDev.app/Contents/Frameworks instdir/LibreOfficeDev.app/Contents/MacOS/fftester png */ +#include + +#include + #include #include @@ -60,6 +64,7 @@ #include #include #include +#include #include #include @@ -71,11 +76,22 @@ using namespace ::com::sun::star::uno; using namespace ::com::sun::star::lang; using namespace cppu; +typedef bool (*FFilterCall)(SvStream &rStream); + #ifndef DISABLE_DYNLOADING -extern "C" { static void thisModule() {} } -#endif +namespace { -typedef bool (*FFilterCall)(SvStream &rStream); +FFilterCall load(std::u16string_view library, char const * function) { + OUString path = OUString::Concat("$LO_LIB_DIR/") + library; + rtl::Bootstrap::expandMacros(path); //TODO: check for failure + osl::Module aLibrary(path, SAL_LOADMODULE_LAZY); + auto const fn = reinterpret_cast(aLibrary.getFunctionSymbol(function)); + aLibrary.release(); + return fn; +} + +} +#endif SAL_IMPLEMENT_MAIN_WITH_ARGS(argc, argv) { @@ -241,11 +257,7 @@ SAL_IMPLEMENT_MAIN_WITH_ARGS(argc, argv) static FFilterCall pfnImport(nullptr); if (!pfnImport) { - osl::Module aLibrary; - aLibrary.loadRelative(&thisModule, "libmswordlo.so", SAL_LOADMODULE_LAZY); - pfnImport = reinterpret_cast( - aLibrary.getFunctionSymbol("TestImportWW8")); - aLibrary.release(); + pfnImport = load(u"libmswordlo.so", "TestImportWW8"); } SvFileStream aFileStream(out, StreamMode::READ); ret = static_cast((*pfnImport)(aFileStream)); @@ -255,11 +267,7 @@ SAL_IMPLEMENT_MAIN_WITH_ARGS(argc, argv) static FFilterCall pfnImport(nullptr); if (!pfnImport) { - osl::Module aLibrary; - aLibrary.loadRelative(&thisModule, "libmswordlo.so", SAL_LOADMODULE_LAZY); - pfnImport = reinterpret_cast( - aLibrary.getFunctionSymbol("TestImportWW6")); - aLibrary.release(); + pfnImport = load(u"libmswordlo.so", "TestImportWW6"); } SvFileStream aFileStream(out, StreamMode::READ); ret = static_cast((*pfnImport)(aFileStream)); @@ -269,11 +277,7 @@ SAL_IMPLEMENT_MAIN_WITH_ARGS(argc, argv) static FFilterCall pfnImport(nullptr); if (!pfnImport) { - osl::Module aLibrary; - aLibrary.loadRelative(&thisModule, "libmswordlo.so", SAL_LOADMODULE_LAZY); - pfnImport = reinterpret_cast( - aLibrary.getFunctionSymbol("TestImportWW2")); - aLibrary.release(); + pfnImport = load(u"libmswordlo.so", "TestImportWW2"); } SvFileStream aFileStream(out, StreamMode::READ); ret = static_cast((*pfnImport)(aFileStream)); @@ -283,11 +287,7 @@ SAL_IMPLEMENT_MAIN_WITH_ARGS(argc, argv) static FFilterCall pfnImport(nullptr); if (!pfnImport) { - osl::Module aLibrary; - aLibrary.loadRelative(&thisModule, "libmswordlo.so", SAL_LOADMODULE_LAZY); - pfnImport = reinterpret_cast( - aLibrary.getFunctionSymbol("TestImportRTF")); - aLibrary.release(); + pfnImport = load(u"libmswordlo.so", "TestImportRTF"); } SvFileStream aFileStream(out, StreamMode::READ); ret = static_cast((*pfnImport)(aFileStream)); @@ -297,11 +297,7 @@ SAL_IMPLEMENT_MAIN_WITH_ARGS(argc, argv) static FFilterCall pfnImport(nullptr); if (!pfnImport) { - osl::Module aLibrary; - aLibrary.loadRelative(&thisModule, "libswlo.so", SAL_LOADMODULE_LAZY); - pfnImport = reinterpret_cast( - aLibrary.getFunctionSymbol("TestImportHTML")); - aLibrary.release(); + pfnImport = load(u"libswlo.so", "TestImportHTML"); } SvFileStream aFileStream(out, StreamMode::READ); ret = static_cast((*pfnImport)(aFileStream)); @@ -311,11 +307,7 @@ SAL_IMPLEMENT_MAIN_WITH_ARGS(argc, argv) static FFilterCall pfnImport(nullptr); if (!pfnImport) { - osl::Module aLibrary; - aLibrary.loadRelative(&thisModule, "libswlo.so", SAL_LOADMODULE_LAZY); - pfnImport = reinterpret_cast( - aLibrary.getFunctionSymbol("TestImportFODT")); - aLibrary.release(); + pfnImport = load(u"libswlo.so", "TestImportFODT"); } SvFileStream aFileStream(out, StreamMode::READ); ret = static_cast((*pfnImport)(aFileStream)); @@ -325,11 +317,7 @@ SAL_IMPLEMENT_MAIN_WITH_ARGS(argc, argv) static FFilterCall pfnImport(nullptr); if (!pfnImport) { - osl::Module aLibrary; - aLibrary.loadRelative(&thisModule, "libswlo.so", SAL_LOADMODULE_LAZY); - pfnImport = reinterpret_cast( - aLibrary.getFunctionSymbol("TestImportDOCX")); - aLibrary.release(); + pfnImport = load(u"libswlo.so", "TestImportDOCX"); } SvFileStream aFileStream(out, StreamMode::READ); ret = static_cast((*pfnImport)(aFileStream)); @@ -339,11 +327,7 @@ SAL_IMPLEMENT_MAIN_WITH_ARGS(argc, argv) static FFilterCall pfnImport(nullptr); if (!pfnImport) { - osl::Module aLibrary; - aLibrary.loadRelative(&thisModule, "libsclo.so", SAL_LOADMODULE_LAZY); - pfnImport = reinterpret_cast( - aLibrary.getFunctionSymbol("TestImportFODS")); - aLibrary.release(); + pfnImport = load(u"libsclo.so", "TestImportFODS"); } SvFileStream aFileStream(out, StreamMode::READ); ret = static_cast((*pfnImport)(aFileStream)); @@ -353,11 +337,7 @@ SAL_IMPLEMENT_MAIN_WITH_ARGS(argc, argv) static FFilterCall pfnImport(nullptr); if (!pfnImport) { - osl::Module aLibrary; - aLibrary.loadRelative(&thisModule, "libsclo.so", SAL_LOADMODULE_LAZY); - pfnImport = reinterpret_cast( - aLibrary.getFunctionSymbol("TestImportXLSX")); - aLibrary.release(); + pfnImport = load(u"libsclo.so", "TestImportXLSX"); } SvFileStream aFileStream(out, StreamMode::READ); ret = static_cast((*pfnImport)(aFileStream)); @@ -367,11 +347,7 @@ SAL_IMPLEMENT_MAIN_WITH_ARGS(argc, argv) static FFilterCall pfnImport(nullptr); if (!pfnImport) { - osl::Module aLibrary; - aLibrary.loadRelative(&thisModule, "libsdlo.so", SAL_LOADMODULE_LAZY); - pfnImport = reinterpret_cast( - aLibrary.getFunctionSymbol("TestImportFODP")); - aLibrary.release(); + pfnImport = load(u"libsdlo.so", "TestImportFODP"); } SvFileStream aFileStream(out, StreamMode::READ); ret = static_cast((*pfnImport)(aFileStream)); @@ -381,11 +357,7 @@ SAL_IMPLEMENT_MAIN_WITH_ARGS(argc, argv) static FFilterCall pfnImport(nullptr); if (!pfnImport) { - osl::Module aLibrary; - aLibrary.loadRelative(&thisModule, "libsdlo.so", SAL_LOADMODULE_LAZY); - pfnImport = reinterpret_cast( - aLibrary.getFunctionSymbol("TestImportPPTX")); - aLibrary.release(); + pfnImport = load(u"libsdlo.so", "TestImportPPTX"); } SvFileStream aFileStream(out, StreamMode::READ); ret = static_cast((*pfnImport)(aFileStream)); @@ -395,11 +367,7 @@ SAL_IMPLEMENT_MAIN_WITH_ARGS(argc, argv) static FFilterCall pfnImport(nullptr); if (!pfnImport) { - osl::Module aLibrary; - aLibrary.loadRelative(&thisModule, "libscfiltlo.so", SAL_LOADMODULE_LAZY); - pfnImport = reinterpret_cast( - aLibrary.getFunctionSymbol("TestImportXLS")); - aLibrary.release(); + pfnImport = load(u"libscfiltlo.so", "TestImportXLS"); } SvFileStream aFileStream(out, StreamMode::READ); ret = static_cast((*pfnImport)(aFileStream)); @@ -409,11 +377,7 @@ SAL_IMPLEMENT_MAIN_WITH_ARGS(argc, argv) static FFilterCall pfnImport(nullptr); if (!pfnImport) { - osl::Module aLibrary; - aLibrary.loadRelative(&thisModule, "libscfiltlo.so", SAL_LOADMODULE_LAZY); - pfnImport = reinterpret_cast( - aLibrary.getFunctionSymbol("TestImportWKS")); - aLibrary.release(); + pfnImport = load(u"libscfiltlo.so", "TestImportWKS"); } SvFileStream aFileStream(out, StreamMode::READ); ret = static_cast((*pfnImport)(aFileStream)); @@ -423,11 +387,7 @@ SAL_IMPLEMENT_MAIN_WITH_ARGS(argc, argv) static FFilterCall pfnImport(nullptr); if (!pfnImport) { - osl::Module aLibrary; - aLibrary.loadRelative(&thisModule, "libhwplo.so", SAL_LOADMODULE_LAZY); - pfnImport = reinterpret_cast( - aLibrary.getFunctionSymbol("TestImportHWP")); - aLibrary.release(); + pfnImport = load(u"libhwplo.so", "TestImportHWP"); } SvFileStream aFileStream(out, StreamMode::READ); ret = static_cast((*pfnImport)(aFileStream)); @@ -437,11 +397,7 @@ SAL_IMPLEMENT_MAIN_WITH_ARGS(argc, argv) static FFilterCall pfnImport(nullptr); if (!pfnImport) { - osl::Module aLibrary; - aLibrary.loadRelative(&thisModule, "libt602filterlo.so", SAL_LOADMODULE_LAZY); - pfnImport = reinterpret_cast( - aLibrary.getFunctionSymbol("TestImport602")); - aLibrary.release(); + pfnImport = load(u"libt602filterlo.so", "TestImport602"); } SvFileStream aFileStream(out, StreamMode::READ); ret = static_cast((*pfnImport)(aFileStream)); @@ -451,11 +407,7 @@ SAL_IMPLEMENT_MAIN_WITH_ARGS(argc, argv) static FFilterCall pfnImport(nullptr); if (!pfnImport) { - osl::Module aLibrary; - aLibrary.loadRelative(&thisModule, "liblwpftlo.so", SAL_LOADMODULE_LAZY); - pfnImport = reinterpret_cast( - aLibrary.getFunctionSymbol("TestImportLWP")); - aLibrary.release(); + pfnImport = load(u"liblwpftlo.so", "TestImportLWP"); } SvFileStream aFileStream(out, StreamMode::READ); ret = static_cast((*pfnImport)(aFileStream)); @@ -465,11 +417,7 @@ SAL_IMPLEMENT_MAIN_WITH_ARGS(argc, argv) static FFilterCall pfnImport(nullptr); if (!pfnImport) { - osl::Module aLibrary; - aLibrary.loadRelative(&thisModule, "libsdfiltlo.so", SAL_LOADMODULE_LAZY); - pfnImport = reinterpret_cast( - aLibrary.getFunctionSymbol("TestImportPPT")); - aLibrary.release(); + pfnImport = load(u"libsdfiltlo.so", "TestImportPPT"); } SvFileStream aFileStream(out, StreamMode::READ); ret = static_cast((*pfnImport)(aFileStream)); @@ -479,11 +427,7 @@ SAL_IMPLEMENT_MAIN_WITH_ARGS(argc, argv) static FFilterCall pfnImport(nullptr); if (!pfnImport) { - osl::Module aLibrary; - aLibrary.loadRelative(&thisModule, "libsdlo.so", SAL_LOADMODULE_LAZY); - pfnImport = reinterpret_cast( - aLibrary.getFunctionSymbol("TestImportCGM")); - aLibrary.release(); + pfnImport = load(u"libsdlo.so", "TestImportCGM"); } SvFileStream aFileStream(out, StreamMode::READ); ret = static_cast((*pfnImport)(aFileStream)); @@ -493,11 +437,7 @@ SAL_IMPLEMENT_MAIN_WITH_ARGS(argc, argv) static FFilterCall pfnImport(nullptr); if (!pfnImport) { - osl::Module aLibrary; - aLibrary.loadRelative(&thisModule, "libscfiltlo.so", SAL_LOADMODULE_LAZY); - pfnImport = reinterpret_cast( - aLibrary.getFunctionSymbol("TestImportQPW")); - aLibrary.release(); + pfnImport = load(u"libscfiltlo.so", "TestImportQPW"); } SvFileStream aFileStream(out, StreamMode::READ); ret = static_cast((*pfnImport)(aFileStream)); @@ -507,11 +447,7 @@ SAL_IMPLEMENT_MAIN_WITH_ARGS(argc, argv) static FFilterCall pfnImport(nullptr); if (!pfnImport) { - osl::Module aLibrary; - aLibrary.loadRelative(&thisModule, "libscfiltlo.so", SAL_LOADMODULE_LAZY); - pfnImport = reinterpret_cast( - aLibrary.getFunctionSymbol("TestImportDIF")); - aLibrary.release(); + pfnImport = load(u"libscfiltlo.so", "TestImportDIF"); } SvFileStream aFileStream(out, StreamMode::READ); ret = static_cast((*pfnImport)(aFileStream)); @@ -521,11 +457,7 @@ SAL_IMPLEMENT_MAIN_WITH_ARGS(argc, argv) static FFilterCall pfnImport(nullptr); if (!pfnImport) { - osl::Module aLibrary; - aLibrary.loadRelative(&thisModule, "libscfiltlo.so", SAL_LOADMODULE_LAZY); - pfnImport = reinterpret_cast( - aLibrary.getFunctionSymbol("TestImportCalcRTF")); - aLibrary.release(); + pfnImport = load(u"libscfiltlo.so", "TestImportCalcRTF"); } SvFileStream aFileStream(out, StreamMode::READ); ret = static_cast((*pfnImport)(aFileStream)); @@ -535,11 +467,7 @@ SAL_IMPLEMENT_MAIN_WITH_ARGS(argc, argv) static FFilterCall pfnImport(nullptr); if (!pfnImport) { - osl::Module aLibrary; - aLibrary.loadRelative(&thisModule, "libsclo.so", SAL_LOADMODULE_LAZY); - pfnImport = reinterpret_cast( - aLibrary.getFunctionSymbol("TestImportSLK")); - aLibrary.release(); + pfnImport = load(u"libsclo.so", "TestImportSLK"); } SvFileStream aFileStream(out, StreamMode::READ); ret = static_cast((*pfnImport)(aFileStream)); @@ -549,11 +477,7 @@ SAL_IMPLEMENT_MAIN_WITH_ARGS(argc, argv) static FFilterCall pfnImport(nullptr); if (!pfnImport) { - osl::Module aLibrary; - aLibrary.loadRelative(&thisModule, "libsotlo.so", SAL_LOADMODULE_LAZY); - pfnImport = reinterpret_cast( - aLibrary.getFunctionSymbol("TestImportOLE2")); - aLibrary.release(); + pfnImport = load(u"libsotlo.so", "TestImportOLE2"); } SvFileStream aFileStream(out, StreamMode::READ); ret = static_cast((*pfnImport)(aFileStream)); @@ -563,11 +487,7 @@ SAL_IMPLEMENT_MAIN_WITH_ARGS(argc, argv) static FFilterCall pfnImport(nullptr); if (!pfnImport) { - osl::Module aLibrary; - aLibrary.loadRelative(&thisModule, "libsmlo.so", SAL_LOADMODULE_LAZY); - pfnImport = reinterpret_cast( - aLibrary.getFunctionSymbol("TestImportMML")); - aLibrary.release(); + pfnImport = load(u"libsmlo.so", "TestImportMML"); } SvFileStream aFileStream(out, StreamMode::READ); ret = static_cast((*pfnImport)(aFileStream)); @@ -577,11 +497,7 @@ SAL_IMPLEMENT_MAIN_WITH_ARGS(argc, argv) static FFilterCall pfnImport(nullptr); if (!pfnImport) { - osl::Module aLibrary; - aLibrary.loadRelative(&thisModule, "libsmlo.so", SAL_LOADMODULE_LAZY); - pfnImport = reinterpret_cast( - aLibrary.getFunctionSymbol("TestImportMathType")); - aLibrary.release(); + pfnImport = load(u"libsmlo.so", "TestImportMathType"); } SvFileStream aFileStream(out, StreamMode::READ); ret = static_cast((*pfnImport)(aFileStream)); -- cgit