mirror of
https://github.com/gryf/wmaker.git
synced 2025-12-19 20:38:08 +01:00
Fix buffer overflows in shortcut and workspace name handling
The handling of user defined shortcuts was not checking the length
of the shortcut before copying it to a fixed-length temporary buffer,
char buf[128];
strcpy(buf, shortcutDefinition);
and strcpy() is well known for not checking if overflows will occur.
In particular, wmaker was crashing here if a big 'shortcut' was defined
either through WPrefs or by directly editing the configuration files.
This is now avoided by using strncpy() instead.
And this patch also fixes a similar buffer overflow for big workspace
names too.
Furthermore, use MAX_SHORTCUT_LENGTH instead of raw number and define
it to be 32 instead of 128.
This commit is contained in:
@@ -69,7 +69,7 @@
|
|||||||
#include "workspace.h"
|
#include "workspace.h"
|
||||||
#include "properties.h"
|
#include "properties.h"
|
||||||
|
|
||||||
|
#define MAX_SHORTCUT_LENGTH 32
|
||||||
|
|
||||||
/***** Global *****/
|
/***** Global *****/
|
||||||
|
|
||||||
@@ -2515,7 +2515,7 @@ getKeybind(WScreen *scr, WDefaultEntry *entry, WMPropList *value, void *addr,
|
|||||||
KeySym ksym;
|
KeySym ksym;
|
||||||
char *val;
|
char *val;
|
||||||
char *k;
|
char *k;
|
||||||
char buf[128], *b;
|
char buf[MAX_SHORTCUT_LENGTH], *b;
|
||||||
|
|
||||||
|
|
||||||
GET_STRING_OR_DEFAULT("Key spec", val);
|
GET_STRING_OR_DEFAULT("Key spec", val);
|
||||||
@@ -2528,7 +2528,7 @@ getKeybind(WScreen *scr, WDefaultEntry *entry, WMPropList *value, void *addr,
|
|||||||
return True;
|
return True;
|
||||||
}
|
}
|
||||||
|
|
||||||
strcpy(buf, val);
|
strncpy(buf, val, MAX_SHORTCUT_LENGTH);
|
||||||
|
|
||||||
b = (char*)buf;
|
b = (char*)buf;
|
||||||
|
|
||||||
|
|||||||
@@ -55,7 +55,7 @@
|
|||||||
|
|
||||||
#include <WINGs/WUtil.h>
|
#include <WINGs/WUtil.h>
|
||||||
|
|
||||||
|
#define MAX_SHORTCUT_LENGTH 32
|
||||||
|
|
||||||
extern char *Locale;
|
extern char *Locale;
|
||||||
|
|
||||||
@@ -513,11 +513,11 @@ addShortcut(char *file, char *shortcutDefinition, WMenu *menu,
|
|||||||
Shortcut *ptr;
|
Shortcut *ptr;
|
||||||
KeySym ksym;
|
KeySym ksym;
|
||||||
char *k;
|
char *k;
|
||||||
char buf[128], *b;
|
char buf[MAX_SHORTCUT_LENGTH], *b;
|
||||||
|
|
||||||
ptr = wmalloc(sizeof(Shortcut));
|
ptr = wmalloc(sizeof(Shortcut));
|
||||||
|
|
||||||
strcpy(buf, shortcutDefinition);
|
strncpy(buf, shortcutDefinition, MAX_SHORTCUT_LENGTH);
|
||||||
b = (char*)buf;
|
b = (char*)buf;
|
||||||
|
|
||||||
/* get modifiers */
|
/* get modifiers */
|
||||||
|
|||||||
@@ -79,6 +79,7 @@
|
|||||||
|
|
||||||
#include "framewin.h"
|
#include "framewin.h"
|
||||||
|
|
||||||
|
#define MAX_SHORTCUT_LENGTH 32
|
||||||
|
|
||||||
/*** var ***/
|
/*** var ***/
|
||||||
extern WPreferences wPreferences;
|
extern WPreferences wPreferences;
|
||||||
@@ -139,7 +140,7 @@ convertShortcuts(WScreen *scr, WMPropList *shortcut)
|
|||||||
KeySym ksym;
|
KeySym ksym;
|
||||||
char *k;
|
char *k;
|
||||||
char *buffer;
|
char *buffer;
|
||||||
char buf[128], *b;
|
char buf[MAX_SHORTCUT_LENGTH], *b;
|
||||||
int keycount,i,j,mod;
|
int keycount,i,j,mod;
|
||||||
|
|
||||||
if (WMIsPLString(shortcut)) {
|
if (WMIsPLString(shortcut)) {
|
||||||
@@ -163,9 +164,10 @@ convertShortcuts(WScreen *scr, WMPropList *shortcut)
|
|||||||
for (i=0,j=0;i<keycount;i++) {
|
for (i=0,j=0;i<keycount;i++) {
|
||||||
data->key[j].modifier = 0;
|
data->key[j].modifier = 0;
|
||||||
if (WMIsPLArray(shortcut)) {
|
if (WMIsPLArray(shortcut)) {
|
||||||
strcpy(buf, WMGetFromPLString(WMGetFromPLArray(shortcut, i)));
|
strncpy(buf, WMGetFromPLString(WMGetFromPLArray(shortcut, i)),
|
||||||
|
MAX_SHORTCUT_LENGTH);
|
||||||
} else {
|
} else {
|
||||||
strcpy(buf, WMGetFromPLString(shortcut));
|
strncpy(buf, WMGetFromPLString(shortcut), MAX_SHORTCUT_LENGTH);
|
||||||
}
|
}
|
||||||
b = (char*)buf;
|
b = (char*)buf;
|
||||||
|
|
||||||
|
|||||||
@@ -54,6 +54,7 @@
|
|||||||
|
|
||||||
#include "xinerama.h"
|
#include "xinerama.h"
|
||||||
|
|
||||||
|
#define MAX_SHORTCUT_LENGTH 32
|
||||||
|
|
||||||
extern WPreferences wPreferences;
|
extern WPreferences wPreferences;
|
||||||
extern XContext wWinContext;
|
extern XContext wWinContext;
|
||||||
@@ -1384,7 +1385,7 @@ wWorkspaceMenuUpdate(WScreen *scr, WMenu *menu)
|
|||||||
i = scr->workspace_count-(menu->entry_no-2);
|
i = scr->workspace_count-(menu->entry_no-2);
|
||||||
ws = menu->entry_no - 2;
|
ws = menu->entry_no - 2;
|
||||||
while (i>0) {
|
while (i>0) {
|
||||||
strcpy(title, scr->workspaces[ws]->name);
|
strncpy(title, scr->workspaces[ws]->name, MAX_WORKSPACENAME_WIDTH);
|
||||||
|
|
||||||
entry = wMenuAddCallback(menu, title, switchWSCommand, (void*)ws);
|
entry = wMenuAddCallback(menu, title, switchWSCommand, (void*)ws);
|
||||||
entry->flags.indicator = 1;
|
entry->flags.indicator = 1;
|
||||||
|
|||||||
Reference in New Issue
Block a user