diff options
author | Zoltán Böszörményi <zboszor@gmail.com> | 2025-10-02 12:48:46 +0200 |
---|---|---|
committer | Khem Raj <raj.khem@gmail.com> | 2025-10-02 10:17:29 -0700 |
commit | 90ed8e2bd5002d0f8227350b9bc16a30b9fbe1f6 (patch) | |
tree | a0907129e43152fb0bccacff12118079b820167b | |
parent | c5fdeca7196b82ebfbfd8783bd291431efba5320 (diff) | |
download | meta-openembedded-90ed8e2bd5002d0f8227350b9bc16a30b9fbe1f6.tar.gz |
mariadb: Fix a crash in my_convert()
In some cases (most notably when running mysqldump),
the server crashes in the my_convert() function, in
a code protected by
#if defined(__i386__) || defined(__x86_64__)
...
#endif
The crash does not happen with the generic code.
Remove the x86[-64] specific optimization.
This change was endorsed in
https://jira.mariadb.org/browse/MDEV-37786
Signed-off-by: Zoltán Böszörményi <zboszor@gmail.com>
Signed-off-by: Khem Raj <raj.khem@gmail.com>
-rw-r--r-- | meta-oe/recipes-dbs/mysql/mariadb.inc | 1 | ||||
-rw-r--r-- | meta-oe/recipes-dbs/mysql/mariadb/0001-Remove-x86-specific-loop-in-my_convert.patch | 93 |
2 files changed, 94 insertions, 0 deletions
diff --git a/meta-oe/recipes-dbs/mysql/mariadb.inc b/meta-oe/recipes-dbs/mysql/mariadb.inc index 13e55ebacd..67dd687c02 100644 --- a/meta-oe/recipes-dbs/mysql/mariadb.inc +++ b/meta-oe/recipes-dbs/mysql/mariadb.inc | |||
@@ -24,6 +24,7 @@ SRC_URI = "https://archive.mariadb.org/${BP}/source/${BP}.tar.gz \ | |||
24 | file://0001-Add-missing-includes-cstdint-and-cstdio.patch \ | 24 | file://0001-Add-missing-includes-cstdint-and-cstdio.patch \ |
25 | file://0001-Ensure-compatibility-with-ARMv9-by-updating-.arch-di.patch \ | 25 | file://0001-Ensure-compatibility-with-ARMv9-by-updating-.arch-di.patch \ |
26 | file://riscv32.patch \ | 26 | file://riscv32.patch \ |
27 | file://0001-Remove-x86-specific-loop-in-my_convert.patch \ | ||
27 | " | 28 | " |
28 | SRC_URI[sha256sum] = "1b26c0bb2d025dbfac3b9852d2b7eafda56a171b67ac2e27831ec0414fb7df07" | 29 | SRC_URI[sha256sum] = "1b26c0bb2d025dbfac3b9852d2b7eafda56a171b67ac2e27831ec0414fb7df07" |
29 | 30 | ||
diff --git a/meta-oe/recipes-dbs/mysql/mariadb/0001-Remove-x86-specific-loop-in-my_convert.patch b/meta-oe/recipes-dbs/mysql/mariadb/0001-Remove-x86-specific-loop-in-my_convert.patch new file mode 100644 index 0000000000..afcf4fe843 --- /dev/null +++ b/meta-oe/recipes-dbs/mysql/mariadb/0001-Remove-x86-specific-loop-in-my_convert.patch | |||
@@ -0,0 +1,93 @@ | |||
1 | From 79d2a95391abc133e86688696ae21628b7035b2d Mon Sep 17 00:00:00 2001 | ||
2 | From: =?UTF-8?q?Zolt=C3=A1n=20B=C3=B6sz=C3=B6rm=C3=A9nyi?= | ||
3 | <zboszor@gmail.com> | ||
4 | Date: Wed, 1 Oct 2025 09:29:04 +0200 | ||
5 | Subject: [PATCH] Remove x86 specific loop in my_convert() | ||
6 | MIME-Version: 1.0 | ||
7 | Content-Type: text/plain; charset=UTF-8 | ||
8 | Content-Transfer-Encoding: 8bit | ||
9 | |||
10 | mysqldump/mariadb-dump crashes with this backtrace: | ||
11 | |||
12 | | (gdb) bt | ||
13 | | #0 my_convert (to=<optimized out>, to_length=160, to_cs=0x55b5740fbda0 <my_charset_utf8mb4_general_ci>, from=<optimized out>, from_length=40, | ||
14 | | from_cs=0x55b57408bda0 <my_charset_utf8mb3_unicode_ci>, errors=0x7f950c35cd6c) at /usr/src/debug/mariadb/11.8.3/strings/ctype.c:1256 | ||
15 | | #1 0x000055b572d9f4a0 in copy_and_convert (to=0x7f94fc00c9db "Configuratiogicate_log\020automagicate_log\017is_done_message\017is_done_message", | ||
16 | | to_length=<optimized out>, to_cs=<optimized out>, from=0x7f94fc059f37 "Configuration downloading from portal...", from_length=40, from_cs=<optimized out>, | ||
17 | | errors=0x7f950c35cd6c) at /usr/src/debug/mariadb/11.8.3/sql/sql_string.h:53 | ||
18 | | #2 Protocol::net_store_data_cs (this=0x7f94fc001260, from=0x7f94fc059f37 "Configuration downloading from portal...", length=40, from_cs=<optimized out>, | ||
19 | | to_cs=<optimized out>) at /usr/src/debug/mariadb/11.8.3/sql/protocol.cc:114 | ||
20 | | #3 0x000055b572da103f in Protocol::send_result_set_row (this=this@entry=0x7f94fc001260, row_items=row_items@entry=0x7f94fc013418) | ||
21 | | at /usr/src/debug/mariadb/11.8.3/sql/protocol.cc:1359 | ||
22 | | #4 0x000055b572e19442 in select_send::send_data (this=0x7f94fc014f78, items=...) at /usr/src/debug/mariadb/11.8.3/sql/sql_class.cc:3294 | ||
23 | | #5 0x000055b572ef7c69 in select_result_sink::send_data_with_check (u=<optimized out>, sent=<optimized out>, this=<optimized out>, items=...) | ||
24 | | at /usr/src/debug/mariadb/11.8.3/sql/sql_class.h:6264 | ||
25 | | #6 select_result_sink::send_data_with_check (this=<optimized out>, items=..., u=<optimized out>, sent=<optimized out>) | ||
26 | | at /usr/src/debug/mariadb/11.8.3/sql/sql_class.h:6254 | ||
27 | | #7 end_send (join=<optimized out>, join_tab=<optimized out>, end_of_records=<optimized out>) at /usr/src/debug/mariadb/11.8.3/sql/sql_select.cc:25629 | ||
28 | | #8 0x000055b572ec38b6 in evaluate_join_record (join=join@entry=0x7f94fc014fa0, join_tab=join_tab@entry=0x7f94fc016940, error=error@entry=0) | ||
29 | | at /usr/src/debug/mariadb/11.8.3/sql/sql_select.cc:24523 | ||
30 | | #9 0x000055b572edcbf2 in sub_select (join=0x7f94fc014fa0, join_tab=0x7f94fc016940, end_of_records=<optimized out>) | ||
31 | | at /usr/src/debug/mariadb/11.8.3/sql/sql_select.cc:24290 | ||
32 | | #10 0x000055b572f119c6 in do_select (join=0x7f94fc014fa0, procedure=<optimized out>) at /usr/src/debug/mariadb/11.8.3/sql/sql_select.cc:23801 | ||
33 | | #11 JOIN::exec_inner (this=this@entry=0x7f94fc014fa0) at /usr/src/debug/mariadb/11.8.3/sql/sql_select.cc:5071 | ||
34 | | #12 0x000055b572f11d43 in JOIN::exec (this=this@entry=0x7f94fc014fa0) at /usr/src/debug/mariadb/11.8.3/sql/sql_select.cc:4859 | ||
35 | | #13 0x000055b572f0ffe6 in mysql_select (thd=thd@entry=0x7f94fc000cd8, tables=0x7f94fc013f38, fields=..., conds=0x0, og_num=0, order=0x0, group=0x0, having=0x0, | ||
36 | | proc_param=0x0, select_options=551922436864, result=0x7f94fc014f78, unit=0x7f94fc005038, select_lex=0x7f94fc013160) | ||
37 | | at /usr/src/debug/mariadb/11.8.3/sql/sql_select.cc:5387 | ||
38 | | #14 0x000055b572f107dd in handle_select (thd=thd@entry=0x7f94fc000cd8, lex=lex@entry=0x7f94fc004f58, result=result@entry=0x7f94fc014f78, | ||
39 | | setup_tables_done_option=setup_tables_done_option@entry=0) at /usr/src/debug/mariadb/11.8.3/sql/sql_select.cc:633 | ||
40 | | #15 0x000055b572e77d9e in execute_sqlcom_select (thd=thd@entry=0x7f94fc000cd8, all_tables=0x7f94fc013f38) at /usr/src/debug/mariadb/11.8.3/sql/sql_parse.cc:6190 | ||
41 | | #16 0x000055b572e877be in mysql_execute_command (thd=thd@entry=0x7f94fc000cd8, is_called_from_prepared_stmt=is_called_from_prepared_stmt@entry=false) | ||
42 | | at /usr/src/debug/mariadb/11.8.3/sql/sql_parse.cc:3975 | ||
43 | | #17 0x000055b572e88e03 in mysql_parse (thd=0x7f94fc000cd8, rawbuf=<optimized out>, length=<optimized out>, parser_state=<optimized out>) | ||
44 | | at /usr/src/debug/mariadb/11.8.3/sql/sql_parse.cc:7905 | ||
45 | | #18 0x000055b572e8b2a1 in dispatch_command (command=command@entry=COM_QUERY, thd=thd@entry=0x7f94fc000cd8, packet=packet@entry=0x7f94fc0088a9 "", | ||
46 | | packet_length=packet_length@entry=152, blocking=blocking@entry=true) at /usr/src/debug/mariadb/11.8.3/sql/sql_parse.cc:1903 | ||
47 | | #19 0x000055b572e8cf7c in do_command (thd=thd@entry=0x7f94fc000cd8, blocking=blocking@entry=true) at /usr/src/debug/mariadb/11.8.3/sql/sql_parse.cc:1416 | ||
48 | | #20 0x000055b572fcfc0d in do_handle_one_connection (connect=<optimized out>, put_in_cache=true) at /usr/src/debug/mariadb/11.8.3/sql/sql_connect.cc:1415 | ||
49 | | #21 0x000055b572fcffc5 in handle_one_connection (arg=arg@entry=0x55b57943cbd8) at /usr/src/debug/mariadb/11.8.3/sql/sql_connect.cc:1327 | ||
50 | | #22 0x000055b573382440 in pfs_spawn_thread (arg=0x55b5795eb598) at /usr/src/debug/mariadb/11.8.3/storage/perfschema/pfs.cc:2198 | ||
51 | | #23 0x00007f952e8571dd in start_thread (arg=<optimized out>) at pthread_create.c:448 | ||
52 | | #24 0x00007f952e8d318c in __GI___clone3 () at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:78 | ||
53 | |||
54 | See also: | ||
55 | https://jira.mariadb.org/browse/MDEV-37786 | ||
56 | https://jira.mariadb.org/browse/MDEV-37148 | ||
57 | |||
58 | Signed-off-by: Zoltán Böszörményi <zboszor@gmail.com> | ||
59 | Upstream-Status: Inappropriate [oe specific] | ||
60 | --- | ||
61 | strings/ctype.c | 16 ---------------- | ||
62 | 1 file changed, 16 deletions(-) | ||
63 | |||
64 | diff --git a/strings/ctype.c b/strings/ctype.c | ||
65 | index 629514e5e9c..d7e788c693b 100644 | ||
66 | --- a/strings/ctype.c | ||
67 | +++ b/strings/ctype.c | ||
68 | @@ -1243,22 +1243,6 @@ my_convert(char *to, uint32 to_length, CHARSET_INFO *to_cs, | ||
69 | |||
70 | length= length2= MY_MIN(to_length, from_length); | ||
71 | |||
72 | -#if defined(__i386__) || defined(__x86_64__) | ||
73 | - /* | ||
74 | - Special loop for i386, it allows to refer to a | ||
75 | - non-aligned memory block as UINT32, which makes | ||
76 | - it possible to copy four bytes at once. This | ||
77 | - gives about 10% performance improvement comparing | ||
78 | - to byte-by-byte loop. | ||
79 | - */ | ||
80 | - for ( ; length >= 4; length-= 4, from+= 4, to+= 4) | ||
81 | - { | ||
82 | - if ((*(uint32*)from) & 0x80808080) | ||
83 | - break; | ||
84 | - *((uint32*) to)= *((const uint32*) from); | ||
85 | - } | ||
86 | -#endif /* __i386__ */ | ||
87 | - | ||
88 | for (; ; *to++= *from++, length--) | ||
89 | { | ||
90 | if (!length) | ||
91 | -- | ||
92 | 2.51.0 | ||
93 | |||