[PATCH] dma: prevent races from sharing fd between children

Simon Schubert simon.schubert at epfl.ch
Thu Jul 9 14:24:35 PDT 2009


On fork, fds are shared between children.  If two processes work on
different recipients, but on the same queue file, they might get
confused when the fd (and thus the offset) is shared.  Prevent this by
re-opening the fd after fork.

Reported-by: Daniel Roethlisberger <daniel at roe.ch>
---
 libexec/dma/dma.c |   12 ++++++++++++
 1 files changed, 12 insertions(+), 0 deletions(-)

diff --git a/libexec/dma/dma.c b/libexec/dma/dma.c
index 4633b0c..08fc8fb 100644
--- a/libexec/dma/dma.c
+++ b/libexec/dma/dma.c
@@ -484,6 +484,7 @@ go_background(struct queue *queue)
 {
 	struct sigaction sa;
 	struct qitem *it;
+	FILE *newqf;
 	pid_t pid;
 
 	if (daemonize && daemon(0, 0) != 0) {
@@ -515,6 +516,17 @@ go_background(struct queue *queue)
 			 *
 			 * return and deliver mail
 			 */
+			/*
+			 * We have to prevent sharing of fds between children, so
+			 * we have to dup the queue fd.
+			 */
+			newqf = fdopen(dup(fileno(it->queuef)), "r");
+			if (newqf == NULL) {
+				syslog(LOG_ERR, "can not dup queue fd: %m");
+				exit(1);
+			}
+			fclose(it->queuef);
+			it->queuef = newqf;
 			return (it);
 
 		default:
-- 
1.6.2.149.g6462





More information about the Submit mailing list