Commit a3c0b5db authored by Keith Packard's avatar Keith Packard
Browse files

Copy locale modifiers when creating XimInstCallback [v2]



Locale modifiers may be freed whenever XSetLocaleModifiers gets
called, even if the locale hasn't changed. This means that we cannot
save a pointer to those modifiers in the XimInstCallback record and
must, instead, make a copy of them instead.

This fixes a problem uncovered when running wish under libasan as
follows (on current Debian unstable):

	$ LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libasan.so.6 wish
Reported-by: Vittorio Zecca's avatarVittorio Zecca <zeccav@gmail.com>
Signed-off-by: Keith Packard's avatarKeith Packard <keithp@keithp.com>

v2:
	Remove incorrect 'else' token found by @alanc
parent 960e2e0c
Pipeline #230376 passed with stages
in 8 minutes and 40 seconds
...@@ -162,6 +162,7 @@ _XimRegisterIMInstantiateCallback( ...@@ -162,6 +162,7 @@ _XimRegisterIMInstantiateCallback(
{ {
XimInstCallback icb, tmp; XimInstCallback icb, tmp;
XIM xim; XIM xim;
char *modifiers = NULL;
Window root; Window root;
XWindowAttributes attr; XWindowAttributes attr;
...@@ -171,11 +172,18 @@ _XimRegisterIMInstantiateCallback( ...@@ -171,11 +172,18 @@ _XimRegisterIMInstantiateCallback(
icb = Xmalloc(sizeof(XimInstCallbackRec)); icb = Xmalloc(sizeof(XimInstCallbackRec));
if( !icb ) if( !icb )
return( False ); return( False );
if (lcd->core->modifiers) {
modifiers = strdup(lcd->core->modifiers);
if (!modifiers) {
Xfree(icb);
return( False );
}
}
icb->call = icb->destroy = False; icb->call = icb->destroy = False;
icb->display = display; icb->display = display;
icb->lcd = lcd; icb->lcd = lcd;
MakeLocale( lcd, icb->name ); MakeLocale( lcd, icb->name );
icb->modifiers = lcd->core->modifiers; /* XXXXX */ icb->modifiers = modifiers;
icb->rdb = rdb; icb->rdb = rdb;
icb->res_name = res_name; icb->res_name = res_name;
icb->res_class = res_class; icb->res_class = res_class;
...@@ -258,6 +266,7 @@ _XimUnRegisterIMInstantiateCallback( ...@@ -258,6 +266,7 @@ _XimUnRegisterIMInstantiateCallback(
else else
picb->next = icb->next; picb->next = icb->next;
_XCloseLC( icb->lcd ); _XCloseLC( icb->lcd );
XFree( icb->modifiers );
XFree( icb ); XFree( icb );
} }
return( True ); return( True );
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment