diff options
author | Chris Sherlock <chris.sherlock79@gmail.com> | 2014-11-16 20:29:58 +1100 |
---|---|---|
committer | Chris Sherlock <chris.sherlock79@gmail.com> | 2014-11-16 20:30:12 +1100 |
commit | 29dd297739405eb1e2c6217795ca1bce3ac4f952 (patch) | |
tree | 271f7fa51fa325d0283719566bcaa044c43f8547 /vcl | |
parent | 28effca640fff262866d1d3ada6e51a3821a6725 (diff) |
vcl: fdo#86307 removed Solaris workaround from #i64273#
Basically, they were working around issues with XmbTextListToTextProperty
returning garbage characters, which showed on window titles.
The comment in the code is far more informative than the bug report:
/* #i64273# there are some weird cases when using IIIMP on Solaris
where for unknown reasons XmbTextListToTextProperty results in
garbage. Test one string once to ensure safety.
FIXME: This must be a bug in xiiimp.so.2 somewhere. However
it was not possible to recreate this in a small sample program.
This reeks of memory corruption somehow.
*/
Now I did a bit of research (aka "Google search") and discovered #i6759#
which was logged in 2002. This shows that the codebase was using __XOpenIM
in xiimp.so.2, which probably caused this issue. From the bug:
I've tried to look into this problem and have found out, that
apparently the
use of the '__XOpenIM' subroutine from the
/usr/openwin/lib/locale/common/xiiimp.so.2
shared library causes this problem. When running on Solaris, OO tries to
dlopen() the above mentioned shared library, looks up the '__XOpenIM'
symbol in it and calls this function ( function XvaOpenIM() in file
vcl/unx/source/app/i18n_wrp.cxx ).
There's alternate code in OO that just calls the X11 documented function
'XOpenIM()' instead. This is enabled by running OO 1.0.x with the
environment variable USE_XOPENIM defined to some value. When running
OO with
env USE_XOPENIM=1 ~/OpenOffice.org1.0.1/soffice
the problem does *not* occur any more and xprop for the same two windows
mentioned in the initial bug report shows:
% xprop |egrep '_NAME|_LOCALE'
WM_LOCALE_NAME(STRING) = "de_DE..ISO8859-15"
WM_ICON_NAME(STRING) = "unbenannt1 - OpenOffice.org 1.0.1 "
WM_NAME(STRING) = "unbenannt1 - OpenOffice.org 1.0.1 "
% xprop | egrep '_NAME|_LOCALE'
WM_LOCALE_NAME(STRING) = "de_DE..ISO8859-15"
WM_ICON_NAME(STRING) = "Umbruch einfÿ77777774gen"
WM_NAME(STRING) = "Umbruch einfÿ77777774gen"
As far as I can tell, the use of '__XOpenIM' frees some memory inside the
Solaris X11 shared library that is still in use by the X11 character set
conversion routines. Or in other words: the X11 character set conversion
routines operate on freed memory, after __XOpenIM was called.
These character set conversion routines are used by
XmbTextListToTextProperty
( in WMAdaptor::setWMName() in file vcl/unx/source/app/wmadaptor.cxx ) and
it seems they still access memory that was freed by the use of
'__XOpenIM'.
Now later on, Caolan removed XvaOpenIM() in commit
4d6dab2cde759551ceee7e6aaec89fa5235b1ecc and then later committed a patch that
removed the ability to use the environment variable USE_XOPENIM as it wasn't
necessary anymore (commit: 8b0287543d87659fd4bfde5edb6725ee5da5f80e). I'd say
that this was probably fixed in one of these changes.
Change-Id: I20effd77e0cdcde26d1be756cc6231f30f35118e
Diffstat (limited to 'vcl')
-rw-r--r-- | vcl/unx/generic/app/wmadaptor.cxx | 35 |
1 files changed, 0 insertions, 35 deletions
diff --git a/vcl/unx/generic/app/wmadaptor.cxx b/vcl/unx/generic/app/wmadaptor.cxx index 20bb31e3a801..eeaabb94abec 100644 --- a/vcl/unx/generic/app/wmadaptor.cxx +++ b/vcl/unx/generic/app/wmadaptor.cxx @@ -997,41 +997,6 @@ void WMAdaptor::setWMName( X11SalFrame* pFrame, const OUString& rWMName ) const } static bool bTrustXmb = true; - #ifdef SOLARIS - /* #i64273# there are some weird cases when using IIIMP on Solaris - * where for unknown reasons XmbTextListToTextProperty results in - * garbage. Test one string once to ensure safety. - * - * FIXME: This must be a bug in xiiimp.so.2 somewhere. However - * it was not possible to recreate this in a small sample program. - * This reeks of memory corruption somehow. - */ - static bool bOnce = true; - if( bOnce ) - { - bOnce = false; - XTextProperty aTestProp = { NULL, None, 0, 0 }; - const char *pText = "trustme"; - char* pT = const_cast<char*>(pText); - XmbTextListToTextProperty( m_pDisplay, - &pT, - 1, - XStdICCTextStyle, - &aTestProp ); - bTrustXmb = (aTestProp.nitems == 7) && - (aTestProp.value != NULL ) && - (strncmp( (char*)aTestProp.value, pText, 7 ) == 0) && - (aTestProp.encoding == XA_STRING); - if( aTestProp.value ) - XFree( aTestProp.value ); - #if OSL_DEBUG_LEVEL > 1 - fprintf( stderr, "%s\n", - bTrustXmb ? - "XmbTextListToTextProperty seems to work" : - "XmbTextListToTextProperty does not seem to work" ); - #endif - } - #endif char* pT = const_cast<char*>(aTitle.getStr()); XTextProperty aProp = { NULL, None, 0, 0 }; |