Hi Hal

This was reported to me by Ishai R. 

Consider function umad_recv line 810:
        if ((n = read(port->dev_fd, umad, sizeof *mad + *length)) <= 
             sizeof *mad + *length) {
                DEBUG("mad received by agent %d length %d", mad->agent_id, n);
                *length = n - sizeof *mad;
                return mad->agent_id;
        }

        if (n == -EWOULDBLOCK) {
                if (!errno)
                        errno = EWOULDBLOCK;
                return n;
        }

Seems that umad.c umad_recv would never go through the second "if" 
as if the read return n < 0 it will be cought by the first "if".

Then I have noticed that a wrap around of the returned length is also 
possible.

The patch fixes these issue.

Eitan

Signed-off-by:  Eitan Zahavi <[EMAIL PROTECTED]>

Index: libibumad/src/umad.c
===================================================================
--- libibumad/src/umad.c        (revision 8313)
+++ libibumad/src/umad.c        (working copy)
@@ -806,10 +806,13 @@ umad_recv(int portid, void *umad, int *l
                return n;
        }
 
-       if ((n = read(port->dev_fd, umad, sizeof *mad + *length)) <= 
-            sizeof *mad + *length) {
+       n = read(port->dev_fd, umad, sizeof *mad + *length);
+       if ((n >= 0) && (n <= sizeof *mad + *length)) {
                DEBUG("mad received by agent %d length %d", mad->agent_id, n);
+               if (n > sizeof *mad)
                        *length = n - sizeof *mad;
+               else
+                       *length = 0;
                return mad->agent_id;
        }
 


_______________________________________________
openib-general mailing list
openib-general@openib.org
http://openib.org/mailman/listinfo/openib-general

To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general

Reply via email to