[PATCH] Always use server-display.xkm for xkbcomp output files
The attached patch is code we've used in Xsun for years, and our Sun Ray people recently hit the same issue again in their Xorg 1.2-based Xnewt server port. It simply changes the Xserver to always use a filename containing the display number for xkm output, so that if two servers are starting at once with the same keymap they don't overwrite or delete each other's xkm files.While we're probably more likely to hit this on Sun Ray servers which can have hundreds of X servers running, I think it could also hit a single user machine with :0 :1 starting on different vt's at the same time. (Of course, the oft-mentioned change of not forking xkbcomp to compile to xkm would also solve this, but this is a much simpler short-term fix.) Does this look good to everyone? Anyone know of a reason it would not be a good idea? -- -Alan Coopersmith- [EMAIL PROTECTED] Sun Microsystems, Inc. - X Window System Engineering From ba5aed47f241ada8c73b61b3d5e18a1c2ccd268a Mon Sep 17 00:00:00 2001 From: Alan Coopersmith [EMAIL PROTECTED] Date: Wed, 19 Nov 2008 13:44:26 -0800 Subject: [PATCH] Always use server-display.xkm to avoid races when multiple servers start Previously each server starting ran xkbcomp with the output set to keymapname.xkm, read it, then deleted it - which led to races if two servers were starting at the same time with the same keymap. Sun bug #6773816 Xorg uses the same xkm output file for compiled keymap file http://bugs.opensolaris.org/bugdatabase/view_bug.do?bug_id=6773816 --- xkb/ddxLoad.c | 12 ++-- 1 files changed, 2 insertions(+), 10 deletions(-) diff --git a/xkb/ddxLoad.c b/xkb/ddxLoad.c index fc49d99..80da963 100644 --- a/xkb/ddxLoad.c +++ b/xkb/ddxLoad.c @@ -192,16 +192,8 @@ char *buf = NULL, keymap[PATH_MAX],xkm_output_dir[PATH_MAX]; #ifdef WIN32 char tmpname[PATH_MAX]; #endif -if ((names-keymap==NULL)||(names-keymap[0]=='\0')) { - sprintf(keymap,server-%s,display); -} -else { - if (strlen(names-keymap) PATH_MAX - 1) { - ErrorF([xkb] name of keymap (%s) exceeds max length\n, names-keymap); - return False; - } - strcpy(keymap,names-keymap); -} + +snprintf(keymap, sizeof(keymap), server-%s, display); XkbEnsureSafeMapName(keymap); OutputDirectory(xkm_output_dir, sizeof(xkm_output_dir)); -- 1.5.6.5 ___ xorg mailing list xorg@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/xorg
Re: [PATCH] Always use server-display.xkm for xkbcomp output files
On Wed, 2008-11-19 at 14:04 -0800, Alan Coopersmith wrote: The attached patch is code we've used in Xsun for years, and our Sun Ray people recently hit the same issue again in their Xorg 1.2-based Xnewt server port. It simply changes the Xserver to always use a filename containing the display number for xkm output, so that if two servers are starting at once with the same keymap they don't overwrite or delete each other's xkm files.While we're probably more likely to hit this on Sun Ray servers which can have hundreds of X servers running, I think it could also hit a single user machine with :0 :1 starting on different vt's at the same time. (Of course, the oft-mentioned change of not forking xkbcomp to compile to xkm would also solve this, but this is a much simpler short-term fix.) Does this look good to everyone? Anyone know of a reason it would not be a good idea? Hey, it deletes code, how can it not be good. Signed-off-by: Adam Jackson [EMAIL PROTECTED] - ajax signature.asc Description: This is a digitally signed message part ___ xorg mailing list xorg@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/xorg
Re: [PATCH] Always use server-display.xkm for xkbcomp output files
On Wed, Nov 19, 2008 at 2:04 PM, Alan Coopersmith [EMAIL PROTECTED] wrote: The attached patch is code we've used in Xsun for years, and our Sun Ray people recently hit the same issue again in their Xorg 1.2-based Xnewt server port. It simply changes the Xserver to always use a filename containing the display number for xkm output, so that if two servers are starting at once with the same keymap they don't overwrite or delete each other's xkm files.While we're probably more likely to hit this on Sun Ray servers which can have hundreds of X servers running, I think it could also hit a single user machine with :0 :1 starting on different vt's at the same time. (Of course, the oft-mentioned change of not forking xkbcomp to compile to xkm would also solve this, but this is a much simpler short-term fix.) Does this look good to everyone? Anyone know of a reason it would not be a good idea? -- -Alan Coopersmith- [EMAIL PROTECTED] Sun Microsystems, Inc. - X Window System Engineering From ba5aed47f241ada8c73b61b3d5e18a1c2ccd268a Mon Sep 17 00:00:00 2001 From: Alan Coopersmith [EMAIL PROTECTED] Date: Wed, 19 Nov 2008 13:44:26 -0800 Subject: [PATCH] Always use server-display.xkm to avoid races when multiple servers start Previously each server starting ran xkbcomp with the output set to keymapname.xkm, read it, then deleted it - which led to races if two servers were starting at the same time with the same keymap. Sun bug #6773816 Xorg uses the same xkm output file for compiled keymap file http://bugs.opensolaris.org/bugdatabase/view_bug.do?bug_id=6773816 --- xkb/ddxLoad.c | 12 ++-- 1 files changed, 2 insertions(+), 10 deletions(-) diff --git a/xkb/ddxLoad.c b/xkb/ddxLoad.c index fc49d99..80da963 100644 --- a/xkb/ddxLoad.c +++ b/xkb/ddxLoad.c @@ -192,16 +192,8 @@ char *buf = NULL, keymap[PATH_MAX],xkm_output_dir[PATH_MAX]; #ifdef WIN32 char tmpname[PATH_MAX]; #endif -if ((names-keymap==NULL)||(names-keymap[0]=='\0')) { - sprintf(keymap,server-%s,display); -} -else { - if (strlen(names-keymap) PATH_MAX - 1) { - ErrorF([xkb] name of keymap (%s) exceeds max length\n, names-keymap); - return False; - } - strcpy(keymap,names-keymap); -} + +snprintf(keymap, sizeof(keymap), server-%s, display); Well, I think Daniel removed the support for pre-built keymaps in ab79110a, so -keymap will always be NULL. It's effectively dead code, anyway. -- Dan ___ xorg mailing list xorg@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/xorg