Module: xenomai-head
Branch: master
Commit: 2b083651953546b13b07e459d574aec103cf3230
URL:    
http://git.xenomai.org/?p=xenomai-head.git;a=commit;h=2b083651953546b13b07e459d574aec103cf3230

Author: Philippe Gerum <r...@xenomai.org>
Date:   Tue Sep  8 00:01:33 2009 +0200

rtipc/xddp: clear _XDDP_BINDING upon error in bind()

---

 ksrc/drivers/ipc/xddp.c |   16 ++++++++++------
 1 files changed, 10 insertions(+), 6 deletions(-)

diff --git a/ksrc/drivers/ipc/xddp.c b/ksrc/drivers/ipc/xddp.c
index bb54adc..3df102b 100644
--- a/ksrc/drivers/ipc/xddp.c
+++ b/ksrc/drivers/ipc/xddp.c
@@ -40,8 +40,8 @@ struct xddp_socket {
        struct sockaddr_ipc peer;
 
        int minor;
-       xnhandle_t handle;
        size_t poolsz;
+       xnhandle_t handle;
        char label[XDDP_LABEL_LEN];
 
        struct xddp_message *buffer;
@@ -706,14 +706,16 @@ static int __xddp_bind_socket(struct rtipc_private *priv,
        if (poolsz > 0) {
                poolsz = xnheap_rounded_size(poolsz + sk->reqbufsz, 
XNHEAP_PAGE_SIZE);
                poolmem = xnarch_alloc_host_mem(poolsz);
-               if (poolmem == NULL)
-                       return -ENOMEM;
+               if (poolmem == NULL) {
+                       ret = -ENOMEM;
+                       goto fail;
+               }
 
                ret = xnheap_init(&sk->privpool,
                                  poolmem, poolsz, XNHEAP_PAGE_SIZE);
                if (ret) {
                        xnarch_free_host_mem(poolmem, poolsz);
-                       return ret;
+                       goto fail;
                }
 
                sk->bufpool = &sk->privpool;
@@ -724,7 +726,7 @@ static int __xddp_bind_socket(struct rtipc_private *priv,
                sk->buffer = xnheap_alloc(sk->bufpool, sk->reqbufsz);
                if (sk->buffer == NULL) {
                        ret = -ENOMEM;
-                       goto fail;
+                       goto fail_freeheap;
                }
                sk->curbufsz = sk->reqbufsz;
        }
@@ -739,10 +741,12 @@ static int __xddp_bind_socket(struct rtipc_private *priv,
        ret = xnpipe_connect(sa->sipc_port, &ops,
                             rtdm_private_to_context(priv));
        if (ret < 0) {
-       fail:
+       fail_freeheap:
                if (sk->bufpool == &sk->privpool)
                        xnheap_destroy(&sk->privpool,
                                       __xddp_flush_pool, NULL);
+       fail:
+               clear_bit(_XDDP_BINDING, &sk->status);
                return ret;
        }
 


_______________________________________________
Xenomai-git mailing list
Xenomai-git@gna.org
https://mail.gna.org/listinfo/xenomai-git

Reply via email to