debian/changelog | 14 debian/patches/190_cache-xkbcomp_output_for_fast_start_up.patch | 774 ++++++++++ debian/patches/series | 3 3 files changed, 786 insertions(+), 5 deletions(-)
New commits: commit 836ab6df385aa167d740e9d5f364f1ca3973c760 Author: Bryce Harrington <br...@bryceharrington.org> Date: Thu Dec 3 14:55:18 2009 -0800 Drop 158; we've carried it disabled long enough. diff --git a/debian/changelog b/debian/changelog index 3a6090c..842b062 100644 --- a/debian/changelog +++ b/debian/changelog @@ -52,6 +52,8 @@ xorg-server (2:1.7.2-2ubuntu1) UNRELEASED; urgency=low - 156_exevents_copykeyclass_nullptrcheck.patch: No longer needed. Appropriate checks are done on the pointers prior to CopyKeyClass being called now. + - 158_raise_maxclients.patch: Breaks binary drivers. We've had this + reverted for some time now, may as well just get rid of it entirely. - 174_set_bg_pixmap_of_cow_to_none.patch: Upstream - 180_fedora_no_synaptics_mouse_synthesis.patch: Superseded. - 181_fedora_log_proc_cmdline.patch: Upstream. @@ -69,7 +71,7 @@ xorg-server (2:1.7.2-2ubuntu1) UNRELEASED; urgency=low * control, local/64-xorg-xkb.rules: Don't depend on keyboard-configuration until we have it. - -- Bryce Harrington <br...@ubuntu.com> Thu, 03 Dec 2009 14:51:56 -0800 + -- Bryce Harrington <br...@ubuntu.com> Thu, 03 Dec 2009 14:53:18 -0800 xorg-server (2:1.7.2-2) experimental; urgency=low diff --git a/debian/patches/series b/debian/patches/series index d3f3eae..d51dc55 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -15,7 +15,6 @@ #143_default_to_vesa.patch #156_exevents_copykeyclass_nullptrcheck.patch 157_check_null_modes.patch -#158_raise_maxclients.patch #160_log_timestamping.patch 162_null_crtc_in_rotation.patch 164_trap-aspect-ratios.patch commit 4c393646e22e847752c3b5efb1a466dcdf790dd7 Author: Bryce Harrington <br...@bryceharrington.org> Date: Thu Dec 3 14:52:49 2009 -0800 Updated patch 190 diff --git a/debian/changelog b/debian/changelog index 9e422bb..3a6090c 100644 --- a/debian/changelog +++ b/debian/changelog @@ -57,13 +57,19 @@ xorg-server (2:1.7.2-2ubuntu1) UNRELEASED; urgency=low - 181_fedora_log_proc_cmdline.patch: Upstream. - 185_dix_badwindow.patch: Upstream. - 186_autoconfig_geode.patch: Upstream. - * Patches disabled for now, need a review/refresh or both: - - 190_cache-xkbcomp_output_for_fast_start_up.patch * 189_xserver_1.5.0_bg_none_root.patch: Fetched a new version. + * 135_rethrow_signals.patch, 168_glibc_trace_to_stderr.patch: Updated. + Still relevant for hooking in apport. + * 169_mipointer_nullptr_checks.patch: Updated. MIPOINTER() still + can return NULL under some circumstances, and its return values + are still being dereferenced without checking for NULL. + * 188_default_primary_to_first_busid.patch: Updated. Still looks to be + relevant for certain multi-card systems. + * 190_cache-xkbcomp_output_for_fast_start_up.patch: Updated. * control, local/64-xorg-xkb.rules: Don't depend on keyboard-configuration until we have it. - -- Timo Aaltonen <tjaal...@ubuntu.com> Wed, 02 Dec 2009 20:40:21 +0200 + -- Bryce Harrington <br...@ubuntu.com> Thu, 03 Dec 2009 14:51:56 -0800 xorg-server (2:1.7.2-2) experimental; urgency=low diff --git a/debian/patches/190_cache-xkbcomp_output_for_fast_start_up.patch b/debian/patches/190_cache-xkbcomp_output_for_fast_start_up.patch index 7624022..cdd7245 100644 --- a/debian/patches/190_cache-xkbcomp_output_for_fast_start_up.patch +++ b/debian/patches/190_cache-xkbcomp_output_for_fast_start_up.patch @@ -428,3 +428,777 @@ diff -Naur xorg-server-20090727/xkb/README.compiled xorg-server-20090727.patch/x return Success; } +diff --git a/configure.ac b/configure.ac +index 8500db4..bc3d694 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -502,9 +502,9 @@ AC_ARG_WITH(default-font-path, AS_HELP_STRING([--with-default-font-path=PATH], [ + AC_ARG_WITH(xkb-path, AS_HELP_STRING([--with-xkb-path=PATH], [Path to XKB base dir (default: ${datadir}/X11/xkb)]), + [ XKBPATH="$withval" ], + [ XKBPATH="${datadir}/X11/xkb" ]) +-AC_ARG_WITH(xkb-output, AS_HELP_STRING([--with-xkb-output=PATH], [Path to XKB output dir (default: ${datadir}/X11/xkb/compiled)]), ++AC_ARG_WITH(xkb-output, AS_HELP_STRING([--with-xkb-output=PATH], [Path to XKB output dir (default: ${localstatedir}/cache/xkb)]), + [ XKBOUTPUT="$withval" ], +- [ XKBOUTPUT="compiled" ]) ++ [ XKBOUTPUT="${localstatedir}/cache/xkb" ]) + AC_ARG_WITH(default-xkb-rules, AS_HELP_STRING([--with-default-xkb-rules=RULES], + [Keyboard ruleset (default: base/evdev)]), + [ XKB_DFLT_RULES="$withval" ], +@@ -1101,7 +1101,7 @@ AC_DEFINE_DIR(XKB_BIN_DIRECTORY, XKB_BIN_DIRECTORY, [Path to XKB bin dir]) + dnl Make sure XKM_OUTPUT_DIR is an absolute path + XKBOUTPUT_FIRSTCHAR=`echo $XKBOUTPUT | cut -b 1` + if [[ x$XKBOUTPUT_FIRSTCHAR != x/ -a x$XKBOUTPUT_FIRSTCHAR != 'x$' ]] ; then +- XKBOUTPUT="$XKB_BASE_DIRECTORY/$XKBOUTPUT" ++ AC_MSG_ERROR([xkb-output must be an absolute path.]) + fi + + dnl XKM_OUTPUT_DIR (used in code) must end in / or file names get hosed +diff --git a/debian/patches/190_cache-xkbcomp_output_for_fast_start_up.patch b/debian/patches/190_cache-xkbcomp_output_for_fast_start_up.patch +index 7624022..e69de29 100644 +--- a/debian/patches/190_cache-xkbcomp_output_for_fast_start_up.patch ++++ b/debian/patches/190_cache-xkbcomp_output_for_fast_start_up.patch +@@ -1,430 +0,0 @@ +-diff -Naur xorg-server-20090727/configure.ac xorg-server-20090727.patch/configure.ac +---- xorg-server-20090727/configure.ac 2009-07-26 16:15:37.000000000 +0200 +-+++ xorg-server-20090727.patch/configure.ac 2009-08-08 20:28:07.100479376 +0200 +-@@ -476,9 +476,9 @@ +- AC_ARG_WITH(xkb-path, AS_HELP_STRING([--with-xkb-path=PATH], [Path to XKB base dir (default: ${datadir}/X11/xkb)]), +- [ XKBPATH="$withval" ], +- [ XKBPATH="${datadir}/X11/xkb" ]) +--AC_ARG_WITH(xkb-output, AS_HELP_STRING([--with-xkb-output=PATH], [Path to XKB output dir (default: ${datadir}/X11/xkb/compiled)]), +-+AC_ARG_WITH(xkb-output, AS_HELP_STRING([--with-xkb-output=PATH], [Path to XKB output dir (default: ${localstatedir}/cache/xkb)]), +- [ XKBOUTPUT="$withval" ], +-- [ XKBOUTPUT="compiled" ]) +-+ [ XKBOUTPUT="${localstatedir}/cache/xkb" ]) +- AC_ARG_WITH(serverconfig-path, AS_HELP_STRING([--with-serverconfig-path=PATH], +- [Directory where ancillary server config files are installed (default: ${libdir}/xorg)]), +- [ SERVERCONFIG="$withval" ], +-@@ -1757,7 +1757,7 @@ +- XKBOUTPUT_FIRSTCHAR=`echo $XKBOUTPUT | cut -b 1` +- +- if [[ x$XKBOUTPUT_FIRSTCHAR != x/ ]] ; then +-- XKBOUTPUT="$XKB_BASE_DIRECTORY/$XKBOUTPUT" +-+ AC_MSG_ERROR([xkb-output must be an absolute path.]) +- fi +- +- # XKM_OUTPUT_DIR (used in code) must end in / or file names get hosed +-diff -Naur xorg-server-20090727/xkb/ddxLoad.c xorg-server-20090727.patch/xkb/ddxLoad.c +---- xorg-server-20090727/xkb/ddxLoad.c 2009-07-26 16:15:37.000000000 +0200 +-+++ xorg-server-20090727.patch/xkb/ddxLoad.c 2009-08-08 20:48:46.504353541 +0200 +-@@ -32,6 +32,13 @@ +- #include <xkb-config.h> +- #endif +- +-+#ifdef HAVE_SHA1_IN_LIBMD /* Use libmd for SHA1 */ +-+# include <sha1.h> +-+#else /* Use OpenSSL's libcrypto */ +-+# include <stddef.h> /* buggy openssl/sha.h wants size_t */ +-+# include <openssl/sha.h> +-+#endif +-+ +- #include <stdio.h> +- #include <ctype.h> +- #define NEED_EVENTS 1 +-@@ -46,24 +53,13 @@ +- #define XKBSRV_NEED_FILE_FUNCS +- #include <xkbsrv.h> +- #include <X11/extensions/XI.h> +-+#include <errno.h> +- #include "xkb.h" +- +- #if defined(CSRG_BASED) || defined(linux) || defined(__GNU__) +- #include <paths.h> +- #endif +- +-- /* +-- * If XKM_OUTPUT_DIR specifies a path without a leading slash, it is +-- * relative to the top-level XKB configuration directory. +-- * Making the server write to a subdirectory of that directory +-- * requires some work in the general case (install procedure +-- * has to create links to /var or somesuch on many machines), +-- * so we just compile into /usr/tmp for now. +-- */ +--#ifndef XKM_OUTPUT_DIR +--#define XKM_OUTPUT_DIR "compiled/" +--#endif +-- +- #define PRE_ERROR_MSG "\"The XKEYBOARD keymap compiler (xkbcomp) reports:\"" +- #define ERROR_PREFIX "\"> \"" +- #define POST_ERROR_MSG1 "\"Errors from xkbcomp are not fatal to the X server\"" +-@@ -178,6 +174,45 @@ +- } +- } +- +-+static Bool +-+Sha1Asc(char sha1Asc[SHA_DIGEST_LENGTH*2+1], const char * input) +-+{ +-+ int i; +-+ unsigned char sha1[SHA_DIGEST_LENGTH]; +-+ +-+#ifdef HAVE_SHA1_IN_LIBMD /* Use libmd for SHA1 */ +-+ SHA1_CTX ctx; +-+ +-+ SHA1Init (&ctx); +-+ SHA1Update (&ctx, input, strlen(input)); +-+ SHA1Final (sha1, &ctx); +-+#else /* Use OpenSSL's libcrypto */ +-+ SHA_CTX ctx; +-+ int success; +-+ +-+ success = SHA1_Init (&ctx); +-+ if (! success) +-+ return BadAlloc; +-+ +-+ success = SHA1_Update (&ctx, input, strlen(input)); +-+ if (! success) +-+ return BadAlloc; +-+ +-+ success = SHA1_Final (sha1, &ctx); +-+ if (! success) +-+ return BadAlloc; +-+#endif +-+ +-+ /* convert sha1 to sha1_asc */ +-+ for(i=0; i<SHA_DIGEST_LENGTH; ++i) { +-+ sprintf(sha1Asc+i*2, "%02X", sha1[i]); +-+ } +-+ +-+ return Success; +-+} +-+ +-+/* call xkbcomp and compile XKB keymap, return xkm file name in +-+ nameRtrn */ +- static Bool +- XkbDDXCompileKeymapByNames( XkbDescPtr xkb, +- XkbComponentNamesPtr names, +-@@ -187,7 +222,11 @@ +- int nameRtrnLen) +- { +- FILE * out; +-- char *buf = NULL, keymap[PATH_MAX], xkm_output_dir[PATH_MAX]; +-+ char * buf = NULL, xkmfile[PATH_MAX], xkm_output_dir[PATH_MAX]; +-+ char * tmpXkmFile = NULL; +-+ char * canonicalXkmFileName = NULL; +-+ char sha1Asc[SHA_DIGEST_LENGTH*2+1], xkbKeyMapBuf[100*1024]; +-+ int ret, result; +- +- const char *emptystring = ""; +- const char *xkbbasedirflag = emptystring; +-@@ -198,16 +237,70 @@ +- /* WIN32 has no popen. The input must be stored in a file which is +- used as input for xkbcomp. xkbcomp does not read from stdin. */ +- char tmpname[PATH_MAX]; +-- const char *xkmfile = tmpname; +-+ const char *xkbfile = tmpname; +- #else +-- const char *xkmfile = "-"; +-+ const char *xkbfile = "-"; +- #endif +- +-- snprintf(keymap, sizeof(keymap), "server-%s", display); +-+ /* Write keymap source (xkbfile) to memory buffer `xkbKeyMapBuf', +-+ of which SHA1 is generated and used as result xkm file name */ +-+ memset(xkbKeyMapBuf, 0, sizeof(xkbKeyMapBuf)); +-+ out = fmemopen(xkbKeyMapBuf, sizeof(xkbKeyMapBuf), "w"); +-+ if (NULL == out) { +-+ ErrorF("[xkb] Open xkbKeyMapBuf for writing failed\n"); +-+ return False; +-+ } +-+ ret = XkbWriteXKBKeymapForNames(out, names, xkb, want, need); +-+ if (fclose(out) !=0) +-+ { +-+ ErrorF("[xkb] XkbWriteXKBKeymapForNames error, perhaps xkbKeyMapBuf is too small\n"); +-+ return False; +-+ } +-+#ifdef DEBUG +-+ if (xkbDebugFlags) { +-+ ErrorF("[xkb] XkbDDXCompileKeymapByNames compiling keymap:\n"); +-+ fputs(xkbKeyMapBuf, stderr); +-+ } +-+#endif +-+ if (!ret) { +-+ ErrorF("[xkb] Generating XKB Keymap failed, giving up compiling keymap\n"); +-+ return False; +-+ } +-+ +-+ DebugF("[xkb] computing SHA1 of keymap\n"); +-+ if (Success == Sha1Asc(sha1Asc, xkbKeyMapBuf)) { +-+ snprintf(xkmfile, sizeof(xkmfile), "server-%s", sha1Asc); +-+ } +-+ else { +-+ ErrorF("[xkb] Computing SHA1 of keymap failed, " +-+ "using display name instead as xkm file name\n"); +-+ snprintf(xkmfile, sizeof(xkmfile), "server-%s", display); +-+ } +- +-- XkbEnsureSafeMapName(keymap); +-+ // XkbEnsureSafeMapName(keymap); +- OutputDirectory(xkm_output_dir, sizeof(xkm_output_dir)); +- +-+ /* set nameRtrn, fail if it's too small */ +-+ if ((strlen(xkmfile)+1 > nameRtrnLen) && nameRtrn) { +-+ ErrorF("[xkb] nameRtrn too small to hold xkmfile name\n"); +-+ return False; +-+ } +-+ strncpy(nameRtrn, xkmfile, nameRtrnLen); +-+ +-+ /* if the xkm file already exists, reuse it */ +-+ canonicalXkmFileName = Xprintf("%s%s.xkm", xkm_output_dir, xkmfile); +-+ if (access(canonicalXkmFileName, R_OK) == 0) { +-+ /* yes, we can reuse the old xkm file */ +-+ LogMessage(X_INFO, "XKB: reuse xkmfile %s\n", canonicalXkmFileName); +-+ result = True; +-+ goto _ret; +-+ } +-+ LogMessage(X_INFO, "XKB: generating xkmfile %s\n", canonicalXkmFileName); +-+ +-+ /* continue to call xkbcomp to compile the keymap. to avoid race +-+ condition, we compile it to a tmpfile then rename it to +-+ xkmfile */ +-+ +- #ifdef WIN32 +- strcpy(tmpname, Win32TempDir()); +- strcat(tmpname, "\\xkb_XXXXXX"); +-@@ -230,19 +323,30 @@ +- } +- } +- +-+ if ( (tmpXkmFile = tempnam(xkm_output_dir, NULL)) == NULL ) { +-+ ErrorF("[xkb] Can't generate temp xkm file name"); +-+ result = False; +-+ goto _ret; +-+ } +-+ +- buf = Xprintf("\"%s%sxkbcomp\" -w %d %s -xkm \"%s\" " +-- "-em1 %s -emp %s -eml %s \"%s%s.xkm\"", +-+ "-em1 %s -emp %s -eml %s \"%s\"", +- xkbbindir, xkbbindirsep, +- ( (xkbDebugFlags < 2) ? 1 : +- ((xkbDebugFlags > 10) ? 10 : (int)xkbDebugFlags) ), +-- xkbbasedirflag, xkmfile, +-+ xkbbasedirflag, xkbfile, +- PRE_ERROR_MSG, ERROR_PREFIX, POST_ERROR_MSG1, +-- xkm_output_dir, keymap); +-+ tmpXkmFile); +- +- if (xkbbasedirflag != emptystring) { +- xfree(xkbbasedirflag); +- } +- +-+ /* there's a potential race condition between calling tempnam() +-+ and invoking xkbcomp to write the result file (potential temp +-+ file name conflicts), but since xkbcomp is a standalone +-+ program, we have to live with this */ +-+ +- #ifndef WIN32 +- out= Popen(buf,"w"); +- #else +-@@ -250,31 +354,43 @@ +- #endif +- +- if (out!=NULL) { +--#ifdef DEBUG +-- if (xkbDebugFlags) { +-- ErrorF("[xkb] XkbDDXCompileKeymapByNames compiling keymap:\n"); +-- XkbWriteXKBKeymapForNames(stderr,names,xkb,want,need); +-+ /* write XKBKeyMapBuf to xkbcomp */ +-+ if (EOF==fputs(xkbKeyMapBuf, out)) +-+ { +-+ ErrorF("[xkb] Sending keymap to xkbcomp failed\n"); +-+ result = False; +-+ goto _ret; +- } +--#endif +-- XkbWriteXKBKeymapForNames(out,names,xkb,want,need); +- #ifndef WIN32 +- if (Pclose(out)==0) +- #else +- if (fclose(out)==0 && System(buf) >= 0) +- #endif +- { +-+ /* xkbcomp success */ +- if (xkbDebugFlags) +- DebugF("[xkb] xkb executes: %s\n",buf); +-- if (nameRtrn) { +-- strncpy(nameRtrn,keymap,nameRtrnLen); +-- nameRtrn[nameRtrnLen-1]= '\0'; +-+ +-+ /* if canonicalXkmFileName already exists now, we simply +-+ overwrite it, this is OK */ +-+ ret = rename(tmpXkmFile, canonicalXkmFileName); +-+ if (0 != ret) { +-+ ErrorF("[xkb] Can't rename %s to %s, error: %s\n", +-+ tmpXkmFile, canonicalXkmFileName, +-+ strerror(errno)); +-+ +-+ /* in case of error, don't unlink tmpXkmFile, leave it +-+ for debugging */ +-+ +-+ result = False; +-+ goto _ret; +- } +-- if (buf != NULL) +-- xfree (buf); +-- return True; +-+ +-+ result = True; +-+ goto _ret; +- } +- else +-- LogMessage(X_ERROR, "Error compiling keymap (%s)\n", keymap); +-+ LogMessage(X_ERROR, "Error compiling keymap (%s)\n", xkbfile); +- #ifdef WIN32 +- /* remove the temporary file */ +- unlink(tmpname); +-@@ -289,9 +405,17 @@ +- } +- if (nameRtrn) +- nameRtrn[0]= '\0'; +-+ result = False; +-+ +-+_ret: +-+ if (tmpXkmFile) +-+ free(tmpXkmFile); +-+ if (canonicalXkmFileName) +-+ xfree(canonicalXkmFileName); +- if (buf != NULL) +- xfree (buf); +-- return False; +-+ +-+ return result; +- } +- +- static FILE * +-@@ -375,7 +499,6 @@ +- DebugF("Loaded XKB keymap %s, defined=0x%x\n",fileName,(*xkbRtrn)->defined); +- } +- fclose(file); +-- (void) unlink (fileName); +- return (need|want)&(~missing); +- } +- +-diff -Naur xorg-server-20090727/xkb/README.compiled xorg-server-20090727.patch/xkb/README.compiled +---- xorg-server-20090727/xkb/README.compiled 2009-07-26 16:15:37.000000000 +0200 +-+++ xorg-server-20090727.patch/xkb/README.compiled 2009-08-08 20:29:17.059354234 +0200 +-@@ -4,10 +4,10 @@ +- or some other tool might destroy or replace the files in this directory, +- so it is not a safe place to store compiled keymaps for long periods of +- time. The default keymap for any server is usually stored in: +-- X<num>-default.xkm +--where <num> is the display number of the server in question, which makes +--it possible for several servers *on the same host* to share the same +--directory. +-+ server-<SHA1>.xkm +-+ +-+where <SHA1> is the SHA1 hash of keymap source, so that compiled +-+keymap of different keymap sources are stored in different files. +- +- Unless the X server is modified, sharing this directory between servers on +- different hosts could cause problems. +---- xorg-server-20090727/xkb/ddxLoad.c 2009-07-26 16:15:37.000000000 +0200 +-+++ xorg-server-20090727.patch/xkb/ddxLoad.c 2009-08-08 20:48:46.504353541 +0200 +-@@ -32,11 +32,10 @@ +- #include <xkb-config.h> +- #endif +- +--#ifdef HAVE_SHA1_IN_LIBMD /* Use libmd for SHA1 */ +--# include <sha1.h> +-+#ifdef HAVE_SHA1_IN_LIBGCRYPT /* Use libgcrypt for SHA1 */ +-+# include <gcrypt.h> +- #else /* Use OpenSSL's libcrypto */ +--# include <stddef.h> /* buggy openssl/sha.h wants size_t */ +--# include <openssl/sha.h> +-+#warning "xkbcomp caching support disabled" +- #endif +- +- #include <stdio.h> +-@@ -174,40 +173,37 @@ +- } +- } +- +-+#ifndef SHA_DIGEST_LENGTH +-+#define SHA_DIGEST_LENGTH 20 +-+#endif +-+ +- static Bool +- Sha1Asc(char sha1Asc[SHA_DIGEST_LENGTH*2+1], const char * input) +- { +- int i; +- unsigned char sha1[SHA_DIGEST_LENGTH]; +- +--#ifdef HAVE_SHA1_IN_LIBMD /* Use libmd for SHA1 */ +-- SHA1_CTX ctx; +-- +-- SHA1Init (&ctx); +-- SHA1Update (&ctx, input, strlen(input)); +-- SHA1Final (sha1, &ctx); +--#else /* Use OpenSSL's libcrypto */ +-- SHA_CTX ctx; +-- int success; +-- +-- success = SHA1_Init (&ctx); +-- if (! success) +-- return BadAlloc; +-- +-- success = SHA1_Update (&ctx, input, strlen(input)); +-- if (! success) +-- return BadAlloc; +-+#ifdef HAVE_SHA1_IN_LIBGCRYPT /* Use libgcrypt for SHA1 */ +-+ static int init; +-+ gcry_md_hd_t h; +-+ gcry_error_t err; +-+ +-+ if (!init) { +-+ if (!gcry_check_version(NULL)) +-+ return BadAlloc; +-+ gcry_control(GCRYCTL_DISABLE_SECMEM, 0); +-+ gcry_control(GCRYCTL_INITIALIZATION_FINISHED, 0); +-+ init = 1; +-+ } +- +-- success = SHA1_Final (sha1, &ctx); +-- if (! success) +-+ err = gcry_md_open(&h, GCRY_MD_SHA1, 0); +-+ if (err) +- return BadAlloc; +-+ gcry_md_write(h, input, strlen(input)); +-+ memcpy(sha1, gcry_md_read(h, GCRY_MD_SHA1), 20); +-+ gcry_md_close(h); +- #endif +- +-- /* convert sha1 to sha1_asc */ +-- for(i=0; i<SHA_DIGEST_LENGTH; ++i) { +-- sprintf(sha1Asc+i*2, "%02X", sha1[i]); +-- } +-- +- return Success; +- } +- +---- xorg-server-20090727/xkb/ddxLoad.c +-+++ xorg-server-20090727.patch/xkb/ddxLoad.c +-@@ -204,6 +204,11 @@ +- gcry_md_close(h); +- #endif +- +-+ /* convert sha1 to sha1_asc */ +-+ for(i=0; i<SHA_DIGEST_LENGTH; ++i) { +-+ sprintf(sha1Asc+i*2, "%02X", sha1[i]); +-+ } +-+ +- return Success; +- } +- +diff --git a/xkb/README.compiled b/xkb/README.compiled +index 71caa2f..a4a2ae0 100644 +--- a/xkb/README.compiled ++++ b/xkb/README.compiled +@@ -4,10 +4,10 @@ current keymap and/or any scratch keymaps used by clients. The X server + or some other tool might destroy or replace the files in this directory, + so it is not a safe place to store compiled keymaps for long periods of + time. The default keymap for any server is usually stored in: +- X<num>-default.xkm +-where <num> is the display number of the server in question, which makes +-it possible for several servers *on the same host* to share the same +-directory. ++ server-<SHA1>.xkm ++ ++where <SHA1> is the SHA1 hash of keymap source, so that compiled ++keymap of different keymap sources are stored in different files. + + Unless the X server is modified, sharing this directory between servers on + different hosts could cause problems. +diff --git a/xkb/ddxLoad.c b/xkb/ddxLoad.c +index ba8d50b..4076f6b 100644 +--- a/xkb/ddxLoad.c ++++ b/xkb/ddxLoad.c +@@ -32,6 +32,12 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE. + #include <xkb-config.h> + #endif + ++#ifdef HAVE_SHA1_IN_LIBGCRYPT /* Use libgcrypt for SHA1 */ ++# include <gcrypt.h> ++#else /* Use OpenSSL's libcrypto */ ++#warning "xkbcomp caching support disabled" ++#endif ++ + #include <stdio.h> + #include <ctype.h> + #include <X11/X.h> +@@ -45,24 +51,13 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE. + #define XKBSRV_NEED_FILE_FUNCS + #include <xkbsrv.h> + #include <X11/extensions/XI.h> ++#include <errno.h> + #include "xkb.h" + + #if defined(CSRG_BASED) || defined(linux) || defined(__GNU__) + #include <paths.h> + #endif + +- /* +- * If XKM_OUTPUT_DIR specifies a path without a leading slash, it is +- * relative to the top-level XKB configuration directory. +- * Making the server write to a subdirectory of that directory +- * requires some work in the general case (install procedure +- * has to create links to /var or somesuch on many machines), +- * so we just compile into /usr/tmp for now. +- */ +-#ifndef XKM_OUTPUT_DIR +-#define XKM_OUTPUT_DIR "compiled/" +-#endif +- + #define PRE_ERROR_MSG "\"The XKEYBOARD keymap compiler (xkbcomp) reports:\"" + #define ERROR_PREFIX "\"> \"" + #define POST_ERROR_MSG1 "\"Errors from xkbcomp are not fatal to the X server\"" +@@ -177,6 +172,47 @@ OutputDirectory( + } + + static Bool ++#ifndef SHA_DIGEST_LENGTH ++#define SHA_DIGEST_LENGTH 20 ++#endif ++ ++static Bool ++Sha1Asc(char sha1Asc[SHA_DIGEST_LENGTH*2+1], const char * input) ++{ ++ int i; ++ unsigned char sha1[SHA_DIGEST_LENGTH]; ++ ++#ifdef HAVE_SHA1_IN_LIBGCRYPT /* Use libgcrypt for SHA1 */ ++ static int init; ++ gcry_md_hd_t h; ++ gcry_error_t err; ++ ++ if (!init) { ++ if (!gcry_check_version(NULL)) ++ return BadAlloc; ++ gcry_control(GCRYCTL_DISABLE_SECMEM, 0); ++ gcry_control(GCRYCTL_INITIALIZATION_FINISHED, 0); ++ init = 1; ++ } ++ ++ err = gcry_md_open(&h, GCRY_MD_SHA1, 0); ++ if (err) ++ return BadAlloc; ++ gcry_md_write(h, input, strlen(input)); ++ memcpy(sha1, gcry_md_read(h, GCRY_MD_SHA1), 20); ++ gcry_md_close(h); ++#endif ++ ++ /* convert sha1 to sha1_asc */ ++ for(i=0; i<SHA_DIGEST_LENGTH; ++i) { ++ sprintf(sha1Asc+i*2, "%02X", sha1[i]); ++ } ++ ++ return Success; ++} ++ ++/* call xkbcomp and compile XKB keymap, return xkm file name in ++ nameRtrn */ + XkbDDXCompileKeymapByNames( XkbDescPtr xkb, + XkbComponentNamesPtr names, + unsigned want, +@@ -185,7 +221,11 @@ XkbDDXCompileKeymapByNames( XkbDescPtr xkb, + int nameRtrnLen) + { + FILE * out; +- char *buf = NULL, keymap[PATH_MAX], xkm_output_dir[PATH_MAX]; ++ char * buf = NULL, xkmfile[PATH_MAX], xkm_output_dir[PATH_MAX]; ++ char * tmpXkmFile = NULL; ++ char * canonicalXkmFileName = NULL; ++ char sha1Asc[SHA_DIGEST_LENGTH*2+1], xkbKeyMapBuf[100*1024]; ++ int ret, result; + + const char *emptystring = ""; + const char *xkbbasedirflag = emptystring; +@@ -196,15 +236,69 @@ XkbDDXCompileKeymapByNames( XkbDescPtr xkb, + /* WIN32 has no popen. The input must be stored in a file which is + used as input for xkbcomp. xkbcomp does not read from stdin. */ + char tmpname[PATH_MAX]; +- const char *xkmfile = tmpname; ++ const char *xkbfile = tmpname; + #else +- const char *xkmfile = "-"; ++ const char *xkbfile = "-"; ++#endif ++ ++ /* Write keymap source (xkbfile) to memory buffer `xkbKeyMapBuf', ++ of which SHA1 is generated and used as result xkm file name */ ++ memset(xkbKeyMapBuf, 0, sizeof(xkbKeyMapBuf)); ++ out = fmemopen(xkbKeyMapBuf, sizeof(xkbKeyMapBuf), "w"); ++ if (NULL == out) { ++ ErrorF("[xkb] Open xkbKeyMapBuf for writing failed\n"); ++ return False; ++ } ++ ret = XkbWriteXKBKeymapForNames(out, names, xkb, want, need); ++ if (fclose(out) !=0) ++ { ++ ErrorF("[xkb] XkbWriteXKBKeymapForNames error, perhaps xkbKeyMapBuf is too small\n"); ++ return False; ++ } ++#ifdef DEBUG ++ if (xkbDebugFlags) { ++ ErrorF("[xkb] XkbDDXCompileKeymapByNames compiling keymap:\n"); ++ fputs(xkbKeyMapBuf, stderr); ++ } + #endif ++ if (!ret) { ++ ErrorF("[xkb] Generating XKB Keymap failed, giving up compiling keymap\n"); ++ return False; ++ } + +- snprintf(keymap, sizeof(keymap), "server-%s", display); ++ DebugF("[xkb] computing SHA1 of keymap\n"); ++ if (Success == Sha1Asc(sha1Asc, xkbKeyMapBuf)) { ++ snprintf(xkmfile, sizeof(xkmfile), "server-%s", sha1Asc); ++ } ++ else { ++ ErrorF("[xkb] Computing SHA1 of keymap failed, " ++ "using display name instead as xkm file name\n"); ++ snprintf(xkmfile, sizeof(xkmfile), "server-%s", display); ++ } + + OutputDirectory(xkm_output_dir, sizeof(xkm_output_dir)); + ++ /* set nameRtrn, fail if it's too small */ ++ if ((strlen(xkmfile)+1 > nameRtrnLen) && nameRtrn) { ++ ErrorF("[xkb] nameRtrn too small to hold xkmfile name\n"); ++ return False; ++ } ++ strncpy(nameRtrn, xkmfile, nameRtrnLen); ++ ++ /* if the xkm file already exists, reuse it */ ++ canonicalXkmFileName = Xprintf("%s%s.xkm", xkm_output_dir, xkmfile); ++ if (access(canonicalXkmFileName, R_OK) == 0) { ++ /* yes, we can reuse the old xkm file */ ++ LogMessage(X_INFO, "XKB: reuse xkmfile %s\n", canonicalXkmFileName); ++ result = True; ++ goto _ret; ++ } ++ LogMessage(X_INFO, "XKB: generating xkmfile %s\n", canonicalXkmFileName); ++ ++ /* continue to call xkbcomp to compile the keymap. to avoid race ++ condition, we compile it to a tmpfile then rename it to ++ xkmfile */ ++ + #ifdef WIN32 + strcpy(tmpname, Win32TempDir()); + strcat(tmpname, "\\xkb_XXXXXX"); +@@ -227,19 +321,30 @@ XkbDDXCompileKeymapByNames( XkbDescPtr xkb, + } + } + ++ if ( (tmpXkmFile = tempnam(xkm_output_dir, NULL)) == NULL ) { ++ ErrorF("[xkb] Can't generate temp xkm file name"); ++ result = False; ++ goto _ret; ++ } ++ + buf = Xprintf("\"%s%sxkbcomp\" -w %d %s -xkm \"%s\" " +- "-em1 %s -emp %s -eml %s \"%s%s.xkm\"", ++ "-em1 %s -emp %s -eml %s \"%s\"", + xkbbindir, xkbbindirsep, + ( (xkbDebugFlags < 2) ? 1 : + ((xkbDebugFlags > 10) ? 10 : (int)xkbDebugFlags) ), +- xkbbasedirflag, xkmfile, ++ xkbbasedirflag, xkbfile, + PRE_ERROR_MSG, ERROR_PREFIX, POST_ERROR_MSG1, +- xkm_output_dir, keymap); ++ tmpXkmFile); + + if (xkbbasedirflag != emptystring) { + xfree(xkbbasedirflag); + } + ++ /* there's a potential race condition between calling tempnam() ++ and invoking xkbcomp to write the result file (potential temp ++ file name conflicts), but since xkbcomp is a standalone ++ program, we have to live with this */ ++ + #ifndef WIN32 + out= Popen(buf,"w"); + #else +@@ -247,31 +352,43 @@ XkbDDXCompileKeymapByNames( XkbDescPtr xkb, + #endif + + if (out!=NULL) { +-#ifdef DEBUG +- if (xkbDebugFlags) { +- ErrorF("[xkb] XkbDDXCompileKeymapByNames compiling keymap:\n"); +- XkbWriteXKBKeymapForNames(stderr,names,xkb,want,need); ++ /* write XKBKeyMapBuf to xkbcomp */ ++ if (EOF==fputs(xkbKeyMapBuf, out)) ++ { ++ ErrorF("[xkb] Sending keymap to xkbcomp failed\n"); ++ result = False; ++ goto _ret; + } +-#endif +- XkbWriteXKBKeymapForNames(out,names,xkb,want,need); + #ifndef WIN32 + if (Pclose(out)==0) + #else + if (fclose(out)==0 && System(buf) >= 0) + #endif + { ++ /* xkbcomp success */ + if (xkbDebugFlags) + DebugF("[xkb] xkb executes: %s\n",buf); +- if (nameRtrn) { +- strncpy(nameRtrn,keymap,nameRtrnLen); +- nameRtrn[nameRtrnLen-1]= '\0'; ++ ++ /* if canonicalXkmFileName already exists now, we simply ++ overwrite it, this is OK */ ++ ret = rename(tmpXkmFile, canonicalXkmFileName); ++ if (0 != ret) { ++ ErrorF("[xkb] Can't rename %s to %s, error: %s\n", ++ tmpXkmFile, canonicalXkmFileName, ++ strerror(errno)); ++ ++ /* in case of error, don't unlink tmpXkmFile, leave it ++ for debugging */ ++ ++ result = False; ++ goto _ret; + } +- if (buf != NULL) +- xfree (buf); +- return True; ++ ++ result = True; ++ goto _ret; + } + else +- LogMessage(X_ERROR, "Error compiling keymap (%s)\n", keymap); ++ LogMessage(X_ERROR, "Error compiling keymap (%s)\n", xkbfile); + #ifdef WIN32 + /* remove the temporary file */ + unlink(tmpname); +@@ -286,9 +403,17 @@ XkbDDXCompileKeymapByNames( XkbDescPtr xkb, + } + if (nameRtrn) + nameRtrn[0]= '\0'; ++ result = False; ++ ++_ret: ++ if (tmpXkmFile) ++ free(tmpXkmFile); ++ if (canonicalXkmFileName) ++ xfree(canonicalXkmFileName); + if (buf != NULL) + xfree (buf); +- return False; ++ ++ return result; + } + + static FILE * +@@ -372,7 +497,6 @@ unsigned missing; + DebugF("Loaded XKB keymap %s, defined=0x%x\n",fileName,(*xkbRtrn)->defined); + } + fclose(file); +- (void) unlink (fileName); + return (need|want)&(~missing); + } + diff --git a/debian/patches/series b/debian/patches/series index cf6c761..d3f3eae 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -30,4 +30,4 @@ 187_edid_quirk_hp_nc8430.patch 188_default_primary_to_first_busid.patch 189_xserver_1.5.0_bg_none_root.patch -#190_cache-xkbcomp_output_for_fast_start_up.patch +190_cache-xkbcomp_output_for_fast_start_up.patch -- To UNSUBSCRIBE, email to debian-x-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org