Please see socket.cpp file and recv function (arduino ide ver 21):
/**
* @brief This function is an application I/F function which is used to receive the data in TCP mode.
* It continues to wait for data as much as the application wants to receive.
*
* @return received data size for success else -1.
*/
uint16_t recv(SOCKET s, uint8_t *buf, uint16_t len)
{
uint16_t ret=0;
if ( len > 0 )
{
W5100.recv_data_processing(s, buf, len);
W5100.execCmdSn(s, Sock_RECV);
ret = len;
}
return ret;
}
It will not return -1 in any case

Above description for return value is wrong

Anyway, I think that is optimized version for this function:
+size_t Client::read(uint8_t *buf, size_t size) {
+ size_t av = available();
+ if (size > av) {
+ size = av;
+ }
+ return (size_t)recv(_sock, buf, size);
+ }