Skip to content

Commit fa1fec8

Browse files
committed
MDEV-30732 : wsrep_store_key_val_for_row() may invoke memcpy() on nullptr
Problem was that row_mysql_read_blob_ref can return NULL in case when blob datatype is used in a key and its real value is NULL. This NULL pointer is then used in memcpy function in wsrep_store_key_val_for_row. However, memcpy is defined so that argument 2 must not be NULL. Fixed by adding conditions before memcpy functions so that argument 2 is always non NULL. Additional fixes after review - Removed unnecessary copying key data from one buffer to another. Use original key data buffer as input and temporary buffer as output. Extra output buffer is needed because strnxfrm might expand input buffer contents. - Removed unnecessary initialization of variables and move declaration where first time needed. - Removed unnecessary intitialization of temporary buffer because we already keep track actual filled length. - Remove unneccessary extra call to charset->strnxfrm
1 parent 509557c commit fa1fec8

File tree

5 files changed

+291
-126
lines changed

5 files changed

+291
-126
lines changed
Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
connection node_2;
2+
connection node_1;
3+
SET GLOBAL sql_mode=0;
4+
SET sql_mode=DEFAULT;
5+
CREATE TABLE t (c INT,c2 BLOB,KEY k2 (c2 (1),c)) DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT;
6+
INSERT INTO t (c) VALUES (1),(1),(1),(1),(1);
7+
SELECT * FROM t;
8+
c c2
9+
1 NULL
10+
1 NULL
11+
1 NULL
12+
1 NULL
13+
1 NULL
14+
DROP TABLE t;
15+
CREATE TABLE t (c INT,c2 BLOB NOT NULL,KEY k2 (c2 (1),c)) DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT;
16+
INSERT INTO t (c) VALUES (1),(1),(1),(1),(1);
17+
Warnings:
18+
Warning 1364 Field 'c2' doesn't have a default value
19+
SELECT * FROM t;
20+
c c2
21+
1
22+
1
23+
1
24+
1
25+
1
26+
DROP TABLE t;
27+
CREATE TABLE t (c INT,c2 VARCHAR(270),KEY k2 (c2 (1),c)) DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT;
28+
INSERT INTO t (c) VALUES (1),(1),(1),(1),(1);
29+
SELECT * FROM t;
30+
c c2
31+
1 NULL
32+
1 NULL
33+
1 NULL
34+
1 NULL
35+
1 NULL
36+
DROP TABLE t;
37+
CREATE TABLE t (c INT,c2 VARCHAR(270) NOT NULL,KEY k2 (c2 (1),c)) DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT;
38+
INSERT INTO t (c) VALUES (1),(1),(1),(1),(1);
39+
Warnings:
40+
Warning 1364 Field 'c2' doesn't have a default value
41+
SELECT * FROM t;
42+
c c2
43+
1
44+
1
45+
1
46+
1
47+
1
48+
DROP TABLE t;
49+
CREATE TABLE t (c INT,c2 CHAR(80),KEY k2 (c2 (1),c)) DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT;
50+
INSERT INTO t (c) VALUES (1),(1),(1),(1),(1);
51+
SELECT * FROM t;
52+
c c2
53+
1 NULL
54+
1 NULL
55+
1 NULL
56+
1 NULL
57+
1 NULL
58+
DROP TABLE t;
59+
CREATE TABLE t (c INT,c2 CHAR(80) NOT NULL,KEY k2 (c2 (1),c)) DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT;
60+
INSERT INTO t (c) VALUES (1),(1),(1),(1),(1);
61+
Warnings:
62+
Warning 1364 Field 'c2' doesn't have a default value
63+
SELECT * FROM t;
64+
c c2
65+
1
66+
1
67+
1
68+
1
69+
1
70+
DROP TABLE t;
71+
CREATE TABLE t (c INT,c2 TEXT,KEY k2 (c2 (1),c)) DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT;
72+
INSERT INTO t (c) VALUES (1),(1),(1),(1),(1);
73+
SELECT * FROM t;
74+
c c2
75+
1 NULL
76+
1 NULL
77+
1 NULL
78+
1 NULL
79+
1 NULL
80+
DROP TABLE t;
81+
CREATE TABLE t (c INT,c2 TEXT NOT NULL,KEY k2 (c2 (1),c)) DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT;
82+
INSERT INTO t (c) VALUES (1),(1),(1),(1),(1);
83+
Warnings:
84+
Warning 1364 Field 'c2' doesn't have a default value
85+
SELECT * FROM t;
86+
c c2
87+
1
88+
1
89+
1
90+
1
91+
1
92+
DROP TABLE t;
93+
SET GLOBAL sql_mode=DEFAULT;
94+
CREATE TABLE t (c INT,c2 BLOB,KEY k2 (c2 (1),c)) DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT;
95+
INSERT INTO t (c) VALUES (1),(1),(1),(1),(1);
96+
SELECT * FROM t;
97+
c c2
98+
1 NULL
99+
1 NULL
100+
1 NULL
101+
1 NULL
102+
1 NULL
103+
DROP TABLE t;
104+
CREATE TABLE t (c INT,c2 VARCHAR(270),KEY k2 (c2 (1),c)) DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT;
105+
INSERT INTO t (c) VALUES (1),(1),(1),(1),(1);
106+
SELECT * FROM t;
107+
c c2
108+
1 NULL
109+
1 NULL
110+
1 NULL
111+
1 NULL
112+
1 NULL
113+
DROP TABLE t;
114+
CREATE TABLE t (c INT,c2 CHAR(80),KEY k2 (c2 (1),c)) DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT;
115+
INSERT INTO t (c) VALUES (1),(1),(1),(1),(1);
116+
SELECT * FROM t;
117+
c c2
118+
1 NULL
119+
1 NULL
120+
1 NULL
121+
1 NULL
122+
1 NULL
123+
DROP TABLE t;
124+
CREATE TABLE t (c INT,c2 TEXT,KEY k2 (c2 (1),c)) DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT;
125+
INSERT INTO t (c) VALUES (1),(1),(1),(1),(1);
126+
SELECT * FROM t;
127+
c c2
128+
1 NULL
129+
1 NULL
130+
1 NULL
131+
1 NULL
132+
1 NULL
133+
DROP TABLE t;
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
--source include/galera_cluster.inc
2+
3+
SET GLOBAL sql_mode=0;
4+
SET sql_mode=DEFAULT;
5+
CREATE TABLE t (c INT,c2 BLOB,KEY k2 (c2 (1),c)) DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT;
6+
INSERT INTO t (c) VALUES (1),(1),(1),(1),(1);
7+
SELECT * FROM t;
8+
DROP TABLE t;
9+
CREATE TABLE t (c INT,c2 BLOB NOT NULL,KEY k2 (c2 (1),c)) DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT;
10+
INSERT INTO t (c) VALUES (1),(1),(1),(1),(1);
11+
SELECT * FROM t;
12+
DROP TABLE t;
13+
CREATE TABLE t (c INT,c2 VARCHAR(270),KEY k2 (c2 (1),c)) DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT;
14+
INSERT INTO t (c) VALUES (1),(1),(1),(1),(1);
15+
SELECT * FROM t;
16+
DROP TABLE t;
17+
CREATE TABLE t (c INT,c2 VARCHAR(270) NOT NULL,KEY k2 (c2 (1),c)) DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT;
18+
INSERT INTO t (c) VALUES (1),(1),(1),(1),(1);
19+
SELECT * FROM t;
20+
DROP TABLE t;
21+
CREATE TABLE t (c INT,c2 CHAR(80),KEY k2 (c2 (1),c)) DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT;
22+
INSERT INTO t (c) VALUES (1),(1),(1),(1),(1);
23+
SELECT * FROM t;
24+
DROP TABLE t;
25+
CREATE TABLE t (c INT,c2 CHAR(80) NOT NULL,KEY k2 (c2 (1),c)) DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT;
26+
INSERT INTO t (c) VALUES (1),(1),(1),(1),(1);
27+
SELECT * FROM t;
28+
DROP TABLE t;
29+
CREATE TABLE t (c INT,c2 TEXT,KEY k2 (c2 (1),c)) DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT;
30+
INSERT INTO t (c) VALUES (1),(1),(1),(1),(1);
31+
SELECT * FROM t;
32+
DROP TABLE t;
33+
CREATE TABLE t (c INT,c2 TEXT NOT NULL,KEY k2 (c2 (1),c)) DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT;
34+
INSERT INTO t (c) VALUES (1),(1),(1),(1),(1);
35+
SELECT * FROM t;
36+
DROP TABLE t;
37+
38+
SET GLOBAL sql_mode=DEFAULT;
39+
40+
CREATE TABLE t (c INT,c2 BLOB,KEY k2 (c2 (1),c)) DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT;
41+
INSERT INTO t (c) VALUES (1),(1),(1),(1),(1);
42+
SELECT * FROM t;
43+
DROP TABLE t;
44+
CREATE TABLE t (c INT,c2 VARCHAR(270),KEY k2 (c2 (1),c)) DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT;
45+
INSERT INTO t (c) VALUES (1),(1),(1),(1),(1);
46+
SELECT * FROM t;
47+
DROP TABLE t;
48+
CREATE TABLE t (c INT,c2 CHAR(80),KEY k2 (c2 (1),c)) DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT;
49+
INSERT INTO t (c) VALUES (1),(1),(1),(1),(1);
50+
SELECT * FROM t;
51+
DROP TABLE t;
52+
CREATE TABLE t (c INT,c2 TEXT,KEY k2 (c2 (1),c)) DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT;
53+
INSERT INTO t (c) VALUES (1),(1),(1),(1),(1);
54+
SELECT * FROM t;
55+
DROP TABLE t;

0 commit comments

Comments
 (0)