@@ -798,23 +798,26 @@ relay_server_msg_cb(int fd, int what, void *v)
798798 } else
799799#endif
800800 {
801+ ssize_t n ;
802+
801803 sudo_debug_printf (SUDO_DEBUG_INFO ,
802804 "%s: ServerMessage from relay %s (%s)" , __func__ ,
803805 relay_closure -> relay_name .name , relay_closure -> relay_name .ipaddr );
804- nread = (size_t )read (fd , buf -> data + buf -> len , buf -> size - buf -> len );
806+ n = read (fd , buf -> data + buf -> len , buf -> size - buf -> len );
807+ if (n < 0 ) {
808+ if (errno == EAGAIN || errno == EINTR )
809+ debug_return ;
810+ sudo_warn ("%s: read" , relay_closure -> relay_name .ipaddr );
811+ closure -> errstr = _ ("error reading from relay" );
812+ goto send_error ;
813+ }
814+ nread = (size_t )n ;
805815 }
806816
807817 sudo_debug_printf (SUDO_DEBUG_INFO ,
808818 "%s: received %zd bytes from relay %s (%s)" , __func__ , nread ,
809819 relay_closure -> relay_name .name , relay_closure -> relay_name .ipaddr );
810- switch (nread ) {
811- case (size_t )-1 :
812- if (errno == EAGAIN || errno == EINTR )
813- debug_return ;
814- sudo_warn ("%s: read" , relay_closure -> relay_name .ipaddr );
815- closure -> errstr = _ ("unable to read from relay" );
816- goto send_error ;
817- case 0 :
820+ if (nread == 0 ) {
818821 /* EOF from relay server, close the socket. */
819822 shutdown (relay_closure -> sock , SHUT_RDWR );
820823 close (relay_closure -> sock );
@@ -833,8 +836,11 @@ relay_server_msg_cb(int fd, int what, void *v)
833836 if (closure -> sock == -1 )
834837 connection_close (closure );
835838 debug_return ;
836- default :
837- break ;
839+ }
840+ if (nread > SIZE_MAX - buf -> len ) {
841+ sudo_warnx (U_ ("internal error, %s overflow" ), __func__ );
842+ closure -> errstr = _ ("error reading from relay" );
843+ goto send_error ;
838844 }
839845 buf -> len += nread ;
840846
@@ -979,14 +985,20 @@ relay_client_msg_cb(int fd, int what, void *v)
979985 } else
980986#endif
981987 {
982- nwritten = ( size_t ) write (fd , buf -> data + buf -> off , buf -> len - buf -> off );
983- if (nwritten == ( size_t ) -1 ) {
988+ const ssize_t n = write (fd , buf -> data + buf -> off , buf -> len - buf -> off );
989+ if (n < 0 ) {
984990 if (errno == EAGAIN || errno == EINTR )
985991 debug_return ;
986992 sudo_warn ("%s: write" , relay_closure -> relay_name .ipaddr );
987993 closure -> errstr = _ ("error writing to relay" );
988994 goto send_error ;
989995 }
996+ nwritten = (size_t )n ;
997+ }
998+ if (nwritten > SIZE_MAX - buf -> off ) {
999+ sudo_warnx (U_ ("internal error, %s overflow" ), __func__ );
1000+ closure -> errstr = _ ("error writing to relay" );
1001+ goto send_error ;
9901002 }
9911003 buf -> off += nwritten ;
9921004
0 commit comments