OSSP CVS Repository

ossp - Difference in ossp-pkg/sa/sa.c versions 1.31 and 1.32
Not logged in
[Honeypot]  [Browse]  [Home]  [Login]  [Reports
[Search]  [Ticket]  [Timeline
  [History

ossp-pkg/sa/sa.c 1.31 -> 1.32

--- sa.c 2001/10/11 14:36:29     1.31
+++ sa.c 2001/10/11 15:12:19     1.32
@@ -585,13 +585,6 @@
 /* import "struct sockaddr" into address object */
 sa_rc_t sa_addr_s2a(sa_addr_t *saa, const struct sockaddr *sabuf, socklen_t salen)
 {
-    struct sockaddr_un *un;
-    struct sockaddr_in *sa4;
-#ifdef AF_INET6
-    struct sockaddr_in6 *sa6;
-#endif
-    int sf;
-
     /* argument sanity check(s) */
     if (saa == NULL || sabuf == NULL || salen == 0)
         return SA_ERR_ARG;
@@ -604,28 +597,8 @@
     memcpy(saa->saBuf, sabuf, salen);
     saa->slBuf = salen;
 
-    /* resolve family */
-    sf = 0;
-    if (sizeof(struct sockaddr_un) == salen) {
-        un = (struct sockaddr_un *)((void *)sabuf);
-        if (un->sun_family == AF_LOCAL)
-            sf = AF_LOCAL;
-    }
-    if (sf == 0 && sizeof(struct sockaddr_in) == salen) {
-        sa4 = (struct sockaddr_in *)((void *)sabuf);
-        if (sa4->sin_family == AF_INET)
-            sf = AF_INET;
-    }
-#ifdef AF_INET6
-    if (sf == 0 && sizeof(struct sockaddr_in6) == salen) {
-        sa6 = (struct sockaddr_in6 *)((void *)sabuf);
-        if (sa6->sin6_family == AF_INET6)
-            sf = AF_INET6;
-    }
-#endif
-    if (sf == 0)
-        return SA_ERR_ARG;
-    saa->nFamily = sf;
+    /* remember family */
+    saa->nFamily = sabuf->sa_family;
 
     return SA_OK;
 }
@@ -649,7 +622,16 @@
     /* export object contents */
     if (saa->nFamily == AF_LOCAL) {
         un = (struct sockaddr_un *)((void *)saa->saBuf);
-        sa_msnprintf(uribuf, sizeof(uribuf), "unix:%s", un->sun_path);
+        if (   (   saa->slBuf >= (socklen_t)(&(((struct sockaddr_un *)0)->sun_path[0]))
+                && un->sun_path[0] == '\0')
+            || saa->slBuf < sizeof(struct sockaddr_un))
+            /* in case the remote side of a Unix Domain socket was not
+               bound, a "struct sockaddr_un" can occur with a length less
+               than the expected one. Then there is actually no path at all. 
+               This has been verified under FreeBSD, Linux and Solaris. */
+            sa_msnprintf(uribuf, sizeof(uribuf), "unix:/NOT-BOUND");
+        else
+            sa_msnprintf(uribuf, sizeof(uribuf), "unix:%s", un->sun_path);
     }
 #ifdef AF_INET6
     else if (saa->nFamily == AF_INET || saa->nFamily == AF_INET6) {
@@ -1510,6 +1492,7 @@
     char c;
     size_t n;
     size_t res;
+    sa_rc_t rv;
 
     /* argument sanity check(s) */
     if (sa == NULL || cpBuf == NULL || nBufReq == 0)
@@ -1527,9 +1510,12 @@
        buffers are enabled, this is not as stupid as it looks at the first
        hand and if buffers are disabled, there is no better solution
        anyway. */
+    rv = SA_OK;
     res = 0;
     while (res < (nBufReq-1)) {
-        sa_read(sa, &c, 1, &n);
+        rv = sa_read(sa, &c, 1, &n);
+        if (rv != SA_OK)
+            break;
         if (n <= 0)
             break;
         cpBuf[res++] = c;
@@ -1542,7 +1528,7 @@
     if (nBufRes != NULL)
         *nBufRes = res;
 
-    return SA_OK;
+    return rv;
 }
 
 /* internal raw write operation */

CVSTrac 2.0.1