[Xenomai-git] Philippe Gerum : cobalt/signal: fix memory leakage

2014-05-16 Thread git repository hosting
Module: xenomai-forge
Branch: master
Commit: 72c842c7c129c91784a7157e58890f46708dcc33
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=72c842c7c129c91784a7157e58890f46708dcc33

Author: Philippe Gerum 
Date:   Wed May  7 11:53:20 2014 +0200

cobalt/signal: fix memory leakage

Make sure the signal data (struct cobalt_sigpending) is freed when
cobalt_signal_send() decides not to queue it.

---

 kernel/cobalt/posix/mqueue.c |3 ++-
 kernel/cobalt/posix/signal.c |   32 
 kernel/cobalt/posix/signal.h |2 ++
 3 files changed, 24 insertions(+), 13 deletions(-)

diff --git a/kernel/cobalt/posix/mqueue.c b/kernel/cobalt/posix/mqueue.c
index 395eaf2..a3154d1 100644
--- a/kernel/cobalt/posix/mqueue.c
+++ b/kernel/cobalt/posix/mqueue.c
@@ -657,7 +657,8 @@ cobalt_mq_finish_send(mqd_t fd, cobalt_mq_t *mq, struct 
cobalt_msg *msg)
sigp = cobalt_signal_alloc();
if (sigp) {
cobalt_copy_siginfo(SI_MESGQ, 
&sigp->si, &mq->si);
-   cobalt_signal_send(mq->target, sigp, 0);
+   if (cobalt_signal_send(mq->target, 
sigp, 0) <= 0)
+   cobalt_signal_free(sigp);
}
mq->target = NULL;
}
diff --git a/kernel/cobalt/posix/signal.c b/kernel/cobalt/posix/signal.c
index 15171e1..d24cbf9 100644
--- a/kernel/cobalt/posix/signal.c
+++ b/kernel/cobalt/posix/signal.c
@@ -89,9 +89,7 @@ deliver:
 * have to release the sigpending data right away before
 * leaving.
 */
-   if ((void *)sigp >= sigpending_mem &&
-   (void *)sigp < sigpending_mem + __SIGPOOL_SIZE)
-   list_add_tail(&sigp->next, &sigpending_pool);
+   cobalt_signal_free(sigp);
 
return 1;
 }
@@ -106,17 +104,16 @@ int cobalt_signal_send(struct cobalt_thread *thread,
/* Can we deliver this signal immediately? */
ret = cobalt_signal_deliver(thread, sigp, group);
if (ret)
-   return 0;   /* Yep, done. */
+   return ret; /* Yep, done. */
 
/*
 * Nope, attempt to queue it. We start by calling any Cobalt
 * extension for queuing the signal first.
 */
if (cobalt_call_extension(signal_queue, &thread->extref, ret, sigp)) {
-   if (ret < 0)
-   return ret; /* Error. */
-   if (ret > 0)
-   return 0; /* Queuing done. */
+   if (ret)
+   /* Queuing done remotely or error. */
+   return ret;
}
 
sig = sigp->si.si_signo;
@@ -133,7 +130,7 @@ int cobalt_signal_send(struct cobalt_thread *thread,
sigaddset(&thread->sigpending, sig);
list_add_tail(&sigp->next, sigq);
 
-   return 0;
+   return 1;
 }
 EXPORT_SYMBOL_GPL(cobalt_signal_send);
 
@@ -166,6 +163,14 @@ struct cobalt_sigpending *cobalt_signal_alloc(void)
 }
 EXPORT_SYMBOL_GPL(cobalt_signal_alloc);
 
+void cobalt_signal_free(struct cobalt_sigpending *sigp)
+{  /* nklocked, IRQs off */
+   if ((void *)sigp >= sigpending_mem &&
+   (void *)sigp < sigpending_mem + __SIGPOOL_SIZE)
+   list_add_tail(&sigp->next, &sigpending_pool);
+}
+EXPORT_SYMBOL_GPL(cobalt_signal_free);
+
 void cobalt_signal_flush(struct cobalt_thread *thread)
 {
struct cobalt_sigpending *sigp, *tmp;
@@ -461,7 +466,8 @@ int __cobalt_kill(struct cobalt_thread *thread, int sig, 
int group) /* nklocked,
sigp->si.si_code = SI_USER;
sigp->si.si_pid = current->pid;
sigp->si.si_uid = get_current_uuid();
-   cobalt_signal_send(thread, sigp, group);
+   if (cobalt_signal_send(thread, sigp, group) <= 0)
+   cobalt_signal_free(sigp);
}
resched:
xnsched_run();
@@ -525,8 +531,10 @@ int cobalt_sigqueue(pid_t pid, int sig,
sigp->si.si_pid = current->pid;
sigp->si.si_uid = get_current_uuid();
sigp->si.si_value = val;
-   cobalt_signal_send(thread, sigp, 1);
-   xnsched_run();
+   if (cobalt_signal_send(thread, sigp, 1) <= 0)
+   cobalt_signal_free(sigp);
+   else
+   xnsched_run();
}
break;
default:
diff --git a/kernel/cobalt/posix/signal.h b/kernel/cobalt/posix/signal.h
index 9ad3c9e..ed2f387 100644
--- a/kernel/cobalt/posix/signal.h
+++ b/kernel/cobalt/posix/signal.h
@@ -63,6 +63,8 @@ int cobalt_signal_send_pid(pid_t pid,
 
 struct cobalt_sigpending *cobalt_si

[Xenomai-git] Philippe Gerum : cobalt/signal: fix memory leakage

2014-05-13 Thread git repository hosting
Module: xenomai-forge
Branch: next
Commit: 72c842c7c129c91784a7157e58890f46708dcc33
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=72c842c7c129c91784a7157e58890f46708dcc33

Author: Philippe Gerum 
Date:   Wed May  7 11:53:20 2014 +0200

cobalt/signal: fix memory leakage

Make sure the signal data (struct cobalt_sigpending) is freed when
cobalt_signal_send() decides not to queue it.

---

 kernel/cobalt/posix/mqueue.c |3 ++-
 kernel/cobalt/posix/signal.c |   32 
 kernel/cobalt/posix/signal.h |2 ++
 3 files changed, 24 insertions(+), 13 deletions(-)

diff --git a/kernel/cobalt/posix/mqueue.c b/kernel/cobalt/posix/mqueue.c
index 395eaf2..a3154d1 100644
--- a/kernel/cobalt/posix/mqueue.c
+++ b/kernel/cobalt/posix/mqueue.c
@@ -657,7 +657,8 @@ cobalt_mq_finish_send(mqd_t fd, cobalt_mq_t *mq, struct 
cobalt_msg *msg)
sigp = cobalt_signal_alloc();
if (sigp) {
cobalt_copy_siginfo(SI_MESGQ, 
&sigp->si, &mq->si);
-   cobalt_signal_send(mq->target, sigp, 0);
+   if (cobalt_signal_send(mq->target, 
sigp, 0) <= 0)
+   cobalt_signal_free(sigp);
}
mq->target = NULL;
}
diff --git a/kernel/cobalt/posix/signal.c b/kernel/cobalt/posix/signal.c
index 15171e1..d24cbf9 100644
--- a/kernel/cobalt/posix/signal.c
+++ b/kernel/cobalt/posix/signal.c
@@ -89,9 +89,7 @@ deliver:
 * have to release the sigpending data right away before
 * leaving.
 */
-   if ((void *)sigp >= sigpending_mem &&
-   (void *)sigp < sigpending_mem + __SIGPOOL_SIZE)
-   list_add_tail(&sigp->next, &sigpending_pool);
+   cobalt_signal_free(sigp);
 
return 1;
 }
@@ -106,17 +104,16 @@ int cobalt_signal_send(struct cobalt_thread *thread,
/* Can we deliver this signal immediately? */
ret = cobalt_signal_deliver(thread, sigp, group);
if (ret)
-   return 0;   /* Yep, done. */
+   return ret; /* Yep, done. */
 
/*
 * Nope, attempt to queue it. We start by calling any Cobalt
 * extension for queuing the signal first.
 */
if (cobalt_call_extension(signal_queue, &thread->extref, ret, sigp)) {
-   if (ret < 0)
-   return ret; /* Error. */
-   if (ret > 0)
-   return 0; /* Queuing done. */
+   if (ret)
+   /* Queuing done remotely or error. */
+   return ret;
}
 
sig = sigp->si.si_signo;
@@ -133,7 +130,7 @@ int cobalt_signal_send(struct cobalt_thread *thread,
sigaddset(&thread->sigpending, sig);
list_add_tail(&sigp->next, sigq);
 
-   return 0;
+   return 1;
 }
 EXPORT_SYMBOL_GPL(cobalt_signal_send);
 
@@ -166,6 +163,14 @@ struct cobalt_sigpending *cobalt_signal_alloc(void)
 }
 EXPORT_SYMBOL_GPL(cobalt_signal_alloc);
 
+void cobalt_signal_free(struct cobalt_sigpending *sigp)
+{  /* nklocked, IRQs off */
+   if ((void *)sigp >= sigpending_mem &&
+   (void *)sigp < sigpending_mem + __SIGPOOL_SIZE)
+   list_add_tail(&sigp->next, &sigpending_pool);
+}
+EXPORT_SYMBOL_GPL(cobalt_signal_free);
+
 void cobalt_signal_flush(struct cobalt_thread *thread)
 {
struct cobalt_sigpending *sigp, *tmp;
@@ -461,7 +466,8 @@ int __cobalt_kill(struct cobalt_thread *thread, int sig, 
int group) /* nklocked,
sigp->si.si_code = SI_USER;
sigp->si.si_pid = current->pid;
sigp->si.si_uid = get_current_uuid();
-   cobalt_signal_send(thread, sigp, group);
+   if (cobalt_signal_send(thread, sigp, group) <= 0)
+   cobalt_signal_free(sigp);
}
resched:
xnsched_run();
@@ -525,8 +531,10 @@ int cobalt_sigqueue(pid_t pid, int sig,
sigp->si.si_pid = current->pid;
sigp->si.si_uid = get_current_uuid();
sigp->si.si_value = val;
-   cobalt_signal_send(thread, sigp, 1);
-   xnsched_run();
+   if (cobalt_signal_send(thread, sigp, 1) <= 0)
+   cobalt_signal_free(sigp);
+   else
+   xnsched_run();
}
break;
default:
diff --git a/kernel/cobalt/posix/signal.h b/kernel/cobalt/posix/signal.h
index 9ad3c9e..ed2f387 100644
--- a/kernel/cobalt/posix/signal.h
+++ b/kernel/cobalt/posix/signal.h
@@ -63,6 +63,8 @@ int cobalt_signal_send_pid(pid_t pid,
 
 struct cobalt_sigpending *cobalt_sign

[Xenomai-git] Philippe Gerum : cobalt/signal: fix memory leakage

2014-05-07 Thread git repository hosting
Module: xenomai-forge
Branch: next
Commit: fcba063c9c596d14bd32c3804c383e0ad2f0dea4
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=fcba063c9c596d14bd32c3804c383e0ad2f0dea4

Author: Philippe Gerum 
Date:   Wed May  7 11:53:20 2014 +0200

cobalt/signal: fix memory leakage

Make sure the signal data (struct cobalt_sigpending) is freed when
cobalt_signal_send() decides not to queue it.

---

 kernel/cobalt/posix/mqueue.c |3 ++-
 kernel/cobalt/posix/signal.c |   32 
 kernel/cobalt/posix/signal.h |2 ++
 3 files changed, 24 insertions(+), 13 deletions(-)

diff --git a/kernel/cobalt/posix/mqueue.c b/kernel/cobalt/posix/mqueue.c
index 395eaf2..a3154d1 100644
--- a/kernel/cobalt/posix/mqueue.c
+++ b/kernel/cobalt/posix/mqueue.c
@@ -657,7 +657,8 @@ cobalt_mq_finish_send(mqd_t fd, cobalt_mq_t *mq, struct 
cobalt_msg *msg)
sigp = cobalt_signal_alloc();
if (sigp) {
cobalt_copy_siginfo(SI_MESGQ, 
&sigp->si, &mq->si);
-   cobalt_signal_send(mq->target, sigp, 0);
+   if (cobalt_signal_send(mq->target, 
sigp, 0) <= 0)
+   cobalt_signal_free(sigp);
}
mq->target = NULL;
}
diff --git a/kernel/cobalt/posix/signal.c b/kernel/cobalt/posix/signal.c
index 15171e1..d24cbf9 100644
--- a/kernel/cobalt/posix/signal.c
+++ b/kernel/cobalt/posix/signal.c
@@ -89,9 +89,7 @@ deliver:
 * have to release the sigpending data right away before
 * leaving.
 */
-   if ((void *)sigp >= sigpending_mem &&
-   (void *)sigp < sigpending_mem + __SIGPOOL_SIZE)
-   list_add_tail(&sigp->next, &sigpending_pool);
+   cobalt_signal_free(sigp);
 
return 1;
 }
@@ -106,17 +104,16 @@ int cobalt_signal_send(struct cobalt_thread *thread,
/* Can we deliver this signal immediately? */
ret = cobalt_signal_deliver(thread, sigp, group);
if (ret)
-   return 0;   /* Yep, done. */
+   return ret; /* Yep, done. */
 
/*
 * Nope, attempt to queue it. We start by calling any Cobalt
 * extension for queuing the signal first.
 */
if (cobalt_call_extension(signal_queue, &thread->extref, ret, sigp)) {
-   if (ret < 0)
-   return ret; /* Error. */
-   if (ret > 0)
-   return 0; /* Queuing done. */
+   if (ret)
+   /* Queuing done remotely or error. */
+   return ret;
}
 
sig = sigp->si.si_signo;
@@ -133,7 +130,7 @@ int cobalt_signal_send(struct cobalt_thread *thread,
sigaddset(&thread->sigpending, sig);
list_add_tail(&sigp->next, sigq);
 
-   return 0;
+   return 1;
 }
 EXPORT_SYMBOL_GPL(cobalt_signal_send);
 
@@ -166,6 +163,14 @@ struct cobalt_sigpending *cobalt_signal_alloc(void)
 }
 EXPORT_SYMBOL_GPL(cobalt_signal_alloc);
 
+void cobalt_signal_free(struct cobalt_sigpending *sigp)
+{  /* nklocked, IRQs off */
+   if ((void *)sigp >= sigpending_mem &&
+   (void *)sigp < sigpending_mem + __SIGPOOL_SIZE)
+   list_add_tail(&sigp->next, &sigpending_pool);
+}
+EXPORT_SYMBOL_GPL(cobalt_signal_free);
+
 void cobalt_signal_flush(struct cobalt_thread *thread)
 {
struct cobalt_sigpending *sigp, *tmp;
@@ -461,7 +466,8 @@ int __cobalt_kill(struct cobalt_thread *thread, int sig, 
int group) /* nklocked,
sigp->si.si_code = SI_USER;
sigp->si.si_pid = current->pid;
sigp->si.si_uid = get_current_uuid();
-   cobalt_signal_send(thread, sigp, group);
+   if (cobalt_signal_send(thread, sigp, group) <= 0)
+   cobalt_signal_free(sigp);
}
resched:
xnsched_run();
@@ -525,8 +531,10 @@ int cobalt_sigqueue(pid_t pid, int sig,
sigp->si.si_pid = current->pid;
sigp->si.si_uid = get_current_uuid();
sigp->si.si_value = val;
-   cobalt_signal_send(thread, sigp, 1);
-   xnsched_run();
+   if (cobalt_signal_send(thread, sigp, 1) <= 0)
+   cobalt_signal_free(sigp);
+   else
+   xnsched_run();
}
break;
default:
diff --git a/kernel/cobalt/posix/signal.h b/kernel/cobalt/posix/signal.h
index 9ad3c9e..ed2f387 100644
--- a/kernel/cobalt/posix/signal.h
+++ b/kernel/cobalt/posix/signal.h
@@ -63,6 +63,8 @@ int cobalt_signal_send_pid(pid_t pid,
 
 struct cobalt_sigpending *cobalt_sign

[Xenomai-git] Philippe Gerum : cobalt/signal: fix memory leakage

2014-05-07 Thread git repository hosting
Module: xenomai-forge
Branch: next
Commit: f60d723f5f1c696c153f63584ade5571d209b057
URL:
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=f60d723f5f1c696c153f63584ade5571d209b057

Author: Philippe Gerum 
Date:   Wed May  7 11:53:20 2014 +0200

cobalt/signal: fix memory leakage

Make sure the signal data (struct cobalt_sigpending) is freed when
cobalt_signal_send() decides not to queue it.

---

 kernel/cobalt/posix/mqueue.c |3 ++-
 kernel/cobalt/posix/signal.c |   32 
 kernel/cobalt/posix/signal.h |2 ++
 3 files changed, 24 insertions(+), 13 deletions(-)

diff --git a/kernel/cobalt/posix/mqueue.c b/kernel/cobalt/posix/mqueue.c
index 395eaf2..a3154d1 100644
--- a/kernel/cobalt/posix/mqueue.c
+++ b/kernel/cobalt/posix/mqueue.c
@@ -657,7 +657,8 @@ cobalt_mq_finish_send(mqd_t fd, cobalt_mq_t *mq, struct 
cobalt_msg *msg)
sigp = cobalt_signal_alloc();
if (sigp) {
cobalt_copy_siginfo(SI_MESGQ, 
&sigp->si, &mq->si);
-   cobalt_signal_send(mq->target, sigp, 0);
+   if (cobalt_signal_send(mq->target, 
sigp, 0) <= 0)
+   cobalt_signal_free(sigp);
}
mq->target = NULL;
}
diff --git a/kernel/cobalt/posix/signal.c b/kernel/cobalt/posix/signal.c
index f1530f2..b2693b4 100644
--- a/kernel/cobalt/posix/signal.c
+++ b/kernel/cobalt/posix/signal.c
@@ -89,9 +89,7 @@ deliver:
 * have to release the sigpending data right away before
 * leaving.
 */
-   if ((void *)sigp >= sigpending_mem &&
-   (void *)sigp < sigpending_mem + __SIGPOOL_SIZE)
-   list_add_tail(&sigp->next, &sigpending_pool);
+   cobalt_signal_free(sigp);
 
return 1;
 }
@@ -106,17 +104,16 @@ int cobalt_signal_send(struct cobalt_thread *thread,
/* Can we deliver this signal immediately? */
ret = cobalt_signal_deliver(thread, sigp, group);
if (ret)
-   return 0;   /* Yep, done. */
+   return ret; /* Yep, done. */
 
/*
 * Nope, attempt to queue it. We start by calling any Cobalt
 * extension for queuing the signal first.
 */
if (cobalt_call_extension(signal_queue, &thread->extref, ret, sigp)) {
-   if (ret < 0)
-   return ret; /* Error. */
-   if (ret > 0)
-   return 0; /* Queuing done. */
+   if (ret)
+   /* Queuing done remotely or error. */
+   return ret;
}
 
sig = sigp->si.si_signo;
@@ -133,7 +130,7 @@ int cobalt_signal_send(struct cobalt_thread *thread,
sigaddset(&thread->sigpending, sig);
list_add_tail(&sigp->next, sigq);
 
-   return 0;
+   return 1;
 }
 EXPORT_SYMBOL_GPL(cobalt_signal_send);
 
@@ -166,6 +163,14 @@ struct cobalt_sigpending *cobalt_signal_alloc(void)
 }
 EXPORT_SYMBOL_GPL(cobalt_signal_alloc);
 
+void cobalt_signal_free(struct cobalt_sigpending *sigp)
+{  /* nklocked, IRQs off */
+   if ((void *)sigp >= sigpending_mem &&
+   (void *)sigp < sigpending_mem + __SIGPOOL_SIZE)
+   list_add_tail(&sigp->next, &sigpending_pool);
+}
+EXPORT_SYMBOL_GPL(cobalt_signal_free);
+
 void cobalt_signal_flush(struct cobalt_thread *thread)
 {
struct cobalt_sigpending *sigp, *tmp;
@@ -459,7 +464,8 @@ int __cobalt_kill(struct cobalt_thread *thread, int sig, 
int group) /* nklocked,
sigp->si.si_code = SI_USER;
sigp->si.si_pid = current->pid;
sigp->si.si_uid = get_current_uuid();
-   cobalt_signal_send(thread, sigp, group);
+   if (cobalt_signal_send(thread, sigp, group) <= 0)
+   cobalt_signal_free(sigp);
}
resched:
xnsched_run();
@@ -523,8 +529,10 @@ int cobalt_sigqueue(pid_t pid, int sig,
sigp->si.si_pid = current->pid;
sigp->si.si_uid = get_current_uuid();
sigp->si.si_value = val;
-   cobalt_signal_send(thread, sigp, 1);
-   xnsched_run();
+   if (cobalt_signal_send(thread, sigp, 1) <= 0)
+   cobalt_signal_free(sigp);
+   else
+   xnsched_run();
}
break;
default:
diff --git a/kernel/cobalt/posix/signal.h b/kernel/cobalt/posix/signal.h
index 93685a2..0f90398 100644
--- a/kernel/cobalt/posix/signal.h
+++ b/kernel/cobalt/posix/signal.h
@@ -62,6 +62,8 @@ int cobalt_signal_send_pid(pid_t pid,
 
 struct cobalt_sigpending *cobalt_sign