Dear WindowMaker developers,

first of all, thank you very much for your development of WindowMaker!:) I use 
WMaker probably about 20 years and I still don't miss any feature, WindowMaker 
is for me just perfect as is.



Last few weeks I had a problem on my 32bit Gentoo with WindowMaker 0.95.7. If I 
tried to open window menu, the wmaker has restarted (crashed) and it has shown 
no window menu. I have investigated a little bit and tried to start wmaker with 
option --for-real and then I could see Segmentation fault. I have set ulimit 
for core dumps to unlimited and created core dump. In gdb I could find the 
the place, where wmaker segfaults.

Core was generated by `/home/tmp/wmaker/0.95.7/bin/wmaker --for-real -display 
:1'.
Program terminated with signal SIGSEGV, Segmentation fault.
---Type <return> to continue, or q <return> to quit---
#0  0x0809a2c4 in updateWorkspaceMenu (menu=menu@entry=0x8b63c20) at 
winmenu.c:381
381  entry->rtext = GetShortcutKey(wKeyBindings[WKBD_MOVE_WORKSPACE1 + i]);

The whole function updateWorkspaceMenu() from wmaker-0.95.7:

/**************************************************/
357 static void updateWorkspaceMenu(WMenu * menu)
358 {
359   WScreen *scr = menu->frame->screen_ptr;
360   char title[MAX_WORKSPACENAME_WIDTH + 1];
361   WMenuEntry *entry;
362   int i;
363 
364   for (i = 0; i < scr->workspace_count; i++) {
365     if (i < menu->entry_no) {
366 
367       entry = menu->entries[i];
368       if (strcmp(entry->text, scr->workspaces[i]->name) != 0) {
369         wfree(entry->text);
370         strncpy(title, scr->workspaces[i]->name, MAX_WORKSPACENAME_WIDTH);
371         title[MAX_WORKSPACENAME_WIDTH] = 0;
372         menu->entries[i]->text = wstrdup(title);
373         menu->entries[i]->rtext = 
GetShortcutKey(wKeyBindings[WKBD_MOVE_WORKSPACE1 + i]);
374         menu->flags.realized = 0;
375       }
376     } else {
377       strncpy(title, scr->workspaces[i]->name, MAX_WORKSPACENAME_WIDTH);
378       title[MAX_WORKSPACENAME_WIDTH] = 0;
379 
380       entry = wMenuAddCallback(menu, title, switchWSCommand, NULL);
381       entry->rtext = GetShortcutKey(wKeyBindings[WKBD_MOVE_WORKSPACE1 + i]);
382 
383       menu->flags.realized = 0;
384     }
385 
386     /* workspace shortcut labels */
387     if (i / 10 == scr->current_workspace / 10)
388       entry->rtext = GetShortcutKey(wKeyBindings[WKBD_MOVE_WORKSPACE1 + (i 
% 10)]);
389     else
390       entry->rtext = NULL;
391   }
392 
393   if (!menu->flags.realized)
394     wMenuRealize(menu);
395 }
/**************************************************/

As you can see the line 381 contains wKeyBindings[WKBD_MOVE_WORKSPACE1 + i]. 
The same code is on the line 373, but the line 388 contains 
wKeyBindings[WKBD_MOVE_WORKSPACE1 + (i % 10)].

I have checked wKeyBindings in keybind.h too and wKeyBindings is defined as 
array of WShortKey with "WKBD_LAST" items. The WKBD_LAST is the last item in 
enum, which is at most 78 (i.e. 79 items from 0 to 78):

extern WShortKey wKeyBindings[WKBD_LAST];

This confirms GDB too:

(gdb) printf "WKBD_LAST:%i WKBD_MOVE_WORKSPACE1:%i i:%i 
WKBD_MOVE_WORKSPACE1+i=%i\n",WKBD_LAST,WKBD_MOVE_WORKSPACE1,i,WKBD_MOVE_WORKSPACE1+i
WKBD_LAST:78 WKBD_MOVE_WORKSPACE1:49 i:59 WKBD_MOVE_WORKSPACE1+i=108

And if the code is "WKBD_MOVE_WORKSPACE1 + i", then I get total 108, which is 
out of bound. Yes, I have many desktops, I just like the freedom to open new 
clean desktop if someone comes and want from me something. I had 60, now only 
50 as workaround for this segfault.

I am no developer, but IMHO, on the lines 373 and 381 there should be the same 
index "WKBD_MOVE_WORKSPACE1 + (i % 10)" as on the line 388. Am I correct?

I cannot explain, why this segfault happens with 60 desktops. With 59 desktops 
I get no segfault. But probably the index 107 (WKBD_MOVE_WORKSPACE1+58) stays 
in the windowmaker's memory.

Funny thing is, that Debian Jessie with Windowmaker 0.95.5 and Debian Stretch 
with Windowmaker 0.95.7 do not crash even with 60 desktops, but as I verified 
in GDB, the code generates the index out of bound too. Maybe there must be more 
desktops on Debian to generate enough big index and trigger this segfault or 
maybe I have on my gentoo some feature, which place the data somewhere at the 
end of windowmaker's memory and therefore I get segfault with 60 desktops.

As I can see, this bug is present since

commit ae7235c2df819604f2b407cc738a835f55e6b81f
Author: Iain Patterson <w...@iain.cx>
Date:   Wed Mar 27 22:46:00 2013 +0000



Could some please verify this and update this code?

Thank you very much.

Regards.

Robert Wolf.


-- 
To unsubscribe, send mail to wmaker-dev-unsubscr...@lists.windowmaker.org.

Reply via email to