From db918ea2b0d6d03688cef9d6b8d318774b9efec2 Mon Sep 17 00:00:00 2001 From: Julien Cristau Date: Sat, 26 Jul 2008 15:35:42 +0200 Subject: [PATCH 1/5] xfree86: use xorg.conf input devices if there is no ServerLayout If xorg.conf has no ServerLayout section, use the first mouse and keyboard sections as core devices, even with AllowEmptyInput. (cherry picked from commit 2eaed4a10fe5bf727579bca4ab8d4a47c8763a7d) --- hw/xfree86/common/xf86Config.c | 86 ++++++++++++++++++---------------- 1 file changed, 46 insertions(+), 40 deletions(-) diff --git a/hw/xfree86/common/xf86Config.c b/hw/xfree86/common/xf86Config.c index 3021cb7cc..a1c2e3464 100644 --- a/hw/xfree86/common/xf86Config.c +++ b/hw/xfree86/common/xf86Config.c @@ -1324,7 +1324,7 @@ checkCoreInputDevices(serverLayoutPtr servlayoutp, Bool implicitLayout) } /* 3. First core pointer device. */ - if (!foundPointer) { + if (!foundPointer && (!xf86Info.allowEmptyInput || implicitLayout)) { XF86ConfInputPtr p; for (p = xf86configptr->conf_input_lst; p; p = p->list.next) { @@ -1340,7 +1340,7 @@ checkCoreInputDevices(serverLayoutPtr servlayoutp, Bool implicitLayout) } /* 4. First pointer with 'mouse' as the driver. */ - if (!foundPointer) { + if (!foundPointer && (!xf86Info.allowEmptyInput || implicitLayout)) { confInput = xf86findInput(CONF_IMPLICIT_POINTER, xf86configptr->conf_input_lst); if (!confInput) { @@ -1355,7 +1355,7 @@ checkCoreInputDevices(serverLayoutPtr servlayoutp, Bool implicitLayout) } /* 5. Built-in default. */ - if (!foundPointer) { + if (!foundPointer && !xf86Info.allowEmptyInput) { bzero(&defPtr, sizeof(defPtr)); defPtr.inp_identifier = strdup(""); defPtr.inp_driver = strdup("mouse"); @@ -1382,9 +1382,13 @@ checkCoreInputDevices(serverLayoutPtr servlayoutp, Bool implicitLayout) } if (!foundPointer) { - /* This shouldn't happen. */ - xf86Msg(X_ERROR, "Cannot locate a core pointer device.\n"); - return FALSE; + if (!xf86Info.allowEmptyInput) { + /* This shouldn't happen. */ + xf86Msg(X_ERROR, "Cannot locate a core pointer device.\n"); + return FALSE; + } else { + xf86Msg(X_INFO, "Cannot locate a core pointer device.\n"); + } } /* @@ -1401,7 +1405,7 @@ checkCoreInputDevices(serverLayoutPtr servlayoutp, Bool implicitLayout) found = 1; break; } } - if (!found) { + if (!found && !xf86Info.allowEmptyInput) { xf86Msg(X_INFO, "No default mouse found, adding one\n"); bzero(&defPtr, sizeof(defPtr)); defPtr.inp_identifier = strdup(""); @@ -1460,7 +1464,7 @@ checkCoreInputDevices(serverLayoutPtr servlayoutp, Bool implicitLayout) } /* 3. First core keyboard device. */ - if (!foundKeyboard) { + if (!foundKeyboard && (!xf86Info.allowEmptyInput || implicitLayout)) { XF86ConfInputPtr p; for (p = xf86configptr->conf_input_lst; p; p = p->list.next) { @@ -1476,7 +1480,7 @@ checkCoreInputDevices(serverLayoutPtr servlayoutp, Bool implicitLayout) } /* 4. First keyboard with 'keyboard' or 'kbd' as the driver. */ - if (!foundKeyboard) { + if (!foundKeyboard && (!xf86Info.allowEmptyInput || implicitLayout)) { confInput = xf86findInput(CONF_IMPLICIT_KEYBOARD, xf86configptr->conf_input_lst); if (!confInput) { @@ -1491,7 +1495,7 @@ checkCoreInputDevices(serverLayoutPtr servlayoutp, Bool implicitLayout) } /* 5. Built-in default. */ - if (!foundKeyboard) { + if (!foundKeyboard && !xf86Info.allowEmptyInput) { bzero(&defKbd, sizeof(defKbd)); defKbd.inp_identifier = strdup(""); defKbd.inp_driver = strdup("kbd"); @@ -1518,21 +1522,39 @@ checkCoreInputDevices(serverLayoutPtr servlayoutp, Bool implicitLayout) } if (!foundKeyboard) { - /* This shouldn't happen. */ - xf86Msg(X_ERROR, "Cannot locate a core keyboard device.\n"); - return FALSE; + if (!xf86Info.allowEmptyInput) { + /* This shouldn't happen. */ + xf86Msg(X_ERROR, "Cannot locate a core keyboard device.\n"); + return FALSE; + } else { + xf86Msg(X_INFO, "Cannot locate a core keyboard device.\n"); + } } if (pointerMsg) { - xf86Msg(X_DEFAULT, "The core pointer device wasn't specified " - "explicitly in the layout.\n" - "\tUsing the %s.\n", pointerMsg); + if (implicitLayout) + xf86Msg(X_DEFAULT, "No Layout section. Using the %s.\n", + pointerMsg); + else + xf86Msg(X_DEFAULT, "The core pointer device wasn't specified " + "explicitly in the layout.\n" + "\tUsing the %s.\n", pointerMsg); } if (keyboardMsg) { - xf86Msg(X_DEFAULT, "The core keyboard device wasn't specified " - "explicitly in the layout.\n" - "\tUsing the %s.\n", keyboardMsg); + if (implicitLayout) + xf86Msg(X_DEFAULT, "No Layout section. Using the %s.\n", + keyboardMsg); + else + xf86Msg(X_DEFAULT, "The core keyboard device wasn't specified " + "explicitly in the layout.\n" + "\tUsing the %s.\n", keyboardMsg); + } + + if (xf86Info.allowEmptyInput && !(foundPointer && foundKeyboard)) { + xf86Msg(X_INFO, "The server relies on HAL to provide the list of " + "input devices.\n\tIf no devices become available, " + "reconfigure HAL or disable AllowEmptyInput.\n"); } return TRUE; @@ -2457,26 +2479,8 @@ addDefaultModes(MonPtr monitorp) } static void -checkInput(serverLayoutPtr layout) { - if (!xf86Info.allowEmptyInput) - checkCoreInputDevices(layout, FALSE); - else - { - xf86Msg(X_INFO, "AllowEmptyInput is on.\n" - "\tThe server relies on HAL to provide the list of input " - "devices.\n\tIf no devices become available, reconfigure " - "HAL.\n"); - if (!layout->inputs || !*layout->inputs) - { - /* No input device specified in ServerLayout. */ - if (xf86configptr->conf_input_lst && - xf86configptr->conf_input_lst->inp_identifier) - xf86Msg(X_WARNING, "Input devices specified in xorg.conf, but" - " not referenced in ServerLayout.\n\tThese devices" - " will NOT be available.\n"); - } - - } +checkInput(serverLayoutPtr layout, Bool implicit_layout) { + checkCoreInputDevices(layout, implicit_layout); } /* @@ -2490,6 +2494,7 @@ xf86HandleConfigFile(Bool autoconfig) MessageType from = X_DEFAULT; char *scanptr; Bool singlecard = 0; + Bool implicit_layout = FALSE; if (!autoconfig) { if (getuid() == 0) @@ -2542,6 +2547,7 @@ xf86HandleConfigFile(Bool autoconfig) xf86Msg(X_ERROR, "Unable to determine the screen layout\n"); return CONFIG_PARSE_ERROR; } + implicit_layout = TRUE; } else { if (xf86configptr->conf_flags != NULL) { char *dfltlayout = NULL; @@ -2599,7 +2605,7 @@ xf86HandleConfigFile(Bool autoconfig) configDRI(xf86configptr->conf_dri); #endif - checkInput(&xf86ConfigLayout); + checkInput(&xf86ConfigLayout, implicit_layout); /* * Handle some command line options that can override some of the From 0788adb9a68af83614ee9d0758f30fa471feded8 Mon Sep 17 00:00:00 2001 From: Daniel Stone Date: Wed, 16 Jul 2008 03:00:25 +0300 Subject: [PATCH 2/5] HAL: Remove grotesque open-coded strcasestr Not only was this pretty ugly, but it didn't even work on systems without strcasestr anyway, due to the define not being in dix-config.h. Lack of strcasestr is handled transparently with the version from FreeBSD now anyway, so, huzzah. (cherry picked from commit b8dd07f855c555af56cbf0f69df799f424da2cca) --- config/hal.c | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/config/hal.c b/config/hal.c index 1d62a1de1..ac9e3d22a 100644 --- a/config/hal.c +++ b/config/hal.c @@ -262,17 +262,7 @@ device_added(LibHalContext *hal_ctx, const char *udi) * Since we can't predict the order in which the keys * arrive, we need to store them. */ -#ifndef HAVE_STRCASESTR - int psi_key_len = strlen(psi_key); - char *lower_psi_key = xalloc(psi_key_len + 1); - - CopyISOLatin1Lowered((unsigned char *) lower_psi_key, - (unsigned char *) psi_key, - psi_key_len); - if ((tmp = strstr(lower_psi_key, "xkb"))) -#else if ((tmp = strcasestr(psi_key, "xkb"))) -#endif { if (!strcasecmp(&tmp[3], "layout")) { @@ -301,9 +291,6 @@ device_added(LibHalContext *hal_ctx, const char *udi) add_option(&options, psi_key + sizeof(LIBHAL_PROP_KEY)-1, tmp_val); xfree(tmp_val); } -#ifndef HAVE_STRCASESTR - xfree(lower_psi_key); -#endif } } else if (!strncasecmp(psi_key, LIBHAL_XKB_PROP_KEY, sizeof(LIBHAL_XKB_PROP_KEY)-1)){ From 2f6b270e48ec7b9eb9ff8f98281308f50c081b63 Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Tue, 29 Jul 2008 12:59:57 +0930 Subject: [PATCH 3/5] config: add parsing for input.x11_options.XkbOptions. #16874 X.Org Bug 16874 (cherry picked from commit 35b14519b4a3158592a089170ec039bbc219603e) --- config/hal.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/config/hal.c b/config/hal.c index ac9e3d22a..e3cbcf99a 100644 --- a/config/hal.c +++ b/config/hal.c @@ -1,5 +1,6 @@ /* * Copyright © 2007 Daniel Stone + * Copyright © 2007 Red Hat, Inc. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), @@ -54,6 +55,7 @@ struct xkb_options { char* model; char* rules; char* variant; + char* options; }; @@ -284,6 +286,11 @@ device_added(LibHalContext *hal_ctx, const char *udi) if (xkb_opts.variant) xfree(xkb_opts.variant); xkb_opts.variant = strdup(tmp_val); + } else if (!strcasecmp(&tmp[3], "options")) + { + if (xkb_opts.options) + xfree(xkb_opts.options); + xkb_opts.options = strdup(tmp_val); } } else { @@ -318,6 +325,10 @@ device_added(LibHalContext *hal_ctx, const char *udi) { if (!xkb_opts.model) xkb_opts.model = strdup(tmp_val); + } else if (!strcasecmp(tmp, "options")) + { + if (!xkb_opts.options) + xkb_opts.options = strdup(tmp_val); } xfree(tmp_val); } @@ -338,6 +349,8 @@ device_added(LibHalContext *hal_ctx, const char *udi) add_option(&options, "xkb_variant", xkb_opts.variant); if (xkb_opts.model) add_option(&options, "xkb_model", xkb_opts.model); + if (xkb_opts.options) + add_option(&options, "xkb_options", xkb_opts.options); /* this isn't an error, but how else do you output something that the user can see? */ LogMessage(X_INFO, "config/hal: Adding input device %s\n", name); @@ -379,6 +392,8 @@ unwind: xfree(xkb_opts.model); if (xkb_opts.variant) xfree(xkb_opts.variant); + if (xkb_opts.options) + xfree(xkb_opts.options); dbus_error_free(&error); From 7d508f783c715d633df4f7f924523bd4e1724e08 Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Fri, 1 Aug 2008 14:24:54 +0930 Subject: [PATCH 4/5] config: support type strlist for XkbOptions property. For backwards compatibility with server 1.4. (cherry picked from commit 92c51b183c2ff06361dad7f918daed6577ba4935) --- config/hal.c | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/config/hal.c b/config/hal.c index e3cbcf99a..c60e23a0f 100644 --- a/config/hal.c +++ b/config/hal.c @@ -132,9 +132,6 @@ get_prop_string(LibHalContext *hal_ctx, const char *udi, const char *name) return ret; } -/* this function is no longer used... keep it here in case its needed in - * the future. */ -#if 0 static char * get_prop_string_array(LibHalContext *hal_ctx, const char *udi, const char *prop) { @@ -168,7 +165,6 @@ get_prop_string_array(LibHalContext *hal_ctx, const char *udi, const char *prop) return ret; } -#endif static void device_added(LibHalContext *hal_ctx, const char *udi) @@ -250,12 +246,12 @@ device_added(LibHalContext *hal_ctx, const char *udi) /* normal options first (input.x11_options.) */ if (!strncasecmp(psi_key, LIBHAL_PROP_KEY, sizeof(LIBHAL_PROP_KEY)-1)){ + char* tmp; /* only support strings for all values */ tmp_val = get_prop_string(hal_ctx, udi, psi_key); if (tmp_val){ - char* tmp; /* xkb needs special handling. HAL specs include * input.xkb.xyz options, but the x11-input.fdi specifies @@ -298,14 +294,25 @@ device_added(LibHalContext *hal_ctx, const char *udi) add_option(&options, psi_key + sizeof(LIBHAL_PROP_KEY)-1, tmp_val); xfree(tmp_val); } + } else + { + /* server 1.4 had xkb_options as strlist. */ + if ((tmp = strcasestr(psi_key, "xkb")) && + (!strcasecmp(&tmp[3], "options")) && + (tmp_val = get_prop_string_array(hal_ctx, udi, psi_key))) + { + if (xkb_opts.options) + xfree(xkb_opts.options); + xkb_opts.options = strdup(tmp_val); + } } } else if (!strncasecmp(psi_key, LIBHAL_XKB_PROP_KEY, sizeof(LIBHAL_XKB_PROP_KEY)-1)){ + char* tmp; /* only support strings for all values */ tmp_val = get_prop_string(hal_ctx, udi, psi_key); if (tmp_val){ - char* tmp; tmp = &psi_key[sizeof(LIBHAL_XKB_PROP_KEY) - 1]; @@ -331,6 +338,16 @@ device_added(LibHalContext *hal_ctx, const char *udi) xkb_opts.options = strdup(tmp_val); } xfree(tmp_val); + } else + { + /* server 1.4 had xkb options as strlist */ + tmp_val = get_prop_string_array(hal_ctx, udi, psi_key); + if (tmp_val) + { + tmp = &psi_key[sizeof(LIBHAL_XKB_PROP_KEY) - 1]; + if (!strcasecmp(tmp, ".options") && (!xkb_opts.options)) + xkb_opts.options = strdup(tmp_val); + } } } } From f7ee776de29b1cc23a3fd894a559c7d27ddd62af Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Fri, 1 Aug 2008 15:52:07 +0930 Subject: [PATCH 5/5] config: protect against potential out-of-bounds indexing. (cherry picked from commit 3c6a9c531f673b7a0cb9ca01860b4dbe79686363) --- config/hal.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/config/hal.c b/config/hal.c index c60e23a0f..0e0505b66 100644 --- a/config/hal.c +++ b/config/hal.c @@ -260,7 +260,7 @@ device_added(LibHalContext *hal_ctx, const char *udi) * Since we can't predict the order in which the keys * arrive, we need to store them. */ - if ((tmp = strcasestr(psi_key, "xkb"))) + if ((tmp = strcasestr(psi_key, "xkb")) && strlen(tmp) >= 4) { if (!strcasecmp(&tmp[3], "layout")) { @@ -298,6 +298,7 @@ device_added(LibHalContext *hal_ctx, const char *udi) { /* server 1.4 had xkb_options as strlist. */ if ((tmp = strcasestr(psi_key, "xkb")) && + (strlen(tmp) >= 4) && (!strcasecmp(&tmp[3], "options")) && (tmp_val = get_prop_string_array(hal_ctx, udi, psi_key))) { @@ -312,7 +313,7 @@ device_added(LibHalContext *hal_ctx, const char *udi) /* only support strings for all values */ tmp_val = get_prop_string(hal_ctx, udi, psi_key); - if (tmp_val){ + if (tmp_val && strlen(psi_key) >= sizeof(LIBHAL_XKB_PROP_KEY)) { tmp = &psi_key[sizeof(LIBHAL_XKB_PROP_KEY) - 1]; @@ -342,7 +343,7 @@ device_added(LibHalContext *hal_ctx, const char *udi) { /* server 1.4 had xkb options as strlist */ tmp_val = get_prop_string_array(hal_ctx, udi, psi_key); - if (tmp_val) + if (tmp_val && strlen(psi_key) >= sizeof(LIBHAL_XKB_PROP_KEY)) { tmp = &psi_key[sizeof(LIBHAL_XKB_PROP_KEY) - 1]; if (!strcasecmp(tmp, ".options") && (!xkb_opts.options))