diff options
author | John Beck <John.Beck@Sun.COM> | 2010-01-06 13:22:51 -0800 |
---|---|---|
committer | John Beck <John.Beck@Sun.COM> | 2010-01-06 13:22:51 -0800 |
commit | e9af4bc0b1cc30cea75d6ad4aa2fde97d985e9be (patch) | |
tree | 6a7ad97561f2580625546f56c063c89ebb3b92dd /usr/src/cmd/sendmail/libsm/sem.c | |
parent | 5f8171005a0c33f3c67f7da52d41c2362c3fd891 (diff) | |
download | illumos-joyent-e9af4bc0b1cc30cea75d6ad4aa2fde97d985e9be.tar.gz |
6913961 upgrade sendmail to 8.14.4
6790772 Array overrun in sendmail
Diffstat (limited to 'usr/src/cmd/sendmail/libsm/sem.c')
-rw-r--r-- | usr/src/cmd/sendmail/libsm/sem.c | 48 |
1 files changed, 44 insertions, 4 deletions
diff --git a/usr/src/cmd/sendmail/libsm/sem.c b/usr/src/cmd/sendmail/libsm/sem.c index d1dcca4060..83a54e32e1 100644 --- a/usr/src/cmd/sendmail/libsm/sem.c +++ b/usr/src/cmd/sendmail/libsm/sem.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2001, 2005 Sendmail, Inc. and its suppliers. + * Copyright (c) 2000-2001, 2005, 2008 Sendmail, Inc. and its suppliers. * All rights reserved. * * By using this file, you agree to the terms and conditions set @@ -7,14 +7,13 @@ * the sendmail distribution. */ -#pragma ident "%Z%%M% %I% %E% SMI" - #include <sm/gen.h> -SM_RCSID("@(#)$Id: sem.c,v 1.13 2005/08/12 20:39:59 ca Exp $") +SM_RCSID("@(#)$Id: sem.c,v 1.14 2008/05/30 16:26:38 ca Exp $") #if SM_CONF_SEM # include <stdlib.h> # include <unistd.h> +# include <sm/string.h> # include <sm/sem.h> # include <sm/heap.h> # include <errno.h> @@ -202,4 +201,45 @@ sm_sem_get(semid, semnum) return -1; return semval; } + +/* +** SM_SEMSETOWNER -- set owner/group/mode of semaphores. +** +** Parameters: +** semid -- id for semaphores. +** uid -- uid to use +** gid -- gid to use +** mode -- mode to use +** +** Returns: +** 0 on success. +** < 0 on failure. +*/ + +int +sm_semsetowner(semid, uid, gid, mode) + int semid; + uid_t uid; + gid_t gid; + mode_t mode; +{ + int r; + struct semid_ds semidds; + union semun { + int val; + struct semid_ds *buf; + ushort *array; + } arg; + + memset(&semidds, 0, sizeof(semidds)); + arg.buf = &semidds; + if ((r = semctl(semid, 1, IPC_STAT, arg)) < 0) + return r; + semidds.sem_perm.uid = uid; + semidds.sem_perm.gid = gid; + semidds.sem_perm.mode = mode; + if ((r = semctl(semid, 1, IPC_SET, arg)) < 0) + return r; + return 0; +} #endif /* SM_CONF_SEM */ |