aboutsummaryrefslogtreecommitdiff
path: root/src/microhttpd/daemon.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/microhttpd/daemon.c')
-rw-r--r--src/microhttpd/daemon.c24
1 files changed, 21 insertions, 3 deletions
diff --git a/src/microhttpd/daemon.c b/src/microhttpd/daemon.c
index 58bbebfc..0d952a35 100644
--- a/src/microhttpd/daemon.c
+++ b/src/microhttpd/daemon.c
@@ -1033,6 +1033,7 @@ recv_param_adapter (struct MHD_Connection *connection,
1033 size_t i) 1033 size_t i)
1034{ 1034{
1035 ssize_t ret; 1035 ssize_t ret;
1036 const size_t requested_size = i;
1036 1037
1037 if ( (MHD_INVALID_SOCKET == connection->socket_fd) || 1038 if ( (MHD_INVALID_SOCKET == connection->socket_fd) ||
1038 (MHD_CONNECTION_CLOSED == connection->state) ) 1039 (MHD_CONNECTION_CLOSED == connection->state) )
@@ -1040,9 +1041,17 @@ recv_param_adapter (struct MHD_Connection *connection,
1040 MHD_set_socket_errno_ (ENOTCONN); 1041 MHD_set_socket_errno_ (ENOTCONN);
1041 return -1; 1042 return -1;
1042 } 1043 }
1043 ret = recv (connection->socket_fd, other, i, MSG_NOSIGNAL); 1044#ifdef MHD_POSIX_SOCKETS
1045 if (i > SSIZE_MAX)
1046 i = SSIZE_MAX; /* return value limit */
1047#else /* MHD_WINSOCK_SOCKETS */
1048 if (i > INT_MAX)
1049 i = INT_MAX; /* return value limit */
1050#endif /* MHD_WINSOCK_SOCKETS */
1051
1052 ret = recv(connection->socket_fd, other, i, MSG_NOSIGNAL);
1044#if EPOLL_SUPPORT 1053#if EPOLL_SUPPORT
1045 if (ret < (ssize_t) i) 1054 if (0 > ret || requested_size > (size_t) ret)
1046 { 1055 {
1047 /* partial read --- no longer read-ready */ 1056 /* partial read --- no longer read-ready */
1048 connection->epoll_state &= ~MHD_EPOLL_STATE_READ_READY; 1057 connection->epoll_state &= ~MHD_EPOLL_STATE_READ_READY;
@@ -1066,6 +1075,7 @@ send_param_adapter (struct MHD_Connection *connection,
1066 size_t i) 1075 size_t i)
1067{ 1076{
1068 ssize_t ret; 1077 ssize_t ret;
1078 const size_t requested_size = i;
1069#if LINUX 1079#if LINUX
1070 MHD_socket fd; 1080 MHD_socket fd;
1071 off_t offset; 1081 off_t offset;
@@ -1078,6 +1088,14 @@ send_param_adapter (struct MHD_Connection *connection,
1078 MHD_set_socket_errno_ (ENOTCONN); 1088 MHD_set_socket_errno_ (ENOTCONN);
1079 return -1; 1089 return -1;
1080 } 1090 }
1091#ifdef MHD_POSIX_SOCKETS
1092 if (i > SSIZE_MAX)
1093 i = SSIZE_MAX; /* return value limit */
1094#else /* MHD_WINSOCK_SOCKETS */
1095 if (i > INT_MAX)
1096 i = INT_MAX; /* return value limit */
1097#endif /* MHD_WINSOCK_SOCKETS */
1098
1081 if (0 != (connection->daemon->options & MHD_USE_SSL)) 1099 if (0 != (connection->daemon->options & MHD_USE_SSL))
1082 return send (connection->socket_fd, other, i, MSG_NOSIGNAL); 1100 return send (connection->socket_fd, other, i, MSG_NOSIGNAL);
1083#if LINUX 1101#if LINUX
@@ -1118,7 +1136,7 @@ send_param_adapter (struct MHD_Connection *connection,
1118#endif 1136#endif
1119 ret = send (connection->socket_fd, other, i, MSG_NOSIGNAL); 1137 ret = send (connection->socket_fd, other, i, MSG_NOSIGNAL);
1120#if EPOLL_SUPPORT 1138#if EPOLL_SUPPORT
1121 if (ret < (ssize_t) i) 1139 if (0 > ret || requested_size > (size_t) ret)
1122 { 1140 {
1123 /* partial write --- no longer write-ready */ 1141 /* partial write --- no longer write-ready */
1124 connection->epoll_state &= ~MHD_EPOLL_STATE_WRITE_READY; 1142 connection->epoll_state &= ~MHD_EPOLL_STATE_WRITE_READY;