Index: uspace/lib/c/generic/net/socket_client.c
===================================================================
--- uspace/lib/c/generic/net/socket_client.c	(revision 4791e3c561c104e3b2c3c4c1b4424d152b8682e9)
+++ uspace/lib/c/generic/net/socket_client.c	(revision d493830e8ac528a63cbebc60d21ffdcb0fa60ef8)
@@ -1006,5 +1006,5 @@
 	// wait for a received packet
 	++socket->blocked;
-	while ((result = dyn_fifo_value(&socket->received)) <= 0) {
+	while ((result = dyn_fifo_value(&socket->received)) < 0) {
 		fibril_rwlock_read_unlock(&socket_globals.lock);
 		fibril_condvar_wait(&socket->receive_signal,
@@ -1018,4 +1018,9 @@
 	--socket->blocked;
 	fragments = (size_t) result;
+
+	if (fragments == 0) {
+		/* No more data, other side has closed the connection. */
+		return 0;
+	}
 
 	// prepare lengths if more fragments
@@ -1057,5 +1062,5 @@
 
 		free(lengths);
-	} else {
+	} else { /* fragments == 1 */
 		// request packet data
 		message_id = async_send_4(socket->phone, message,
