diff --git a/src/session.c b/src/session.c
index 2261c932d..a22a6f347 100644
--- a/src/session.c
+++ b/src/session.c
@@ -668,19 +668,23 @@ struct task *process_session(struct task *t)
 
 		buffer_check_timeouts(s->req);
 
+		if (unlikely((s->req->flags & (BF_SHUTW|BF_WRITE_TIMEOUT)) == BF_WRITE_TIMEOUT)) {
+			s->req->cons->flags |= SI_FL_NOLINGER;
+			s->req->cons->shutw(s->req->cons);
+		}
+
 		if (unlikely((s->req->flags & (BF_SHUTR|BF_READ_TIMEOUT)) == BF_READ_TIMEOUT))
 			s->req->prod->shutr(s->req->prod);
 
-		if (unlikely((s->req->flags & (BF_SHUTW|BF_WRITE_TIMEOUT)) == BF_WRITE_TIMEOUT))
-			s->req->cons->shutw(s->req->cons);
-
 		buffer_check_timeouts(s->rep);
 
+		if (unlikely((s->rep->flags & (BF_SHUTW|BF_WRITE_TIMEOUT)) == BF_WRITE_TIMEOUT)) {
+			s->rep->cons->flags |= SI_FL_NOLINGER;
+			s->rep->cons->shutw(s->rep->cons);
+		}
+
 		if (unlikely((s->rep->flags & (BF_SHUTR|BF_READ_TIMEOUT)) == BF_READ_TIMEOUT))
 			s->rep->prod->shutr(s->rep->prod);
-
-		if (unlikely((s->rep->flags & (BF_SHUTW|BF_WRITE_TIMEOUT)) == BF_WRITE_TIMEOUT))
-			s->rep->cons->shutw(s->rep->cons);
 	}
 
 	/* 1b: check for low-level errors reported at the stream interface.