From a8950af8ace4bf54c12164e8fe35678d058680f9 Mon Sep 17 00:00:00 2001 From: kojima Date: Wed, 20 Feb 2002 15:01:44 +0000 Subject: [PATCH] fixed segfault with incomplete WM_CLASS --- ChangeLog | 1 + WindowMaker/Defaults/WindowMaker.in | 1 + configure.ac | 21 +++++++++++++++++++++ src/funcs.h | 3 +++ src/misc.c | 19 +++++++++++++++++++ src/window.c | 4 ++-- src/winspector.c | 6 ++---- 7 files changed, 49 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index fe547e85..558fa0aa 100644 --- a/ChangeLog +++ b/ChangeLog @@ -34,6 +34,7 @@ Changes since version 0.80.0: - Window Maker will now use the WINDOWMAKER_ALT_WM environment variable (if it is defined) to overwrite the default hardcoded fallback window manager. - Added Czech translations of documentation (Jiri Hnidek ) +- Fixed segfault with incomplete WM_CLASS specifications. Changes since version 0.70.0: ............................. diff --git a/WindowMaker/Defaults/WindowMaker.in b/WindowMaker/Defaults/WindowMaker.in index 2b06e4cf..a2f7e71c 100644 --- a/WindowMaker/Defaults/WindowMaker.in +++ b/WindowMaker/Defaults/WindowMaker.in @@ -15,6 +15,7 @@ "#pkgdatadir#/Pixmaps", "/usr/X11R6/include/X11/pixmaps", "~/GNUstep/Library/WindowMaker/Pixmaps", + "/usr/share/icons", "/usr/local/share/pixmaps", "/usr/share/pixmaps" ); diff --git a/configure.ac b/configure.ac index 3018aa4d..c64789a8 100644 --- a/configure.ac +++ b/configure.ac @@ -100,7 +100,15 @@ dnl not used anywhere dnl AC_FUNC_MEMCMP AC_FUNC_VPRINTF AC_FUNC_ALLOCA +<<<<<<< configure.ac +<<<<<<< configure.ac +AC_CHECK_FUNCS(gethostname select poll strerror strcasecmp strncasecmp setpgid atexit mallinfo vsnprintf) +======= +AC_CHECK_FUNCS(gethostname select poll strerror strcasecmp strncasecmp setpgid atexit mallinfo snprintf vsnprintf asprintf vasprintf mkstemp) +>>>>>>> 1.4 +======= AC_CHECK_FUNCS(gethostname select poll strerror strcasecmp strncasecmp setpgid atexit mallinfo mkstemp snprintf vsnprintf asprintf vasprintf) +>>>>>>> 1.15 dnl ripped from samba @@ -175,9 +183,22 @@ AC_DEFINE_UNQUOTED(CPP_PATH, "$CPP_PATH") dnl Checks for header files. dnl ======================= +<<<<<<< configure.ac +AC_HEADER_STDC +======= +>>>>>>> 1.4 AC_HEADER_SYS_WAIT AC_HEADER_TIME +<<<<<<< configure.ac +<<<<<<< configure.ac +AC_CHECK_HEADERS(fcntl.h limits.h sys/ioctl.h sys/time.h sys/types.h\ + libintl.h sys/select.h poll.h malloc.h stdlib.h) +======= +AC_CHECK_HEADERS(fcntl.h limits.h sys/ioctl.h sys/time.h sys/types.h libintl.h sys/select.h poll.h malloc.h ctype.h stdlib.h string.h strings.h) +>>>>>>> 1.4 +======= AC_CHECK_HEADERS(fcntl.h limits.h sys/ioctl.h sys/time.h sys/types.h libintl.h sys/select.h poll.h malloc.h ctype.h string.h strings.h) +>>>>>>> 1.15 diff --git a/src/funcs.h b/src/funcs.h index 5180845c..7079a1e3 100644 --- a/src/funcs.h +++ b/src/funcs.h @@ -93,12 +93,15 @@ void StartWindozeCycle(WWindow *wwin, XEvent *event, Bool next); char *MakeCPPArgs(char *path); #endif +char *StrConcatDot(char *a, char *b); + char *ExpandOptions(WScreen *scr, char *cmdline); void ExecuteShellCommand(WScreen *scr, char *command); void StartLogShell(WScreen *scr); + Bool IsDoubleClick(WScreen *scr, XEvent *event); WWindow *NextToFocusAfter(WWindow *wwin); diff --git a/src/misc.c b/src/misc.c index 4171ec22..365b721b 100644 --- a/src/misc.c +++ b/src/misc.c @@ -1271,3 +1271,22 @@ UpdateDomainFile(WDDomain *domain) } + +char* +StrConcatDot(char *a, char *b) +{ + int len; + char *str; + + if (!a) + a = ""; + if (!b) + b = ""; + + len = strlen(a)+strlen(b)+4; + str = wmalloc(len); + + snprintf(str, len, "%s.%s", a, b); + + return str; +} diff --git a/src/window.c b/src/window.c index 430430ed..019fb5d1 100644 --- a/src/window.c +++ b/src/window.c @@ -830,9 +830,9 @@ wManageWindow(WScreen *scr, Window window) #define ADEQUATE(x) ((x)!=None && (x)!=wwin->client_win && (x)!=fPtr->leader) + PropGetWMClass(wwin->main_window, &class, &instance); - buffer = wmalloc(strlen(instance)+strlen(class)+2); - sprintf(buffer, "%s.%s", instance, class); + buffer = StrConcatDot(instance, class); index = WMFindInArray(scr->fakeGroupLeaders, matchIdentifier, (void*)buffer); if (index != WANotFound) { diff --git a/src/winspector.c b/src/winspector.c index eec66736..a507cdfc 100644 --- a/src/winspector.c +++ b/src/winspector.c @@ -527,8 +527,7 @@ saveSettings(WMButton *button, InspectorPanel *panel) else if (WMGetButtonSelected(panel->bothRb) != 0) { char *buffer; - buffer = wmalloc(strlen(wwin->wm_instance)+strlen(wwin->wm_class)+2); - sprintf(buffer, "%s.%s", wwin->wm_instance, wwin->wm_class); + buffer = StrConcatDot(wwin->wm_instance, wwin->wm_class); key = WMCreatePLString(buffer); wfree(buffer); } else if (WMGetButtonSelected(panel->defaultRb) != 0) { @@ -684,8 +683,7 @@ saveSettings(WMButton *button, InspectorPanel *panel) char *class = wapp->main_window_desc->wm_class; char *buffer; - buffer = wmalloc(strlen(instance)+strlen(class)+2); - sprintf(buffer, "%s.%s", instance, class); + buffer = StrConcatDot(instance, class); key2 = WMCreatePLString(buffer); wfree(buffer);