slirp updates
-----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEErr90SPq5RTpFUjkOsKUb9YyRecUFAllqCssACgkQsKUb9YyR ecVE6hAAlGPrzCgHJ1R6RzT+HHUPGgu99CiiVc6nyAtWBdBhVSt6rhlK90EPiYxL dEnM06M+hQ6o+K3SIHfb4MbKwck/L8QYSsp7L4SNF83uhdtJEXYtd7v1dbyznwVh WnCb8/gcNip7+dSd9w7LyZcMQt7RPH7M2YLZlq4u7qLpVoN1Nw4/+YKp6gwgG5M9 ByALG6X2ZR9hI7elYQmxLhb6Vi6oy47SVy1K9pYXi3igiYMTsdced+iE50mg1ML8 Oni70fDWW3SQVovmDLG0TB5XxwycYhZpf+4Fn8kc2QlhQraWlpFYNXU2J68vyR4w YXuKKMbp3aO3QBwcR9H0GtWRHARMRSo5sLDTNF34Oi3EDWqDi05OvfeWBhUKm/Sh RkRjBhqch5YTaYUhbRknTgvTxLLHRvffJenw0ATetduvtSJ6XNUDY/A2GDv6i5Be cLc9GsWQFKyAcDPUGRfeW586hIigB4DSewdL30r22djPQx3/88U9xjccwHMpFPHy wUNddOcUcCeTqEIPJl5j5uk4ehdkAYJljCq+3Ie9ruTPfhr5VS9phLbZLQfzvkYF ktBjQm2T9VX9qw4EgcubW43hgFfGOcg4jJJlBmXVRmdYb84V/cwH31eRnwJXhOiV iqwc6kaazeybWvHQIrmVfjD3fcTuFDq4+aORqgnRHbP+4+cjAn0= =o/qe -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/thibault/tags/samuel-thibault' into staging slirp updates # gpg: Signature made Sat 15 Jul 2017 13:30:03 BST # gpg: using RSA key 0xB0A51BF58C9179C5 # gpg: Good signature from "Samuel Thibault <samuel.thibault@aquilenet.fr>" # gpg: aka "Samuel Thibault <sthibault@debian.org>" # gpg: aka "Samuel Thibault <samuel.thibault@gnu.org>" # gpg: aka "Samuel Thibault <samuel.thibault@inria.fr>" # gpg: aka "Samuel Thibault <samuel.thibault@labri.fr>" # gpg: aka "Samuel Thibault <samuel.thibault@ens-lyon.org>" # gpg: aka "Samuel Thibault <samuel.thibault@u-bordeaux.fr>" # gpg: WARNING: This key is not certified with a trusted signature! # gpg: There is no indication that the signature belongs to the owner. # Primary key fingerprint: 900C B024 B679 31D4 0F82 304B D017 8C76 7D06 9EE6 # Subkey fingerprint: AEBF 7448 FAB9 453A 4552 390E B0A5 1BF5 8C91 79C5 * remotes/thibault/tags/samuel-thibault: slirp: Handle error returns from sosendoob() slirp: Handle error returns from slirp_send() in sosendoob() slirp: fork_exec(): Don't close() a negative number in fork_exec() slirp: use DIV_ROUND_UP Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
		
						commit
						acbaa0f4fd
					
				@ -57,9 +57,9 @@ static inline bool in6_equal_mach(const struct in6_addr *a,
 | 
				
			|||||||
                                  const struct in6_addr *b,
 | 
					                                  const struct in6_addr *b,
 | 
				
			||||||
                                  int prefix_len)
 | 
					                                  int prefix_len)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    if (memcmp(&(a->s6_addr[(prefix_len + 7) / 8]),
 | 
					    if (memcmp(&(a->s6_addr[DIV_ROUND_UP(prefix_len, 8)]),
 | 
				
			||||||
               &(b->s6_addr[(prefix_len + 7) / 8]),
 | 
					               &(b->s6_addr[DIV_ROUND_UP(prefix_len, 8)]),
 | 
				
			||||||
               16 - (prefix_len + 7) / 8) != 0) {
 | 
					               16 - DIV_ROUND_UP(prefix_len, 8)) != 0) {
 | 
				
			||||||
        return 0;
 | 
					        return 0;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -112,7 +112,9 @@ fork_exec(struct socket *so, const char *ex, int do_pty)
 | 
				
			|||||||
		    bind(s, (struct sockaddr *)&addr, addrlen) < 0 ||
 | 
							    bind(s, (struct sockaddr *)&addr, addrlen) < 0 ||
 | 
				
			||||||
		    listen(s, 1) < 0) {
 | 
							    listen(s, 1) < 0) {
 | 
				
			||||||
			error_report("Error: inet socket: %s", strerror(errno));
 | 
								error_report("Error: inet socket: %s", strerror(errno));
 | 
				
			||||||
 | 
								if (s >= 0) {
 | 
				
			||||||
			    closesocket(s);
 | 
								    closesocket(s);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			return 0;
 | 
								return 0;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
				
			|||||||
@ -91,7 +91,7 @@ sbappend(struct socket *so, struct mbuf *m)
 | 
				
			|||||||
	if (so->so_urgc) {
 | 
						if (so->so_urgc) {
 | 
				
			||||||
		sbappendsb(&so->so_rcv, m);
 | 
							sbappendsb(&so->so_rcv, m);
 | 
				
			||||||
		m_free(m);
 | 
							m_free(m);
 | 
				
			||||||
		sosendoob(so);
 | 
							(void)sosendoob(so);
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -345,34 +345,41 @@ sosendoob(struct socket *so)
 | 
				
			|||||||
	if (sb->sb_rptr < sb->sb_wptr) {
 | 
						if (sb->sb_rptr < sb->sb_wptr) {
 | 
				
			||||||
		/* We can send it directly */
 | 
							/* We can send it directly */
 | 
				
			||||||
		n = slirp_send(so, sb->sb_rptr, so->so_urgc, (MSG_OOB)); /* |MSG_DONTWAIT)); */
 | 
							n = slirp_send(so, sb->sb_rptr, so->so_urgc, (MSG_OOB)); /* |MSG_DONTWAIT)); */
 | 
				
			||||||
		so->so_urgc -= n;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		DEBUG_MISC((dfd, " --- sent %d bytes urgent data, %d urgent bytes left\n", n, so->so_urgc));
 | 
					 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		/*
 | 
							/*
 | 
				
			||||||
		 * Since there's no sendv or sendtov like writev,
 | 
							 * Since there's no sendv or sendtov like writev,
 | 
				
			||||||
		 * we must copy all data to a linear buffer then
 | 
							 * we must copy all data to a linear buffer then
 | 
				
			||||||
		 * send it all
 | 
							 * send it all
 | 
				
			||||||
		 */
 | 
							 */
 | 
				
			||||||
 | 
							uint32_t urgc = so->so_urgc;
 | 
				
			||||||
		len = (sb->sb_data + sb->sb_datalen) - sb->sb_rptr;
 | 
							len = (sb->sb_data + sb->sb_datalen) - sb->sb_rptr;
 | 
				
			||||||
		if (len > so->so_urgc) len = so->so_urgc;
 | 
							if (len > urgc) {
 | 
				
			||||||
 | 
								len = urgc;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		memcpy(buff, sb->sb_rptr, len);
 | 
							memcpy(buff, sb->sb_rptr, len);
 | 
				
			||||||
		so->so_urgc -= len;
 | 
							urgc -= len;
 | 
				
			||||||
		if (so->so_urgc) {
 | 
							if (urgc) {
 | 
				
			||||||
			n = sb->sb_wptr - sb->sb_data;
 | 
								n = sb->sb_wptr - sb->sb_data;
 | 
				
			||||||
			if (n > so->so_urgc) n = so->so_urgc;
 | 
								if (n > urgc) {
 | 
				
			||||||
 | 
									n = urgc;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
			memcpy((buff + len), sb->sb_data, n);
 | 
								memcpy((buff + len), sb->sb_data, n);
 | 
				
			||||||
			so->so_urgc -= n;
 | 
					 | 
				
			||||||
			len += n;
 | 
								len += n;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		n = slirp_send(so, buff, len, (MSG_OOB)); /* |MSG_DONTWAIT)); */
 | 
							n = slirp_send(so, buff, len, (MSG_OOB)); /* |MSG_DONTWAIT)); */
 | 
				
			||||||
#ifdef DEBUG
 | 
					 | 
				
			||||||
		if (n != len)
 | 
					 | 
				
			||||||
		   DEBUG_ERROR((dfd, "Didn't send all data urgently XXXXX\n"));
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
		DEBUG_MISC((dfd, " ---2 sent %d bytes urgent data, %d urgent bytes left\n", n, so->so_urgc));
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef DEBUG
 | 
				
			||||||
 | 
						if (n != len) {
 | 
				
			||||||
 | 
							DEBUG_ERROR((dfd, "Didn't send all data urgently XXXXX\n"));
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
						if (n < 0) {
 | 
				
			||||||
 | 
							return n;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						so->so_urgc -= n;
 | 
				
			||||||
 | 
						DEBUG_MISC((dfd, " ---2 sent %d bytes urgent data, %d urgent bytes left\n", n, so->so_urgc));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	sb->sb_cc -= n;
 | 
						sb->sb_cc -= n;
 | 
				
			||||||
	sb->sb_rptr += n;
 | 
						sb->sb_rptr += n;
 | 
				
			||||||
	if (sb->sb_rptr >= (sb->sb_data + sb->sb_datalen))
 | 
						if (sb->sb_rptr >= (sb->sb_data + sb->sb_datalen))
 | 
				
			||||||
@ -397,7 +404,15 @@ sowrite(struct socket *so)
 | 
				
			|||||||
	DEBUG_ARG("so = %p", so);
 | 
						DEBUG_ARG("so = %p", so);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (so->so_urgc) {
 | 
						if (so->so_urgc) {
 | 
				
			||||||
		sosendoob(so);
 | 
							uint32_t expected = so->so_urgc;
 | 
				
			||||||
 | 
							if (sosendoob(so) < expected) {
 | 
				
			||||||
 | 
								/* Treat a short write as a fatal error too,
 | 
				
			||||||
 | 
								 * rather than continuing on and sending the urgent
 | 
				
			||||||
 | 
								 * data as if it were non-urgent and leaving the
 | 
				
			||||||
 | 
								 * so_urgc count wrong.
 | 
				
			||||||
 | 
								 */
 | 
				
			||||||
 | 
								goto err_disconnected;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		if (sb->sb_cc == 0)
 | 
							if (sb->sb_cc == 0)
 | 
				
			||||||
			return 0;
 | 
								return 0;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@ -441,11 +456,7 @@ sowrite(struct socket *so)
 | 
				
			|||||||
		return 0;
 | 
							return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (nn <= 0) {
 | 
						if (nn <= 0) {
 | 
				
			||||||
		DEBUG_MISC((dfd, " --- sowrite disconnected, so->so_state = %x, errno = %d\n",
 | 
							goto err_disconnected;
 | 
				
			||||||
			so->so_state, errno));
 | 
					 | 
				
			||||||
		sofcantsendmore(so);
 | 
					 | 
				
			||||||
		tcp_sockclosed(sototcpcb(so));
 | 
					 | 
				
			||||||
		return -1;
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef HAVE_READV
 | 
					#ifndef HAVE_READV
 | 
				
			||||||
@ -472,6 +483,13 @@ sowrite(struct socket *so)
 | 
				
			|||||||
		sofcantsendmore(so);
 | 
							sofcantsendmore(so);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return nn;
 | 
						return nn;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					err_disconnected:
 | 
				
			||||||
 | 
						DEBUG_MISC((dfd, " --- sowrite disconnected, so->so_state = %x, errno = %d\n",
 | 
				
			||||||
 | 
							    so->so_state, errno));
 | 
				
			||||||
 | 
						sofcantsendmore(so);
 | 
				
			||||||
 | 
						tcp_sockclosed(sototcpcb(so));
 | 
				
			||||||
 | 
						return -1;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user