diff --git a/lnet/ulnds/socklnd/tcplnd.c b/lnet/ulnds/socklnd/tcplnd.c
index bd73fb2d40b09c5feb5cd6dec19cfb03d0e1034d..010f972fe2dfa956172c26057e0c519a688f9593 100644
--- a/lnet/ulnds/socklnd/tcplnd.c
+++ b/lnet/ulnds/socklnd/tcplnd.c
@@ -166,26 +166,30 @@ int tcpnal_recv(lnet_ni_t     *ni,
 
         /* FIXME
          * 1. Is this effecient enough? change to use readv() directly?
-         * 2. need check return from read_connection()
          * - MeiJia
          */
         for (i = 0; i < ntiov; i++)
-                read_connection(private, tiov[i].iov_base, tiov[i].iov_len);
+                if (!read_connection(private, tiov[i].iov_base, tiov[i].iov_len))
+                        return -EIO;
+                        
 
 finalize:
-        /* FIXME; we always assume success here... */
-        lnet_finalize(ni, cookie, 0);
-
         LASSERT(rlen >= mlen);
 
         if (mlen != rlen){
+                int rc;
                 char *trash=malloc(rlen - mlen);
 
-                /*TODO: check error status*/
-                read_connection(private, trash, rlen - mlen);
+                if (!trash)
+                        return -ENOMEM;
+                
+                rc = read_connection(private, trash, rlen - mlen);
                 free(trash);
+                if (!rc)
+                        return -EIO;
         }
 
+        lnet_finalize(ni, cookie, 0);
         return(0);
 }