The problem is caused by Unicode code points in keymap files, which were made possible (and have to be used) for many locales after the introduction of Unicode support with vt(4). Am 28.08.2014 um 19:43 schrieb Stefan Esser:> Am 28.08.2014 um 17:03 schrieb Filippo Moretti via freebsd-stable: >> I have problem with xorg with my custom kernel both with and without VT supports. >> I can still reboot with generic and have xorg work.My system:FreeBSD sting 10.0-STABLE FreeBSD 10.0-STABLE #0 r269789: Mon Aug 11 02:47:02 UTC 2014 root at grind.freebsd.org:/usr/obj/usr/src/sys/GENERIC i386 >> With my kernel-vt I get a sementation fault,while with SC I got a complete crash > [...] >> [ 3434.354] (**) Option "Protocol" "standard" >> [ 3434.354] (WW) Option "Device" requires an string value >> [ 3434.354] (**) Option "XkbRules" "base" >> [ 3434.354] (**) Option "XkbModel" "pc105" >> [ 3434.354] (**) Option "XkbLayout" "us" >> [ 3434.354] (**) Option "config_info" "hal:/org/freedesktop/Hal/devices/usb_device_46d_c517_noserial_if0" >> [ 3434.354] (II) XINPUT: Adding extended input device "USB Receiver" (type: KEYBOARD, id 7) >> [ 3434.354] Segmentation fault at address 0x2a3da760 >> [ 3434.354] >> Fatal server error: >> [ 3434.354] Caught signal 11 (Segmentation fault). Server aborting >> [ 3434.354] >> [ 3434.355] >> Please consult the The X.Org Foundation support >> at http://wiki.x.org >> for help. >> [ 3434.355] Please also check the log file at "/var/log/Xorg.0.log" for additional information. > > Just a me-to, but on -CURRENT: > > [ 357.752] (**) Keyboard0: always reports core events > [ 357.752] (**) Option "Protocol" "standard" > [ 357.752] (**) Option "XkbRules" "xorg" > [ 357.752] (**) Option "XkbModel" "pc105" > [ 357.752] (**) Option "XkbLayout" "de" > [ 357.752] (**) Option "XkbVariant" "nodeadkeys" > [ 357.752] (II) XINPUT: Adding extended input device "Keyboard0" > (type: KEYBOARD, id 7) > [ 357.752] Segmentation fault at address 0x80500ae80 > [ 357.752] > Fatal server error: > [ 357.752] Caught signal 11 (Segmentation fault). Server abortingFurther information: I used ktrace to identify the failing operation. It is in x11-drivers/xf86-input-keyboard line 1265 of bsd_KeyMap.c: #define KD_GET_ENTRY(i,n) \ eascii_to_x[((keymap.key[i].spcl << (n+1)) & 0x100) + keymap.key[i].map[n]] [...] void KbdGetMapping (InputInfoPtr pInfo, KeySymsPtr pKeySyms, CARD8 *pModMap) { KbdDevPtr pKbd = (KbdDevPtr) pInfo->private; KeySym *k; int i; #ifndef __bsdi__ switch (pKbd->consType) { /* * XXX wscons has no GIO_KEYMAP */ #if (defined (SYSCONS_SUPPORT) || defined (PCVT_SUPPORT)) && defined(GIO_KEYMAP) case SYSCONS: case PCVT: { keymap_t keymap; if (ioctl(pInfo->fd, GIO_KEYMAP, &keymap) != -1) { for (i = 0; i < keymap.n_keys && i < NUM_KEYCODES; i++) if (remap[i]) { k = map + (remap[i] << 2); k[0] = KD_GET_ENTRY(i,0); /* non-shifed */ k[1] = KD_GET_ENTRY(i,1); /* shifted */ k[2] = KD_GET_ENTRY(i,4); /* alt */ k[3] = KD_GET_ENTRY(i,5); /* alt - shifted */ if (k[3] == k[2]) k[3] = NoSymbol; if (k[2] == k[1]) k[2] = NoSymbol; if (k[1] == k[0]) k[1] = NoSymbol; if (k[0] == k[2] && k[1] == k[3]) k[2] = k[3] = NoSymbol; } } } break; #endif /* SYSCONS || PCVT */ The keymap returned by ioctl(GIO_KEYMAP) used to contain characters in the selected locale, which meant it was limited to 8 bit values, effectively. Now with Unicode support, larger values (>=0x100) can be found in keymap files. In my case, the Euro symbol (0x20ac) was the cause of an out-of-bounds access to the keymap array in line 1265 of bsd_KbdMap.c (assignment to k[2] for Alt "E"). I did not have time to investigate, how this problem can be resolved, though. But I'll create a ports PR with this information, since it must be resolved before 10.1, or users of keyboard layouts that generate characters beyond u+ff will reliably crash the X server ... Regards, STefan PS: PR ports/193192
Ok, so what can we do right now to not have unicode characters in say, the US keymap file? (Just a local change, not committed anywhere - I agree it needs to be fixed in the xorg code.) -a
On 08/31/2014 08:53, Stefan Esser wrote:> The problem is caused by Unicode code points in keymap files, which were > made possible (and have to be used) for many locales after the > introduction of Unicode support with vt(4). > > Am 28.08.2014 um 19:43 schrieb Stefan Esser: >> Am 28.08.2014 um 17:03 schrieb Filippo Moretti via freebsd-stable: >>> I have problem with xorg with my custom kernel both with and without VT supports. >>> I can still reboot with generic and have xorg work.My system:FreeBSD sting 10.0-STABLE FreeBSD 10.0-STABLE #0 r269789: Mon Aug 11 02:47:02 UTC 2014 root at grind.freebsd.org:/usr/obj/usr/src/sys/GENERIC i386 >>> With my kernel-vt I get a sementation fault,while with SC I got a complete crash >> [...] >>> [ 3434.354] (**) Option "Protocol" "standard" >>> [ 3434.354] (WW) Option "Device" requires an string value >>> [ 3434.354] (**) Option "XkbRules" "base" >>> [ 3434.354] (**) Option "XkbModel" "pc105" >>> [ 3434.354] (**) Option "XkbLayout" "us" >>> [ 3434.354] (**) Option "config_info" "hal:/org/freedesktop/Hal/devices/usb_device_46d_c517_noserial_if0" >>> [ 3434.354] (II) XINPUT: Adding extended input device "USB Receiver" (type: KEYBOARD, id 7) >>> [ 3434.354] Segmentation fault at address 0x2a3da760 >>> [ 3434.354] >>> Fatal server error: >>> [ 3434.354] Caught signal 11 (Segmentation fault). Server aborting >>> [ 3434.354] >>> [ 3434.355] >>> Please consult the The X.Org Foundation support >>> at http://wiki.x.org >>> for help. >>> [ 3434.355] Please also check the log file at "/var/log/Xorg.0.log" for additional information. >> >> Just a me-to, but on -CURRENT: >> >> [ 357.752] (**) Keyboard0: always reports core events >> [ 357.752] (**) Option "Protocol" "standard" >> [ 357.752] (**) Option "XkbRules" "xorg" >> [ 357.752] (**) Option "XkbModel" "pc105" >> [ 357.752] (**) Option "XkbLayout" "de" >> [ 357.752] (**) Option "XkbVariant" "nodeadkeys" >> [ 357.752] (II) XINPUT: Adding extended input device "Keyboard0" >> (type: KEYBOARD, id 7) >> [ 357.752] Segmentation fault at address 0x80500ae80 >> [ 357.752] >> Fatal server error: >> [ 357.752] Caught signal 11 (Segmentation fault). Server aborting > > Further information: I used ktrace to identify the failing operation. > It is in x11-drivers/xf86-input-keyboard line 1265 of bsd_KeyMap.c: > > #define KD_GET_ENTRY(i,n) \ > eascii_to_x[((keymap.key[i].spcl << (n+1)) & 0x100) + > keymap.key[i].map[n]] > > [...] > > void > KbdGetMapping (InputInfoPtr pInfo, KeySymsPtr pKeySyms, CARD8 *pModMap) > { > KbdDevPtr pKbd = (KbdDevPtr) pInfo->private; > KeySym *k; > int i; > > #ifndef __bsdi__ > switch (pKbd->consType) { > > /* > * XXX wscons has no GIO_KEYMAP > */ > #if (defined (SYSCONS_SUPPORT) || defined (PCVT_SUPPORT)) && > defined(GIO_KEYMAP) > case SYSCONS: > case PCVT: > { > keymap_t keymap; > > if (ioctl(pInfo->fd, GIO_KEYMAP, &keymap) != -1) { > for (i = 0; i < keymap.n_keys && i < NUM_KEYCODES; i++) > if (remap[i]) { > k = map + (remap[i] << 2); > k[0] = KD_GET_ENTRY(i,0); /* non-shifed */ > k[1] = KD_GET_ENTRY(i,1); /* shifted */ > k[2] = KD_GET_ENTRY(i,4); /* alt */ > k[3] = KD_GET_ENTRY(i,5); /* alt - shifted */ > if (k[3] == k[2]) k[3] = NoSymbol; > if (k[2] == k[1]) k[2] = NoSymbol; > if (k[1] == k[0]) k[1] = NoSymbol; > if (k[0] == k[2] && k[1] == k[3]) > k[2] = k[3] = NoSymbol; > } > } > } > break; > #endif /* SYSCONS || PCVT */ > > The keymap returned by ioctl(GIO_KEYMAP) used to contain characters > in the selected locale, which meant it was limited to 8 bit values, > effectively. > > Now with Unicode support, larger values (>=0x100) can be found in > keymap files. In my case, the Euro symbol (0x20ac) was the cause > of an out-of-bounds access to the keymap array in line 1265 of > bsd_KbdMap.c (assignment to k[2] for Alt "E"). > > I did not have time to investigate, how this problem can be > resolved, though. > > But I'll create a ports PR with this information, since it must be > resolved before 10.1, or users of keyboard layouts that generate > characters beyond u+ff will reliably crash the X server ... > > Regards, STefan > > PS: PR ports/193192I have already done PR/191459, with a patch to be added to x11-drivers/xf86-input-keyboard (thanks Thierry Thomas to restoring it). The last contribution by ray@ is totally irrelevant - in fact the same problem appears with syscons + TEKEN_UTF8 Claude Buisson
I discovered that: * if I don't load kbdmap at boot-time as a module, the probe order works in a way that xorg works; * if I load kbdmap by hand after boot, or I don't load it at all, then even the US keyboard map causes xorg to choke. If I load kbdmap at boot-time then kbdcontrol reports inappropriate ioctl for device. -a _______________________________________________ freebsd-stable@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-stable To unsubscribe, send any mail to "freebsd-stable-unsubscribe@freebsd.org"