Page MenuHomePhabricator

Loading libraries crashes if find files with name shorter than dot plus library extension
Closed, ResolvedPublic

Description

Hi Matt,

On 04/19/2014 10:32 PM, Clarkson, Matt wrote:
Hi there,

We have a longstanding problem, with our app crashing on startup on Mavericks. We work around this by setting the DYLD_LIBRARY_PATH before launching the app from a terminal console, or using the Mac Automator scripts to set the DYLD_LIBRARY_PATH before launching the GUI. Neither of these should be necessary.

However, this
https://github.com/MITK/MITK/commit/ae1fc222bd3ca4c5d988c814615d2e5866eaa0e2

was recently committed, (thanks Andreas), and I thought that would fix it. However, the app still crashes. We are currently using a branch based on MITK 2013.09, but we are working on an update to MITK 2014.03, and the same problem exists in both, even with the above fix. (incidentally, Andreas' fix should probably also be applied to loading the CTK Dicom library???)

It fixes the path for the CTK Dicom library but removed the loading of
org_mitk_gui_qt_ext (which wasn't intended...).

So, I eventually found this fix:
https://github.com/NifTK/MITK/commit/f47f8bc6342b42bed61a286f1fa8dd46d6a57a36

which seemed to resolve my problem, and this patch could be relevant to both 2013.09 and 2014.03, as the same code exists in both. So, the app was crashing because it was taking a substring of a string that was too short.

However, Im not sure why this piece of code exists. So, I have not yet raised a bug. So, here’s some more detail for those that are still reading.

This is old legacy code from pre-CTK times (when BlueBerry still contained
a C++ OSGi implementation).

Our app was working OK from the build environment, but not when double clicked in Finder. I googled and found that when launching from finder the working directory is typically just /. Sure enough, having done a make package, and installing the GUI into /Applications/ I could reproduce the problem. If I did

cd /
/Applications/niftk-14.04.0/NiftyView.app/Contents/MacOS/NiftyView

the application crashed here:
https://github.com/MITK/MITK/blob/master/BlueBerry/Bundles/org.blueberry.osgi/src/berryBundleLoader.cpp#L247

where the bundle->GetStorage() had a base directory of /, so this line:
https://github.com/MITK/MITK/blob/master/BlueBerry/Bundles/org.blueberry.osgi/src/berryBundleLoader.cpp#L223

adds “bin", and so, the app was looking through /bin for dynamic libraries. However, in my /bin, I have several small programs like sh, zsh, cp and so on. So, none of these are dynamic libraries, and hence none of this have a name longer than .dylib, so the app crashes.

However when I

cd /Users/mattclarkson
/Applications/niftk-14.04.0/NiftyView.app/Contents/MacOS/NiftyView

the bundle->GetStorage() has a base directory or /Users/mattclarkson, so the section in question is looking for dynamic libraries in /Users/mattclarkson/bin, which does not exist, and hence this line:
https://github.com/MITK/MITK/blob/master/BlueBerry/Bundles/org.blueberry.osgi/src/berryBundleLoader.cpp#L233

returns no entries, and so this loop:
https://github.com/MITK/MITK/blob/master/BlueBerry/Bundles/org.blueberry.osgi/src/berryBundleLoader.cpp#L237

is never executed.

So my fix here:
https://github.com/NifTK/MITK/commit/f81bbf980c937530dadb01d2433f8a759c026ba3

at least avoids the simple case of processing a string that is too short. However, I don’t understand why we are looking in those directories at all.

Any suggestions? I believe a bug should be raised, but Im not sure about the bigger picture.

Yes, please file a bug. Although it is legacy code, we should fix this
issue. I will try to remove the legacy parts in BlueBerry until the next
release.

Thanks for your efforts,

Sascha