From 1bcf431f2d0ed972d7f25f71e559e2c8fcd200df Mon Sep 17 00:00:00 2001 From: Mike Christie Date: Mon, 7 Dec 2009 10:50:15 -0600 Subject: [PATCH] do not use a semarg in shared-mem for semop calls From guy keren: each process must have its own semarg structure - or they step on each others' toes - which could cause either deadlocks or smearing of the shared memory protected by the semaphore. Signed-off-by: guy keren diff --git a/usr/log.c b/usr/log.c index 0fb1595..08a33de 100644 --- a/usr/log.c +++ b/usr/log.c @@ -261,16 +261,21 @@ static void log_syslog (void * buff) static void dolog(int prio, const char *fmt, va_list ap) { if (log_daemon) { - la->ops[0].sem_op = -1; - if (semop(la->semid, la->ops, 1) < 0) { + struct sembuf ops[1]; + + ops[0].sem_num = la->ops[0].sem_num; + ops[0].sem_flg = la->ops[0].sem_flg; + + ops[0].sem_op = -1; + if (semop(la->semid, ops, 1) < 0) { syslog(LOG_ERR, "semop up failed %d", errno); return; } log_enqueue(prio, fmt, ap); - la->ops[0].sem_op = 1; - if (semop(la->semid, la->ops, 1) < 0) { + ops[0].sem_op = 1; + if (semop(la->semid, ops, 1) < 0) { syslog(LOG_ERR, "semop down failed"); return; } @@ -347,16 +352,21 @@ static void __dump_char(int level, unsigned char *buf, int *cp, int ch) static void log_flush(void) { int msglen; + struct sembuf ops[1]; + + ops[0].sem_num = la->ops[0].sem_num; + ops[0].sem_flg = la->ops[0].sem_flg; + while (!la->empty) { - la->ops[0].sem_op = -1; - if (semop(la->semid, la->ops, 1) < 0) { + ops[0].sem_op = -1; + if (semop(la->semid, ops, 1) < 0) { syslog(LOG_ERR, "semop up failed %d", errno); exit(1); } msglen = log_dequeue(la->buff); - la->ops[0].sem_op = 1; - if (semop(la->semid, la->ops, 1) < 0) { + ops[0].sem_op = 1; + if (semop(la->semid, ops, 1) < 0) { syslog(LOG_ERR, "semop down failed"); exit(1); }