Skip to content

Commit 3995de0

Browse files
grooverdanvuvova
authored andcommitted
MDEV-36341 UBSAN: FederatedX fill_server runtime error: applying non-zero offset to null pointer
UBSAN is nuanced around null pointer additions, but there is no offset on schema, its the start of the server->key.
1 parent 13dd073 commit 3995de0

File tree

1 file changed

+11
-12
lines changed

1 file changed

+11
-12
lines changed

storage/federatedx/ha_federatedx.cc

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1489,34 +1489,33 @@ static void fill_server(MEM_ROOT *mem_root, FEDERATEDX_SERVER *server,
14891489
sizeof(int) + 8);
14901490
key.append(scheme);
14911491
key.q_append('\0');
1492-
server->hostname= (const char *) (intptr) key.length();
1492+
size_t hostname_pos= key.length();
14931493
key.append(hostname);
14941494
key.q_append('\0');
1495-
server->database= (const char *) (intptr) key.length();
1495+
size_t database_pos= key.length();
14961496
key.append(database);
14971497
key.q_append('\0');
14981498
key.q_append((uint32) share->port);
1499-
server->socket= (const char *) (intptr) key.length();
1499+
size_t socket_pos= key.length();
15001500
key.append(socket);
15011501
key.q_append('\0');
1502-
server->username= (const char *) (intptr) key.length();
1502+
size_t username_pos= key.length();
15031503
key.append(username);
15041504
key.q_append('\0');
1505-
server->password= (const char *) (intptr) key.length();
1505+
size_t password_pos= key.length();
15061506
key.append(password);
15071507
key.c_ptr_safe(); // Ensure we have end \0
15081508

15091509
server->key_length= key.length();
15101510
/* Copy and add end \0 */
15111511
server->key= (uchar *) strmake_root(mem_root, key.ptr(), key.length());
15121512

1513-
/* pointer magic */
1514-
server->scheme+= (intptr) server->key;
1515-
server->hostname+= (intptr) server->key;
1516-
server->database+= (intptr) server->key;
1517-
server->username+= (intptr) server->key;
1518-
server->password+= (intptr) server->key;
1519-
server->socket+= (intptr) server->key;
1513+
server->scheme= (const char *)server->key;
1514+
server->hostname= (const char *)server->key + hostname_pos;
1515+
server->database= (const char *)server->key + database_pos;
1516+
server->username= (const char *)server->key + username_pos;
1517+
server->password= (const char *)server->key + password_pos;
1518+
server->socket= (const char*)server->key + socket_pos;
15201519
server->port= share->port;
15211520

15221521
if (!share->socket)

0 commit comments

Comments
 (0)