Module: xenomai-forge
Branch: next
Commit: 39db28358f336d43d0ee8ff4adf7b35fe66ca726
URL:    
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=39db28358f336d43d0ee8ff4adf7b35fe66ca726

Author: Philippe Gerum <r...@xenomai.org>
Date:   Tue Aug 12 21:47:17 2014 +0200

drivers/ipc: fix address reset in connect()

---

 kernel/drivers/ipc/bufp.c |    8 +++++---
 kernel/drivers/ipc/iddp.c |    9 +++++----
 kernel/drivers/ipc/xddp.c |    8 +++++---
 3 files changed, 15 insertions(+), 10 deletions(-)

diff --git a/kernel/drivers/ipc/bufp.c b/kernel/drivers/ipc/bufp.c
index 46abbe0..7b67e11 100644
--- a/kernel/drivers/ipc/bufp.c
+++ b/kernel/drivers/ipc/bufp.c
@@ -748,13 +748,15 @@ fail:
 static int __bufp_connect_socket(struct bufp_socket *sk,
                                 struct sockaddr_ipc *sa)
 {
+       struct sockaddr_ipc _sa;
        struct bufp_socket *rsk;
        int ret, resched = 0;
        rtdm_lockctx_t s;
        xnhandle_t h;
 
        if (sa == NULL) {
-               sa = &nullsa;
+               _sa = nullsa;
+               sa = &_sa;
                goto set_assoc;
        }
 
@@ -799,8 +801,8 @@ static int __bufp_connect_socket(struct bufp_socket *sk,
                cobalt_atomic_leave(s);
                if (ret)
                        return ret;
-       }
-
+       } else if (sa->sipc_port < 0)
+               sa = &nullsa;
 set_assoc:
        cobalt_atomic_enter(s);
        if (!test_bit(_BUFP_BOUND, &sk->status))
diff --git a/kernel/drivers/ipc/iddp.c b/kernel/drivers/ipc/iddp.c
index 82ddebb..7521fc5 100644
--- a/kernel/drivers/ipc/iddp.c
+++ b/kernel/drivers/ipc/iddp.c
@@ -328,7 +328,6 @@ static ssize_t __iddp_recvmsg(struct rtdm_fd *fd,
 static ssize_t iddp_recvmsg(struct rtdm_fd *fd,
                            struct msghdr *msg, int flags)
 {
-       struct rtipc_private *priv = rtdm_fd_to_private(fd);
        struct iovec iov[RTIPC_IOV_MAX];
        struct sockaddr_ipc saddr;
        ssize_t ret;
@@ -628,13 +627,15 @@ fail:
 static int __iddp_connect_socket(struct iddp_socket *sk,
                                 struct sockaddr_ipc *sa)
 {
+       struct sockaddr_ipc _sa;
        struct iddp_socket *rsk;
        int ret, resched = 0;
        rtdm_lockctx_t s;
        xnhandle_t h;
 
        if (sa == NULL) {
-               sa = &nullsa;
+               _sa = nullsa;
+               sa = &_sa;
                goto set_assoc;
        }
 
@@ -679,8 +680,8 @@ static int __iddp_connect_socket(struct iddp_socket *sk,
                cobalt_atomic_leave(s);
                if (ret)
                        return ret;
-       }
-
+       } else if (sa->sipc_port < 0)
+               sa = &nullsa;
 set_assoc:
        cobalt_atomic_enter(s);
        if (!test_bit(_IDDP_BOUND, &sk->status))
diff --git a/kernel/drivers/ipc/xddp.c b/kernel/drivers/ipc/xddp.c
index 649931c..13b18ce 100644
--- a/kernel/drivers/ipc/xddp.c
+++ b/kernel/drivers/ipc/xddp.c
@@ -777,13 +777,15 @@ static int __xddp_bind_socket(struct rtipc_private *priv,
 static int __xddp_connect_socket(struct xddp_socket *sk,
                                 struct sockaddr_ipc *sa)
 {
+       struct sockaddr_ipc _sa;
        struct xddp_socket *rsk;
        int ret, resched = 0;
        rtdm_lockctx_t s;
        xnhandle_t h;
 
        if (sa == NULL) {
-               sa = &nullsa;
+               _sa = nullsa;
+               sa = &_sa;
                goto set_assoc;
        }
 
@@ -828,8 +830,8 @@ static int __xddp_connect_socket(struct xddp_socket *sk,
                cobalt_atomic_leave(s);
                if (ret)
                        return ret;
-       }
-
+       } else if (sa->sipc_port < 0)
+               sa = &nullsa;
 set_assoc:
        cobalt_atomic_enter(s);
        if (!test_bit(_XDDP_BOUND, &sk->status))


_______________________________________________
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git

Reply via email to