diff options
Diffstat (limited to 'src/microhttpd/daemon.c')
-rw-r--r-- | src/microhttpd/daemon.c | 24 |
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; |