slirp: Handle error returns from sosendoob()
sosendoob() can return a failure code, but all its callers ignore it. This is OK in sbappend(), as the comment there states -- we will try again later in sowrite(). Add a (void) cast to tell Coverity so. In sowrite() we do need to check the return value -- we should handle a write failure in sosendoob() the same way we handle a write failure for the normal data. Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com> Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
This commit is contained in:
		
							parent
							
								
									0b466065eb
								
							
						
					
					
						commit
						75cb298d90
					
				| @ -91,7 +91,7 @@ sbappend(struct socket *so, struct mbuf *m) | ||||
| 	if (so->so_urgc) { | ||||
| 		sbappendsb(&so->so_rcv, m); | ||||
| 		m_free(m); | ||||
| 		sosendoob(so); | ||||
| 		(void)sosendoob(so); | ||||
| 		return; | ||||
| 	} | ||||
| 
 | ||||
|  | ||||
| @ -404,7 +404,15 @@ sowrite(struct socket *so) | ||||
| 	DEBUG_ARG("so = %p", so); | ||||
| 
 | ||||
| 	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) | ||||
| 			return 0; | ||||
| 	} | ||||
| @ -448,11 +456,7 @@ sowrite(struct socket *so) | ||||
| 		return 0; | ||||
| 
 | ||||
| 	if (nn <= 0) { | ||||
| 		DEBUG_MISC((dfd, " --- sowrite disconnected, so->so_state = %x, errno = %d\n", | ||||
| 			so->so_state, errno)); | ||||
| 		sofcantsendmore(so); | ||||
| 		tcp_sockclosed(sototcpcb(so)); | ||||
| 		return -1; | ||||
| 		goto err_disconnected; | ||||
| 	} | ||||
| 
 | ||||
| #ifndef HAVE_READV | ||||
| @ -479,6 +483,13 @@ sowrite(struct socket *so) | ||||
| 		sofcantsendmore(so); | ||||
| 
 | ||||
| 	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
	 Peter Maydell
						Peter Maydell