Skip to content

Commit 12a363a

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.
1 parent 509557c commit 12a363a

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)