diff --git a/src/xkbcomp/scanner.c b/src/xkbcomp/scanner.c index 57babbb20..8bff375df 100644 --- a/src/xkbcomp/scanner.c +++ b/src/xkbcomp/scanner.c @@ -199,6 +199,11 @@ XkbParseString(struct xkb_context *ctx, const char *string, size_t len, { struct scanner scanner; scanner_init(&scanner, ctx, string, len, file_name, NULL); + + /* Skip UTF-8 encoded BOM (U+FEFF) */ + /* See: https://www.unicode.org/faq/utf_bom.html#bom5 */ + scanner_str(&scanner, "\xef\xbb\xbf", 3); + return parse(ctx, &scanner, map); } diff --git a/test/buffercomp.c b/test/buffercomp.c index 9a7603654..b9b5e9d8d 100644 --- a/test/buffercomp.c +++ b/test/buffercomp.c @@ -78,6 +78,18 @@ main(int argc, char *argv[]) keymap = test_compile_buffer(ctx, "", 0); assert(!keymap); + /* Accept UTF-8 encoded BOM (U+FEFF) */ + const char *bom = + "\xef\xbb\xbfxkb_keymap {" + " xkb_keycodes { include \"evdev\" };" + " xkb_types { include \"complete\" };" + " xkb_compat { include \"complete\" };" + " xkb_symbols { include \"pc\" };" + "};"; + keymap = test_compile_buffer(ctx, bom, strlen(bom)); + assert(keymap); + xkb_keymap_unref(keymap); + /* Make sure we can recompile our output for a normal keymap from rules. */ keymap = test_compile_rules(ctx, NULL, NULL, "ru,ca,de,us", ",multix,neo,intl", NULL);