summaryrefslogtreecommitdiff
path: root/vio
diff options
context:
space:
mode:
authorMarko Mäkelä <marko.makela@mariadb.com>2020-07-31 18:09:08 +0300
committerMarko Mäkelä <marko.makela@mariadb.com>2020-07-31 18:09:08 +0300
commit9216114ce729733e6b0c4ce952bfdf57595ff387 (patch)
tree7a541ed87a6a8174d3d94c5f780724a34e08dc1c /vio
parentdc513dff911d72eaaf9f752f390fef8d1ef9a4b0 (diff)
parent66ec3a770f7854f500ece66c78f3c87c9cd6da15 (diff)
downloadmariadb-git-9216114ce729733e6b0c4ce952bfdf57595ff387.tar.gz
Merge 10.3 into 10.4
Diffstat (limited to 'vio')
-rw-r--r--vio/vio_priv.h1
-rw-r--r--vio/viopipe.c6
-rw-r--r--vio/viosocket.c29
3 files changed, 27 insertions, 9 deletions
diff --git a/vio/vio_priv.h b/vio/vio_priv.h
index 9b68624a811..3a0f826e7e8 100644
--- a/vio/vio_priv.h
+++ b/vio/vio_priv.h
@@ -33,6 +33,7 @@ my_bool vio_is_connected_pipe(Vio *vio);
int vio_close_pipe(Vio * vio);
int cancel_io(HANDLE handle, DWORD thread_id);
int vio_shutdown_pipe(Vio *vio,int how);
+uint vio_pending_pipe(Vio* vio);
#endif
diff --git a/vio/viopipe.c b/vio/viopipe.c
index 6db0944d8df..567884807fe 100644
--- a/vio/viopipe.c
+++ b/vio/viopipe.c
@@ -140,5 +140,11 @@ int vio_close_pipe(Vio *vio)
DBUG_RETURN(ret);
}
+/* return number of bytes readable from pipe.*/
+uint vio_pending_pipe(Vio *vio)
+{
+ DWORD bytes;
+ return PeekNamedPipe(vio->hPipe, NULL, 0, NULL, &bytes, NULL) ? bytes : 0;
+}
#endif
diff --git a/vio/viosocket.c b/vio/viosocket.c
index aedcf01b455..0820176371d 100644
--- a/vio/viosocket.c
+++ b/vio/viosocket.c
@@ -1232,7 +1232,6 @@ my_bool vio_is_connected(Vio *vio)
DBUG_RETURN(bytes ? TRUE : FALSE);
}
-#ifndef DBUG_OFF
/**
Number of bytes in the read or socket buffer
@@ -1251,22 +1250,34 @@ ssize_t vio_pending(Vio *vio)
return vio->read_end - vio->read_pos;
/* Skip non-socket based transport types. */
- if (vio->type == VIO_TYPE_TCPIP || vio->type == VIO_TYPE_SOCKET)
+ switch (vio->type)
{
+ case VIO_TYPE_TCPIP:
+ /* fallthrough */
+ case VIO_TYPE_SOCKET:
/* Obtain number of readable bytes in the socket buffer. */
if (socket_peek_read(vio, &bytes))
return -1;
- }
+ return bytes;
- /*
- SSL not checked due to a yaSSL bug in SSL_pending that
- causes it to attempt to read from the socket.
- */
+ case VIO_TYPE_SSL:
+ bytes= (uint) SSL_pending(vio->ssl_arg);
+ if (bytes)
+ return bytes;
+ if (socket_peek_read(vio, &bytes))
+ return -1;
+ return bytes;
- return (ssize_t) bytes;
+#ifdef _WIN32
+ case VIO_TYPE_NAMEDPIPE:
+ bytes= vio_pending_pipe(vio);
+ return bytes;
+#endif
+ default:
+ return -1;
+ }
}
-#endif /* DBUG_OFF */
/**
Checks if the error code, returned by vio_getnameinfo(), means it was the