]> rtime.felk.cvut.cz Git - pes-rpp/rpp-lwip.git/commitdiff
fixed bug #34360 tcp_shutdown: RST on unacked is not send when shutting down both...
authorSimon Goldschmidt <goldsimon@gmx.de>
Thu, 22 Sep 2011 19:38:56 +0000 (21:38 +0200)
committerSimon Goldschmidt <goldsimon@gmx.de>
Thu, 22 Sep 2011 19:38:56 +0000 (21:38 +0200)
CHANGELOG
src/core/tcp.c

index c3c142595ba58fa37929264bb1c7bf724208f626..c829a7203d6b5dc51872c1d8f397f60ebddc601c 100644 (file)
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -65,6 +65,10 @@ HISTORY
 
  ++ Bugfixes:
 
+  2011-09-22: Simon Goldschmidt
+  * tcp.c: fixed bug #34360 tcp_shutdown: RST on unacked is not send when
+    shutting down both rx AND tx
+
   2011-09-22: Simon Goldschmidt
   * tcp_impl.h: fixed bug #34355: nagle does not take snd_buf/snd_queuelen into
     account
index 432449390d49a457c338e8c8e59a009ce89eb455..853151715b5962db882debeda92a50d151301a73 100644 (file)
@@ -305,12 +305,7 @@ tcp_shutdown(struct tcp_pcb *pcb, int shut_rx, int shut_tx)
     return ERR_CONN;
   }
   if (shut_rx) {
-    /* shut down the receive side: free buffered data... */
-    if (pcb->refused_data != NULL) {
-      pbuf_free(pcb->refused_data);
-      pcb->refused_data = NULL;
-    }
-    /* ... and set a flag not to receive any more data */
+    /* shut down the receive side: set a flag not to receive any more data */
     pcb->flags |= TF_RXCLOSED;
   }
   if (shut_tx) {
@@ -320,12 +315,18 @@ tcp_shutdown(struct tcp_pcb *pcb, int shut_rx, int shut_tx)
   case SYN_RCVD:
   case ESTABLISHED:
   case CLOSE_WAIT:
-    return tcp_close_shutdown(pcb, 0);
+    /* if shut_tx AND shut_rx, send RST if we have unacked data */
+    return tcp_close_shutdown(pcb, (u8_t)shut_rx);
   default:
     /* don't shut down other states */
     break;
     }
   }
+  if (shut_rx && (pcb->refused_data != NULL)) {
+    /* shut down the receive side: free buffered data if we come here */
+    pbuf_free(pcb->refused_data);
+    pcb->refused_data = NULL;
+  }
   /* @todo: return another err_t if not in correct state or already shut? */
   return ERR_OK;
 }