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

看板DFBSD_submit作者時間16年前 (2009/07/10 06:01), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串1/1
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@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..793e327 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(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 --------------040706010300080401090600--
文章代碼(AID): #1ALcYap_ (DFBSD_submit)