[prev in list] [next in list] [prev in thread] [next in thread]
List: xine-cvslog
Subject: [xine-cvs] CVS: xine-ui/src/xitk kbindings_common.c,1.1,1.2
From: Hans-Dieter Kosch <fsck-p () users ! sourceforge ! net>
Date: 2008-01-27 0:05:25
Message-ID: E1JIv1Z-0000SK-25 () sc8-pr-cvs10 ! sourceforge ! net
[Download RAW message or body]
Update of /cvsroot/xine/xine-ui/src/xitk
In directory sc8-pr-cvs10.sourceforge.net:/tmp/cvs-serv1744
Modified Files:
kbindings_common.c
Log Message:
Fixed missing initialization of kbinding table elements which caused
table corruption and array overflow (casual aliases). Added check for
array overflow. Fixed potential memory leak. Removed obsolete and misused
'%' sign doubling (no format string!) in redundancy message.
Index: kbindings_common.c
===================================================================
RCS file: /cvsroot/xine/xine-ui/src/xitk/kbindings_common.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- kbindings_common.c 16 Jan 2008 16:29:42 -0000 1.1
+++ kbindings_common.c 27 Jan 2008 00:05:22 -0000 1.2
@@ -413,6 +413,19 @@
void _kbindings_init_to_default_no_kbt(kbinding_t *kbt) {
int i;
+ /*
+ * FIXME: This should be a compile time check.
+ */
+ /* Check for space to hold the default table plus a number of user defined aliases. */
+ if(sizeof(default_binding_table)/sizeof(default_binding_table[0])+100 > MAX_ENTRIES) {
+ fprintf(stderr, "%s(%d):\n"
+ " Too many entries in default_binding_table[].\n"
+ " Increase MAX_ENTRIES to at least %d.\n",
+ __XINE_FUNCTION__, __LINE__,
+ sizeof(default_binding_table)/sizeof(default_binding_table[0])+100);
+ abort();
+ }
+
for(i = 0; default_binding_table[i].action != NULL; i++) {
kbt->entry[i] = (kbinding_entry_t *) malloc(sizeof(kbinding_entry_t));
kbt->entry[i]->comment = strdup(default_binding_table[i].comment);
@@ -420,6 +433,8 @@
kbt->entry[i]->action_id = default_binding_table[i].action_id;
kbt->entry[i]->key = strdup(default_binding_table[i].key);
kbt->entry[i]->modifier = default_binding_table[i].modifier;
+ kbt->entry[i]->is_alias = default_binding_table[i].is_alias;
+ kbt->entry[i]->is_gui = default_binding_table[i].is_gui;
}
kbt->entry[i] = (kbinding_entry_t *) malloc(sizeof(kbinding_entry_t));
kbt->entry[i]->comment = NULL;
@@ -427,8 +442,10 @@
kbt->entry[i]->action_id = 0;
kbt->entry[i]->key = NULL;
kbt->entry[i]->modifier = 0;
+ kbt->entry[i]->is_alias = 0;
+ kbt->entry[i]->is_gui = 0;
- kbt->num_entries = i + 1;
+ kbt->num_entries = i + 1; /* Count includes the terminating null entry! */
}
kbinding_t *_kbindings_init_to_default(void) {
@@ -564,6 +581,12 @@
ABORT_IF_NULL(kbt);
ABORT_IF_NULL(ukb);
+ /* This should only happen if the keymap file was edited manually. */
+ if(kbt->num_entries >= MAX_ENTRIES) {
+ fprintf(stderr, _("xine-ui: Too many Alias entries in keymap file, entry ignored.\n"));
+ return;
+ }
+
k = kbindings_lookup_action(kbt, ukb->alias);
if(k) {
@@ -788,37 +811,6 @@
}
#endif
-static void _kbindings_subst_percent(char *src, char *dest) {
- char *s, *d;
-
- if(!src || !dest)
- return;
-
- if(!strlen(src))
- return;
-
- if(strchr(src, '%')) {
- s = src;
- d = dest;
- while(*s != '\0') {
-
- switch(*s) {
- case '%':
- if((*(s) == '%') && (*(s + 1) != '%'))
- *d++ = *s;
- default:
- *d = *s;
- break;
- }
- s++;
- d++;
- }
- *d = '\0';
- }
- else
- strcpy(dest, src);
-}
-
static void _kbindings_check_redundancy(kbinding_t *kbt) {
int i, j, found = 0;
char *kmsg = NULL;
@@ -832,16 +824,14 @@
if((!strcmp(kbt->entry[i]->key, kbt->entry[j]->key)) &&
(kbt->entry[i]->modifier == kbt->entry[j]->modifier) &&
(strcasecmp(kbt->entry[i]->key, "void"))) {
- char action1[1024], action2[1024];
+ char *action1, *action2;
char *dna = _("and");
int len;
found++;
- memset(&action1, 0, sizeof(action1));
- memset(&action2, 0, sizeof(action2));
- _kbindings_subst_percent(kbt->entry[i]->action, &action1[0]);
- _kbindings_subst_percent(kbt->entry[j]->action, &action2[0]);
+ action1 = kbt->entry[i]->action;
+ action2 = kbt->entry[j]->action;
len = strlen(action1) + 1 + strlen(dna) + 1 + strlen(action2);
@@ -877,8 +867,6 @@
_kbinding_reset_cb, _kbinding_editor_cb, NULL,
(void *) kbt, 450, ALIGN_CENTER,
"%s", kmsg);
- free(kmsg);
-
XLockDisplay(gGui->display);
if(!gGui->use_root_window && gGui->video_display == gGui->display)
XSetTransientForHint(gGui->display, xitk_window_get_window(xw), gGui->video_window);
@@ -888,6 +876,7 @@
}
#endif
+ free(kmsg);
}
/*
-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
Xine-cvslog mailing list
Xine-cvslog@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/xine-cvslog
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic