summaryrefslogtreecommitdiff
path: root/vio/vio.c
diff options
context:
space:
mode:
authormsvensson@shellback.(none) <>2007-01-26 11:30:54 +0100
committermsvensson@shellback.(none) <>2007-01-26 11:30:54 +0100
commit1a3cf64fc9018ce3a60523234621afe36a3bbf41 (patch)
tree7eab9ac618ca44b112fcbcc3ff5fb92e0101be7b /vio/vio.c
parent645de0c5d7525b0481197e4f0a6f67f0f2c2785f (diff)
downloadmariadb-git-1a3cf64fc9018ce3a60523234621afe36a3bbf41.tar.gz
Bug#25203 Mysql crashes when mysql_kill() is executed in a connection using SSL
- It's too early to free the SSL object in 'vio_ssl_close'. There might still be a thread using or reading from it on platforms where we need to close the active connection/socket in order to break the read. - Add new function 'vio_ssl_delete' and install it as the viodelete function for SSL connections.
Diffstat (limited to 'vio/vio.c')
-rw-r--r--vio/vio.c19
1 files changed, 9 insertions, 10 deletions
diff --git a/vio/vio.c b/vio/vio.c
index 00b8964e30b..84b3e26fa52 100644
--- a/vio/vio.c
+++ b/vio/vio.c
@@ -86,7 +86,7 @@ static void vio_init(Vio* vio, enum enum_vio_type type,
#ifdef HAVE_OPENSSL
if (type == VIO_TYPE_SSL)
{
- vio->viodelete =vio_delete;
+ vio->viodelete =vio_ssl_delete;
vio->vioerrno =vio_errno;
vio->read =vio_ssl_read;
vio->write =vio_ssl_write;
@@ -220,17 +220,16 @@ Vio *vio_new_win32shared_memory(NET *net,HANDLE handle_file_map, HANDLE handle_m
#endif
#endif
+
void vio_delete(Vio* vio)
{
- /* It must be safe to delete null pointers. */
- /* This matches the semantics of C++'s delete operator. */
- if (vio)
- {
- if (vio->type != VIO_CLOSED)
- vio->vioclose(vio);
- my_free((gptr) vio->read_buffer, MYF(MY_ALLOW_ZERO_PTR));
- my_free((gptr) vio,MYF(0));
- }
+ if (!vio)
+ return; /* It must be safe to delete null pointers. */
+
+ if (vio->type != VIO_CLOSED)
+ vio->vioclose(vio);
+ my_free((gptr) vio->read_buffer, MYF(MY_ALLOW_ZERO_PTR));
+ my_free((gptr) vio,MYF(0));
}