|
Ian Kent |
e24555 |
diff -up autofs-5.0.1/modules/mount_changer.c.fd-close-on-exec-mutex autofs-5.0.1/modules/mount_changer.c
|
|
Ian Kent |
e24555 |
--- autofs-5.0.1/modules/mount_changer.c.fd-close-on-exec-mutex 2007-02-20 13:59:13.000000000 +0900
|
|
Ian Kent |
e24555 |
+++ autofs-5.0.1/modules/mount_changer.c 2007-12-18 11:47:58.000000000 +0900
|
|
Ian Kent |
e24555 |
@@ -34,6 +34,8 @@
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
#define MODPREFIX "mount(changer): "
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
+extern pthread_mutex_t fd_mutex;
|
|
Ian Kent |
e24555 |
+
|
|
Ian Kent |
e24555 |
int mount_version = AUTOFS_MOUNT_VERSION; /* Required by protocol */
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
int swapCD(const char *device, const char *slotName);
|
|
Ian Kent |
e24555 |
@@ -158,11 +160,18 @@ int swapCD(const char *device, const cha
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
slot = atoi(slotName) - 1;
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
+ status = pthread_mutex_lock(&fd_mutex);
|
|
Ian Kent |
e24555 |
+ if (status)
|
|
Ian Kent |
e24555 |
+ fatal(status);
|
|
Ian Kent |
e24555 |
+
|
|
Ian Kent |
e24555 |
/* open device */
|
|
Ian Kent |
e24555 |
fd = open(device, O_RDONLY | O_NONBLOCK);
|
|
Ian Kent |
e24555 |
if (fd < 0) {
|
|
Ian Kent |
e24555 |
error(LOGOPT_ANY, MODPREFIX "Opening device %s failed : %s",
|
|
Ian Kent |
e24555 |
device, strerror(errno));
|
|
Ian Kent |
e24555 |
+ status = pthread_mutex_unlock(&fd_mutex);
|
|
Ian Kent |
e24555 |
+ if (status)
|
|
Ian Kent |
e24555 |
+ fatal(status);
|
|
Ian Kent |
e24555 |
return 1;
|
|
Ian Kent |
e24555 |
}
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
@@ -171,6 +180,10 @@ int swapCD(const char *device, const cha
|
|
Ian Kent |
e24555 |
fcntl(fd, F_SETFD, cl_flags);
|
|
Ian Kent |
e24555 |
}
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
+ status = pthread_mutex_unlock(&fd_mutex);
|
|
Ian Kent |
e24555 |
+ if (status)
|
|
Ian Kent |
e24555 |
+ fatal(status);
|
|
Ian Kent |
e24555 |
+
|
|
Ian Kent |
e24555 |
/* Check CD player status */
|
|
Ian Kent |
e24555 |
total_slots_available = ioctl(fd, CDROM_CHANGER_NSLOTS);
|
|
Ian Kent |
e24555 |
if (total_slots_available <= 1) {
|
|
Ian Kent |
e24555 |
diff -up autofs-5.0.1/modules/replicated.c.fd-close-on-exec-mutex autofs-5.0.1/modules/replicated.c
|
|
Ian Kent |
e24555 |
--- autofs-5.0.1/modules/replicated.c.fd-close-on-exec-mutex 2007-12-18 11:13:48.000000000 +0900
|
|
Ian Kent |
e24555 |
+++ autofs-5.0.1/modules/replicated.c 2007-12-18 11:49:55.000000000 +0900
|
|
Ian Kent |
e24555 |
@@ -76,6 +76,8 @@
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
extern unsigned int random_selection;
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
+extern pthread_mutex_t fd_mutex;
|
|
Ian Kent |
e24555 |
+
|
|
Ian Kent |
e24555 |
void seed_random(void)
|
|
Ian Kent |
e24555 |
{
|
|
Ian Kent |
e24555 |
int fd;
|
|
Ian Kent |
e24555 |
@@ -104,7 +106,7 @@ static unsigned int get_proximity(const
|
|
Ian Kent |
e24555 |
char tmp[20], buf[MAX_ERR_BUF], *ptr;
|
|
Ian Kent |
e24555 |
struct ifconf ifc;
|
|
Ian Kent |
e24555 |
struct ifreq *ifr, nmptr;
|
|
Ian Kent |
e24555 |
- int sock, cl_flags, ret, i;
|
|
Ian Kent |
e24555 |
+ int sock, cl_flags, ret, i, status;
|
|
Ian Kent |
e24555 |
uint32_t mask, ha, ia;
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
memcpy(tmp, host_addr, addr_len);
|
|
Ian Kent |
e24555 |
@@ -112,10 +114,17 @@ static unsigned int get_proximity(const
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
ha = ntohl((uint32_t) hst_addr->s_addr);
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
+ status = pthread_mutex_lock(&fd_mutex);
|
|
Ian Kent |
e24555 |
+ if (status)
|
|
Ian Kent |
e24555 |
+ fatal(status);
|
|
Ian Kent |
e24555 |
+
|
|
Ian Kent |
e24555 |
sock = socket(AF_INET, SOCK_DGRAM, 0);
|
|
Ian Kent |
e24555 |
if (sock < 0) {
|
|
Ian Kent |
e24555 |
char *estr = strerror_r(errno, buf, MAX_ERR_BUF);
|
|
Ian Kent |
e24555 |
error(LOGOPT_ANY, "socket creation failed: %s", estr);
|
|
Ian Kent |
e24555 |
+ status = pthread_mutex_unlock(&fd_mutex);
|
|
Ian Kent |
e24555 |
+ if (status)
|
|
Ian Kent |
e24555 |
+ fatal(status);
|
|
Ian Kent |
e24555 |
return PROXIMITY_ERROR;
|
|
Ian Kent |
e24555 |
}
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
@@ -124,6 +133,10 @@ static unsigned int get_proximity(const
|
|
Ian Kent |
e24555 |
fcntl(sock, F_SETFD, cl_flags);
|
|
Ian Kent |
e24555 |
}
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
+ status = pthread_mutex_unlock(&fd_mutex);
|
|
Ian Kent |
e24555 |
+ if (status)
|
|
Ian Kent |
e24555 |
+ fatal(status);
|
|
Ian Kent |
e24555 |
+
|
|
Ian Kent |
e24555 |
ifc.ifc_len = sizeof(buf);
|
|
Ian Kent |
e24555 |
ifc.ifc_req = (struct ifreq *) buf;
|
|
Ian Kent |
e24555 |
ret = ioctl(sock, SIOCGIFCONF, &ifc;;
|
|
Ian Kent |
e24555 |
diff -up autofs-5.0.1/modules/lookup_file.c.fd-close-on-exec-mutex autofs-5.0.1/modules/lookup_file.c
|
|
Ian Kent |
e24555 |
--- autofs-5.0.1/modules/lookup_file.c.fd-close-on-exec-mutex 2007-12-18 11:13:48.000000000 +0900
|
|
Ian Kent |
e24555 |
+++ autofs-5.0.1/modules/lookup_file.c 2007-12-18 11:46:30.000000000 +0900
|
|
Ian Kent |
e24555 |
@@ -36,6 +36,8 @@
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
#define MAX_INCLUDE_DEPTH 16
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
+extern pthread_mutex_t fd_mutex;
|
|
Ian Kent |
e24555 |
+
|
|
Ian Kent |
e24555 |
typedef enum {
|
|
Ian Kent |
e24555 |
st_begin, st_compare, st_star, st_badent, st_entspc, st_getent
|
|
Ian Kent |
e24555 |
} LOOKUP_STATE;
|
|
Ian Kent |
e24555 |
@@ -394,7 +396,7 @@ int lookup_read_master(struct master *ma
|
|
Ian Kent |
e24555 |
char *ent;
|
|
Ian Kent |
e24555 |
struct stat st;
|
|
Ian Kent |
e24555 |
FILE *f;
|
|
Ian Kent |
e24555 |
- int fd, cl_flags;
|
|
Ian Kent |
e24555 |
+ int fd, cl_flags, status;
|
|
Ian Kent |
e24555 |
unsigned int path_len, ent_len;
|
|
Ian Kent |
e24555 |
int entry, cur_state;
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
@@ -422,11 +424,18 @@ int lookup_read_master(struct master *ma
|
|
Ian Kent |
e24555 |
return NSS_STATUS_UNAVAIL;
|
|
Ian Kent |
e24555 |
}
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
+ status = pthread_mutex_lock(&fd_mutex);
|
|
Ian Kent |
e24555 |
+ if (status)
|
|
Ian Kent |
e24555 |
+ fatal(status);
|
|
Ian Kent |
e24555 |
+
|
|
Ian Kent |
e24555 |
f = fopen(ctxt->mapname, "r");
|
|
Ian Kent |
e24555 |
if (!f) {
|
|
Ian Kent |
e24555 |
error(LOGOPT_ANY,
|
|
Ian Kent |
e24555 |
MODPREFIX "could not open master map file %s",
|
|
Ian Kent |
e24555 |
ctxt->mapname);
|
|
Ian Kent |
e24555 |
+ status = pthread_mutex_unlock(&fd_mutex);
|
|
Ian Kent |
e24555 |
+ if (status)
|
|
Ian Kent |
e24555 |
+ fatal(status);
|
|
Ian Kent |
e24555 |
return NSS_STATUS_UNAVAIL;
|
|
Ian Kent |
e24555 |
}
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
@@ -437,6 +446,10 @@ int lookup_read_master(struct master *ma
|
|
Ian Kent |
e24555 |
fcntl(fd, F_SETFD, cl_flags);
|
|
Ian Kent |
e24555 |
}
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
+ status = pthread_mutex_unlock(&fd_mutex);
|
|
Ian Kent |
e24555 |
+ if (status)
|
|
Ian Kent |
e24555 |
+ fatal(status);
|
|
Ian Kent |
e24555 |
+
|
|
Ian Kent |
e24555 |
while(1) {
|
|
Ian Kent |
e24555 |
entry = read_one(f, path, &path_len, ent, &ent_len);
|
|
Ian Kent |
e24555 |
if (!entry) {
|
|
Ian Kent |
e24555 |
@@ -631,7 +644,7 @@ int lookup_read_map(struct autofs_point
|
|
Ian Kent |
e24555 |
char *mapent;
|
|
Ian Kent |
e24555 |
struct stat st;
|
|
Ian Kent |
e24555 |
FILE *f;
|
|
Ian Kent |
e24555 |
- int fd, cl_flags;
|
|
Ian Kent |
e24555 |
+ int fd, cl_flags, status;
|
|
Ian Kent |
e24555 |
unsigned int k_len, m_len;
|
|
Ian Kent |
e24555 |
int entry;
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
@@ -664,10 +677,17 @@ int lookup_read_map(struct autofs_point
|
|
Ian Kent |
e24555 |
return NSS_STATUS_UNAVAIL;
|
|
Ian Kent |
e24555 |
}
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
+ status = pthread_mutex_lock(&fd_mutex);
|
|
Ian Kent |
e24555 |
+ if (status)
|
|
Ian Kent |
e24555 |
+ fatal(status);
|
|
Ian Kent |
e24555 |
+
|
|
Ian Kent |
e24555 |
f = fopen(ctxt->mapname, "r");
|
|
Ian Kent |
e24555 |
if (!f) {
|
|
Ian Kent |
e24555 |
error(ap->logopt,
|
|
Ian Kent |
e24555 |
MODPREFIX "could not open map file %s", ctxt->mapname);
|
|
Ian Kent |
e24555 |
+ status = pthread_mutex_unlock(&fd_mutex);
|
|
Ian Kent |
e24555 |
+ if (status)
|
|
Ian Kent |
e24555 |
+ fatal(status);
|
|
Ian Kent |
e24555 |
return NSS_STATUS_UNAVAIL;
|
|
Ian Kent |
e24555 |
}
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
@@ -678,6 +698,10 @@ int lookup_read_map(struct autofs_point
|
|
Ian Kent |
e24555 |
fcntl(fd, F_SETFD, cl_flags);
|
|
Ian Kent |
e24555 |
}
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
+ status = pthread_mutex_unlock(&fd_mutex);
|
|
Ian Kent |
e24555 |
+ if (status)
|
|
Ian Kent |
e24555 |
+ fatal(status);
|
|
Ian Kent |
e24555 |
+
|
|
Ian Kent |
e24555 |
while(1) {
|
|
Ian Kent |
e24555 |
entry = read_one(f, key, &k_len, mapent, &m_len);
|
|
Ian Kent |
e24555 |
if (!entry) {
|
|
Ian Kent |
e24555 |
@@ -756,7 +780,7 @@ static int lookup_one(struct autofs_poin
|
|
Ian Kent |
e24555 |
char mapent[MAPENT_MAX_LEN + 1];
|
|
Ian Kent |
e24555 |
time_t age = time(NULL);
|
|
Ian Kent |
e24555 |
FILE *f;
|
|
Ian Kent |
e24555 |
- int fd, cl_flags;
|
|
Ian Kent |
e24555 |
+ int fd, cl_flags, status;
|
|
Ian Kent |
e24555 |
unsigned int k_len, m_len;
|
|
Ian Kent |
e24555 |
int entry, ret;
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
@@ -766,10 +790,17 @@ static int lookup_one(struct autofs_poin
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
mc = source->mc;
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
+ status = pthread_mutex_lock(&fd_mutex);
|
|
Ian Kent |
e24555 |
+ if (status)
|
|
Ian Kent |
e24555 |
+ fatal(status);
|
|
Ian Kent |
e24555 |
+
|
|
Ian Kent |
e24555 |
f = fopen(ctxt->mapname, "r");
|
|
Ian Kent |
e24555 |
if (!f) {
|
|
Ian Kent |
e24555 |
error(ap->logopt,
|
|
Ian Kent |
e24555 |
MODPREFIX "could not open map file %s", ctxt->mapname);
|
|
Ian Kent |
e24555 |
+ status = pthread_mutex_unlock(&fd_mutex);
|
|
Ian Kent |
e24555 |
+ if (status)
|
|
Ian Kent |
e24555 |
+ fatal(status);
|
|
Ian Kent |
e24555 |
return CHE_FAIL;
|
|
Ian Kent |
e24555 |
}
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
@@ -780,6 +811,10 @@ static int lookup_one(struct autofs_poin
|
|
Ian Kent |
e24555 |
fcntl(fd, F_SETFD, cl_flags);
|
|
Ian Kent |
e24555 |
}
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
+ status = pthread_mutex_unlock(&fd_mutex);
|
|
Ian Kent |
e24555 |
+ if (status)
|
|
Ian Kent |
e24555 |
+ fatal(status);
|
|
Ian Kent |
e24555 |
+
|
|
Ian Kent |
e24555 |
while(1) {
|
|
Ian Kent |
e24555 |
entry = read_one(f, mkey, &k_len, mapent, &m_len);
|
|
Ian Kent |
e24555 |
if (entry) {
|
|
Ian Kent |
e24555 |
@@ -863,7 +898,7 @@ static int lookup_wild(struct autofs_poi
|
|
Ian Kent |
e24555 |
char mapent[MAPENT_MAX_LEN + 1];
|
|
Ian Kent |
e24555 |
time_t age = time(NULL);
|
|
Ian Kent |
e24555 |
FILE *f;
|
|
Ian Kent |
e24555 |
- int fd, cl_flags;
|
|
Ian Kent |
e24555 |
+ int fd, cl_flags, status;
|
|
Ian Kent |
e24555 |
unsigned int k_len, m_len;
|
|
Ian Kent |
e24555 |
int entry, ret;
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
@@ -873,10 +908,17 @@ static int lookup_wild(struct autofs_poi
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
mc = source->mc;
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
+ status = pthread_mutex_lock(&fd_mutex);
|
|
Ian Kent |
e24555 |
+ if (status)
|
|
Ian Kent |
e24555 |
+ fatal(status);
|
|
Ian Kent |
e24555 |
+
|
|
Ian Kent |
e24555 |
f = fopen(ctxt->mapname, "r");
|
|
Ian Kent |
e24555 |
if (!f) {
|
|
Ian Kent |
e24555 |
error(ap->logopt,
|
|
Ian Kent |
e24555 |
MODPREFIX "could not open map file %s", ctxt->mapname);
|
|
Ian Kent |
e24555 |
+ status = pthread_mutex_unlock(&fd_mutex);
|
|
Ian Kent |
e24555 |
+ if (status)
|
|
Ian Kent |
e24555 |
+ fatal(status);
|
|
Ian Kent |
e24555 |
return CHE_FAIL;
|
|
Ian Kent |
e24555 |
}
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
@@ -887,6 +929,10 @@ static int lookup_wild(struct autofs_poi
|
|
Ian Kent |
e24555 |
fcntl(fd, F_SETFD, cl_flags);
|
|
Ian Kent |
e24555 |
}
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
+ status = pthread_mutex_unlock(&fd_mutex);
|
|
Ian Kent |
e24555 |
+ if (status)
|
|
Ian Kent |
e24555 |
+ fatal(status);
|
|
Ian Kent |
e24555 |
+
|
|
Ian Kent |
e24555 |
while(1) {
|
|
Ian Kent |
e24555 |
entry = read_one(f, mkey, &k_len, mapent, &m_len);
|
|
Ian Kent |
e24555 |
if (entry) {
|
|
Ian Kent |
e24555 |
diff -up autofs-5.0.1/daemon/indirect.c.fd-close-on-exec-mutex autofs-5.0.1/daemon/indirect.c
|
|
Ian Kent |
e24555 |
--- autofs-5.0.1/daemon/indirect.c.fd-close-on-exec-mutex 2007-12-18 11:13:48.000000000 +0900
|
|
Ian Kent |
e24555 |
+++ autofs-5.0.1/daemon/indirect.c 2007-12-18 11:31:27.000000000 +0900
|
|
Ian Kent |
e24555 |
@@ -43,9 +43,11 @@ extern pthread_attr_t thread_attr;
|
|
Ian Kent |
e24555 |
static pthread_mutex_t ma_mutex = PTHREAD_MUTEX_INITIALIZER;
|
|
Ian Kent |
e24555 |
static pthread_mutex_t ea_mutex = PTHREAD_MUTEX_INITIALIZER;
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
+extern pthread_mutex_t fd_mutex;
|
|
Ian Kent |
e24555 |
+
|
|
Ian Kent |
e24555 |
static int autofs_init_indirect(struct autofs_point *ap)
|
|
Ian Kent |
e24555 |
{
|
|
Ian Kent |
e24555 |
- int pipefd[2], cl_flags;
|
|
Ian Kent |
e24555 |
+ int pipefd[2], cl_flags, status;
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
if ((ap->state != ST_INIT)) {
|
|
Ian Kent |
e24555 |
/* This can happen if an autofs process is already running*/
|
|
Ian Kent |
e24555 |
@@ -55,12 +57,19 @@ static int autofs_init_indirect(struct a
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
ap->pipefd = ap->kpipefd = ap->ioctlfd = -1;
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
+ status = pthread_mutex_lock(&fd_mutex);
|
|
Ian Kent |
e24555 |
+ if (status)
|
|
Ian Kent |
e24555 |
+ fatal(status);
|
|
Ian Kent |
e24555 |
+
|
|
Ian Kent |
e24555 |
/* Pipe for kernel communications */
|
|
Ian Kent |
e24555 |
if (pipe(pipefd) < 0) {
|
|
Ian Kent |
e24555 |
crit(ap->logopt,
|
|
Ian Kent |
e24555 |
"failed to create commumication pipe for autofs path %s",
|
|
Ian Kent |
e24555 |
ap->path);
|
|
Ian Kent |
e24555 |
free(ap->path);
|
|
Ian Kent |
e24555 |
+ status = pthread_mutex_unlock(&fd_mutex);
|
|
Ian Kent |
e24555 |
+ if (status)
|
|
Ian Kent |
e24555 |
+ fatal(status);
|
|
Ian Kent |
e24555 |
return -1;
|
|
Ian Kent |
e24555 |
}
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
@@ -84,6 +93,9 @@ static int autofs_init_indirect(struct a
|
|
Ian Kent |
e24555 |
close(ap->pipefd);
|
|
Ian Kent |
e24555 |
close(ap->kpipefd); /* Close kernel pipe end */
|
|
Ian Kent |
e24555 |
free(ap->path);
|
|
Ian Kent |
e24555 |
+ status = pthread_mutex_unlock(&fd_mutex);
|
|
Ian Kent |
e24555 |
+ if (status)
|
|
Ian Kent |
e24555 |
+ fatal(status);
|
|
Ian Kent |
e24555 |
return -1;
|
|
Ian Kent |
e24555 |
}
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
@@ -97,6 +109,10 @@ static int autofs_init_indirect(struct a
|
|
Ian Kent |
e24555 |
fcntl(ap->state_pipe[1], F_SETFD, cl_flags);
|
|
Ian Kent |
e24555 |
}
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
+ status = pthread_mutex_unlock(&fd_mutex);
|
|
Ian Kent |
e24555 |
+ if (status)
|
|
Ian Kent |
e24555 |
+ fatal(status);
|
|
Ian Kent |
e24555 |
+
|
|
Ian Kent |
e24555 |
return 0;
|
|
Ian Kent |
e24555 |
}
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
@@ -150,7 +166,7 @@ static int do_mount_autofs_indirect(stru
|
|
Ian Kent |
e24555 |
const char *type, *map_name = NULL;
|
|
Ian Kent |
e24555 |
struct stat st;
|
|
Ian Kent |
e24555 |
struct mnt_list *mnts;
|
|
Ian Kent |
e24555 |
- int cl_flags, ret;
|
|
Ian Kent |
e24555 |
+ int cl_flags, ret, status;
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
mnts = get_mnt_list(_PROC_MOUNTS, ap->path, 1);
|
|
Ian Kent |
e24555 |
if (mnts) {
|
|
Ian Kent |
e24555 |
@@ -204,11 +220,18 @@ static int do_mount_autofs_indirect(stru
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
options = NULL;
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
+ status = pthread_mutex_lock(&fd_mutex);
|
|
Ian Kent |
e24555 |
+ if (status)
|
|
Ian Kent |
e24555 |
+ fatal(status);
|
|
Ian Kent |
e24555 |
+
|
|
Ian Kent |
e24555 |
/* Root directory for ioctl()'s */
|
|
Ian Kent |
e24555 |
ap->ioctlfd = open(ap->path, O_RDONLY);
|
|
Ian Kent |
e24555 |
if (ap->ioctlfd < 0) {
|
|
Ian Kent |
e24555 |
crit(ap->logopt,
|
|
Ian Kent |
e24555 |
"failed to create ioctl fd for autofs path %s", ap->path);
|
|
Ian Kent |
e24555 |
+ status = pthread_mutex_unlock(&fd_mutex);
|
|
Ian Kent |
e24555 |
+ if (status)
|
|
Ian Kent |
e24555 |
+ fatal(status);
|
|
Ian Kent |
e24555 |
goto out_umount;
|
|
Ian Kent |
e24555 |
}
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
@@ -217,6 +240,10 @@ static int do_mount_autofs_indirect(stru
|
|
Ian Kent |
e24555 |
fcntl(ap->ioctlfd, F_SETFD, cl_flags);
|
|
Ian Kent |
e24555 |
}
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
+ status = pthread_mutex_unlock(&fd_mutex);
|
|
Ian Kent |
e24555 |
+ if (status)
|
|
Ian Kent |
e24555 |
+ fatal(status);
|
|
Ian Kent |
e24555 |
+
|
|
Ian Kent |
e24555 |
ap->exp_runfreq = (timeout + CHECK_RATIO - 1) / CHECK_RATIO;
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
ioctl(ap->ioctlfd, AUTOFS_IOC_SETTIMEOUT, &timeout);
|
|
Ian Kent |
e24555 |
diff -up autofs-5.0.1/daemon/spawn.c.fd-close-on-exec-mutex autofs-5.0.1/daemon/spawn.c
|
|
Ian Kent |
e24555 |
--- autofs-5.0.1/daemon/spawn.c.fd-close-on-exec-mutex 2007-12-18 11:13:48.000000000 +0900
|
|
Ian Kent |
e24555 |
+++ autofs-5.0.1/daemon/spawn.c 2007-12-18 11:14:39.000000000 +0900
|
|
Ian Kent |
e24555 |
@@ -28,6 +28,7 @@
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
#include "automount.h"
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
+pthread_mutex_t fd_mutex = PTHREAD_MUTEX_INITIALIZER;
|
|
Ian Kent |
e24555 |
static pthread_mutex_t spawn_mutex = PTHREAD_MUTEX_INITIALIZER;
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
#define SPAWN_OPT_NONE 0x0000
|
|
Ian Kent |
e24555 |
@@ -122,6 +123,10 @@ static int do_spawn(logger *log, unsigne
|
|
Ian Kent |
e24555 |
egid = tsv->gid;
|
|
Ian Kent |
e24555 |
}
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
+ status = pthread_mutex_lock(&fd_mutex);
|
|
Ian Kent |
e24555 |
+ if (status)
|
|
Ian Kent |
e24555 |
+ fatal(status);
|
|
Ian Kent |
e24555 |
+
|
|
Ian Kent |
e24555 |
f = fork();
|
|
Ian Kent |
e24555 |
if (f == 0) {
|
|
Ian Kent |
e24555 |
reset_signals();
|
|
Ian Kent |
e24555 |
@@ -130,6 +135,10 @@ static int do_spawn(logger *log, unsigne
|
|
Ian Kent |
e24555 |
dup2(pipefd[1], STDERR_FILENO);
|
|
Ian Kent |
e24555 |
close(pipefd[1]);
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
+ status = pthread_mutex_unlock(&fd_mutex);
|
|
Ian Kent |
e24555 |
+ if (status)
|
|
Ian Kent |
e24555 |
+ fatal(status);
|
|
Ian Kent |
e24555 |
+
|
|
Ian Kent |
e24555 |
/* Bind mount - check target exists */
|
|
Ian Kent |
e24555 |
if (use_access) {
|
|
Ian Kent |
e24555 |
char **pargv = (char **) argv;
|
|
Ian Kent |
e24555 |
@@ -165,6 +174,10 @@ static int do_spawn(logger *log, unsigne
|
|
Ian Kent |
e24555 |
} else {
|
|
Ian Kent |
e24555 |
tmpsig = oldsig;
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
+ status = pthread_mutex_unlock(&fd_mutex);
|
|
Ian Kent |
e24555 |
+ if (status)
|
|
Ian Kent |
e24555 |
+ fatal(status);
|
|
Ian Kent |
e24555 |
+
|
|
Ian Kent |
e24555 |
sigaddset(&tmpsig, SIGCHLD);
|
|
Ian Kent |
e24555 |
pthread_sigmask(SIG_SETMASK, &tmpsig, NULL);
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
diff -up autofs-5.0.1/daemon/automount.c.fd-close-on-exec-mutex autofs-5.0.1/daemon/automount.c
|
|
Ian Kent |
e24555 |
--- autofs-5.0.1/daemon/automount.c.fd-close-on-exec-mutex 2007-12-18 11:13:48.000000000 +0900
|
|
Ian Kent |
e24555 |
+++ autofs-5.0.1/daemon/automount.c 2007-12-18 11:14:39.000000000 +0900
|
|
Ian Kent |
e24555 |
@@ -81,6 +81,7 @@ static int umount_all(struct autofs_poin
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
extern pthread_mutex_t master_mutex;
|
|
Ian Kent |
e24555 |
extern struct master *master_list;
|
|
Ian Kent |
e24555 |
+extern pthread_mutex_t fd_mutex;
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
static int do_mkdir(const char *parent, const char *path, mode_t mode)
|
|
Ian Kent |
e24555 |
{
|
|
Ian Kent |
e24555 |
@@ -756,6 +757,10 @@ static int mount_autofs(struct autofs_po
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
ap->state = ST_READY;
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
+ status = pthread_mutex_unlock(&fd_mutex);
|
|
Ian Kent |
e24555 |
+ if (status)
|
|
Ian Kent |
e24555 |
+ fatal(status);
|
|
Ian Kent |
e24555 |
+
|
|
Ian Kent |
e24555 |
return 0;
|
|
Ian Kent |
e24555 |
}
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
diff -up autofs-5.0.1/daemon/direct.c.fd-close-on-exec-mutex autofs-5.0.1/daemon/direct.c
|
|
Ian Kent |
e24555 |
--- autofs-5.0.1/daemon/direct.c.fd-close-on-exec-mutex 2007-12-18 11:13:48.000000000 +0900
|
|
Ian Kent |
e24555 |
+++ autofs-5.0.1/daemon/direct.c 2007-12-18 11:26:52.000000000 +0900
|
|
Ian Kent |
e24555 |
@@ -53,6 +53,8 @@ pthread_once_t key_mnt_params_once = PTH
|
|
Ian Kent |
e24555 |
static pthread_mutex_t ma_mutex = PTHREAD_MUTEX_INITIALIZER;
|
|
Ian Kent |
e24555 |
static pthread_mutex_t ea_mutex = PTHREAD_MUTEX_INITIALIZER;
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
+extern pthread_mutex_t fd_mutex;
|
|
Ian Kent |
e24555 |
+
|
|
Ian Kent |
e24555 |
static void key_mnt_params_destroy(void *arg)
|
|
Ian Kent |
e24555 |
{
|
|
Ian Kent |
e24555 |
struct mnt_params *mp;
|
|
Ian Kent |
e24555 |
@@ -88,7 +90,7 @@ static void mnts_cleanup(void *arg)
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
static int autofs_init_direct(struct autofs_point *ap)
|
|
Ian Kent |
e24555 |
{
|
|
Ian Kent |
e24555 |
- int pipefd[2], cl_flags;
|
|
Ian Kent |
e24555 |
+ int pipefd[2], cl_flags, status;
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
if ((ap->state != ST_INIT)) {
|
|
Ian Kent |
e24555 |
/* This can happen if an autofs process is already running*/
|
|
Ian Kent |
e24555 |
@@ -98,11 +100,18 @@ static int autofs_init_direct(struct aut
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
ap->pipefd = ap->kpipefd = ap->ioctlfd = -1;
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
+ status = pthread_mutex_lock(&fd_mutex);
|
|
Ian Kent |
e24555 |
+ if (status)
|
|
Ian Kent |
e24555 |
+ fatal(status);
|
|
Ian Kent |
e24555 |
+
|
|
Ian Kent |
e24555 |
/* Pipe for kernel communications */
|
|
Ian Kent |
e24555 |
if (pipe(pipefd) < 0) {
|
|
Ian Kent |
e24555 |
crit(ap->logopt,
|
|
Ian Kent |
e24555 |
"failed to create commumication pipe for autofs path %s",
|
|
Ian Kent |
e24555 |
ap->path);
|
|
Ian Kent |
e24555 |
+ status = pthread_mutex_unlock(&fd_mutex);
|
|
Ian Kent |
e24555 |
+ if (status)
|
|
Ian Kent |
e24555 |
+ fatal(status);
|
|
Ian Kent |
e24555 |
return -1;
|
|
Ian Kent |
e24555 |
}
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
@@ -125,6 +134,9 @@ static int autofs_init_direct(struct aut
|
|
Ian Kent |
e24555 |
ap->path);
|
|
Ian Kent |
e24555 |
close(ap->pipefd);
|
|
Ian Kent |
e24555 |
close(ap->kpipefd);
|
|
Ian Kent |
e24555 |
+ status = pthread_mutex_unlock(&fd_mutex);
|
|
Ian Kent |
e24555 |
+ if (status)
|
|
Ian Kent |
e24555 |
+ fatal(status);
|
|
Ian Kent |
e24555 |
return -1;
|
|
Ian Kent |
e24555 |
}
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
@@ -138,6 +150,10 @@ static int autofs_init_direct(struct aut
|
|
Ian Kent |
e24555 |
fcntl(ap->state_pipe[1], F_SETFD, cl_flags);
|
|
Ian Kent |
e24555 |
}
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
+ status = pthread_mutex_unlock(&fd_mutex);
|
|
Ian Kent |
e24555 |
+ if (status)
|
|
Ian Kent |
e24555 |
+ fatal(status);
|
|
Ian Kent |
e24555 |
+
|
|
Ian Kent |
e24555 |
return 0;
|
|
Ian Kent |
e24555 |
}
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
@@ -162,7 +178,11 @@ int do_umount_autofs_direct(struct autof
|
|
Ian Kent |
e24555 |
}
|
|
Ian Kent |
e24555 |
ioctlfd = me->ioctlfd;
|
|
Ian Kent |
e24555 |
} else {
|
|
Ian Kent |
e24555 |
- int cl_flags;
|
|
Ian Kent |
e24555 |
+ int cl_flags, status;
|
|
Ian Kent |
e24555 |
+
|
|
Ian Kent |
e24555 |
+ status = pthread_mutex_lock(&fd_mutex);
|
|
Ian Kent |
e24555 |
+ if (status)
|
|
Ian Kent |
e24555 |
+ fatal(status);
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
ioctlfd = open(me->key, O_RDONLY);
|
|
Ian Kent |
e24555 |
if (ioctlfd != -1) {
|
|
Ian Kent |
e24555 |
@@ -171,6 +191,10 @@ int do_umount_autofs_direct(struct autof
|
|
Ian Kent |
e24555 |
fcntl(ioctlfd, F_SETFD, cl_flags);
|
|
Ian Kent |
e24555 |
}
|
|
Ian Kent |
e24555 |
}
|
|
Ian Kent |
e24555 |
+
|
|
Ian Kent |
e24555 |
+ status = pthread_mutex_unlock(&fd_mutex);
|
|
Ian Kent |
e24555 |
+ if (status)
|
|
Ian Kent |
e24555 |
+ fatal(status);
|
|
Ian Kent |
e24555 |
}
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
@@ -364,11 +388,15 @@ int do_mount_autofs_direct(struct autofs
|
|
Ian Kent |
e24555 |
if (tree_get_mnt_list(mnts, &list, me->key, 1)) {
|
|
Ian Kent |
e24555 |
if (ap->state == ST_READMAP) {
|
|
Ian Kent |
e24555 |
time_t tout = ap->exp_timeout;
|
|
Ian Kent |
e24555 |
- int save_ioctlfd, ioctlfd;
|
|
Ian Kent |
e24555 |
+ int save_ioctlfd, ioctlfd, status;
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
save_ioctlfd = ioctlfd = me->ioctlfd;
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
if (ioctlfd == -1) {
|
|
Ian Kent |
e24555 |
+ status = pthread_mutex_lock(&fd_mutex);
|
|
Ian Kent |
e24555 |
+ if (status)
|
|
Ian Kent |
e24555 |
+ fatal(status);
|
|
Ian Kent |
e24555 |
+
|
|
Ian Kent |
e24555 |
ioctlfd = open(me->key, O_RDONLY);
|
|
Ian Kent |
e24555 |
if (ioctlfd != -1) {
|
|
Ian Kent |
e24555 |
cl_flags = fcntl(ioctlfd, F_GETFD, 0);
|
|
Ian Kent |
e24555 |
@@ -377,6 +405,11 @@ int do_mount_autofs_direct(struct autofs
|
|
Ian Kent |
e24555 |
fcntl(ioctlfd, F_SETFD, cl_flags);
|
|
Ian Kent |
e24555 |
}
|
|
Ian Kent |
e24555 |
}
|
|
Ian Kent |
e24555 |
+
|
|
Ian Kent |
e24555 |
+ status = pthread_mutex_unlock(&fd_mutex);
|
|
Ian Kent |
e24555 |
+ if (status)
|
|
Ian Kent |
e24555 |
+ fatal(status);
|
|
Ian Kent |
e24555 |
+
|
|
Ian Kent |
e24555 |
}
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
if (ioctlfd < 0) {
|
|
Ian Kent |
e24555 |
@@ -457,10 +490,17 @@ int do_mount_autofs_direct(struct autofs
|
|
Ian Kent |
e24555 |
goto out_err;
|
|
Ian Kent |
e24555 |
}
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
+ status = pthread_mutex_lock(&fd_mutex);
|
|
Ian Kent |
e24555 |
+ if (status)
|
|
Ian Kent |
e24555 |
+ fatal(status);
|
|
Ian Kent |
e24555 |
+
|
|
Ian Kent |
e24555 |
/* Root directory for ioctl()'s */
|
|
Ian Kent |
e24555 |
ioctlfd = open(me->key, O_RDONLY);
|
|
Ian Kent |
e24555 |
if (ioctlfd < 0) {
|
|
Ian Kent |
e24555 |
crit(ap->logopt, "failed to create ioctl fd for %s", me->key);
|
|
Ian Kent |
e24555 |
+ status = pthread_mutex_unlock(&fd_mutex);
|
|
Ian Kent |
e24555 |
+ if (status)
|
|
Ian Kent |
e24555 |
+ fatal(status);
|
|
Ian Kent |
e24555 |
goto out_umount;
|
|
Ian Kent |
e24555 |
}
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
@@ -469,6 +509,10 @@ int do_mount_autofs_direct(struct autofs
|
|
Ian Kent |
e24555 |
fcntl(ioctlfd, F_SETFD, cl_flags);
|
|
Ian Kent |
e24555 |
}
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
+ status = pthread_mutex_unlock(&fd_mutex);
|
|
Ian Kent |
e24555 |
+ if (status)
|
|
Ian Kent |
e24555 |
+ fatal(status);
|
|
Ian Kent |
e24555 |
+
|
|
Ian Kent |
e24555 |
/* Calculate the timeouts */
|
|
Ian Kent |
e24555 |
ap->exp_runfreq = (timeout + CHECK_RATIO - 1) / CHECK_RATIO;
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
@@ -604,6 +648,8 @@ int umount_autofs_offset(struct autofs_p
|
|
Ian Kent |
e24555 |
}
|
|
Ian Kent |
e24555 |
ioctlfd = me->ioctlfd;
|
|
Ian Kent |
e24555 |
} else {
|
|
Ian Kent |
e24555 |
+ int status;
|
|
Ian Kent |
e24555 |
+
|
|
Ian Kent |
e24555 |
/* offset isn't mounted, return success and try to recover */
|
|
Ian Kent |
e24555 |
if (!is_mounted(_PROC_MOUNTS, me->key, MNTS_AUTOFS)) {
|
|
Ian Kent |
e24555 |
debug(ap->logopt,
|
|
Ian Kent |
e24555 |
@@ -612,6 +658,10 @@ int umount_autofs_offset(struct autofs_p
|
|
Ian Kent |
e24555 |
return 0;
|
|
Ian Kent |
e24555 |
}
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
+ status = pthread_mutex_lock(&fd_mutex);
|
|
Ian Kent |
e24555 |
+ if (status)
|
|
Ian Kent |
e24555 |
+ fatal(status);
|
|
Ian Kent |
e24555 |
+
|
|
Ian Kent |
e24555 |
ioctlfd = open(me->key, O_RDONLY);
|
|
Ian Kent |
e24555 |
if (ioctlfd != -1) {
|
|
Ian Kent |
e24555 |
if ((cl_flags = fcntl(ioctlfd, F_GETFD, 0)) != -1) {
|
|
Ian Kent |
e24555 |
@@ -619,6 +669,10 @@ int umount_autofs_offset(struct autofs_p
|
|
Ian Kent |
e24555 |
fcntl(ioctlfd, F_SETFD, cl_flags);
|
|
Ian Kent |
e24555 |
}
|
|
Ian Kent |
e24555 |
}
|
|
Ian Kent |
e24555 |
+
|
|
Ian Kent |
e24555 |
+ status = pthread_mutex_unlock(&fd_mutex);
|
|
Ian Kent |
e24555 |
+ if (status)
|
|
Ian Kent |
e24555 |
+ fatal(status);
|
|
Ian Kent |
e24555 |
}
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
if (ioctlfd >= 0) {
|
|
Ian Kent |
e24555 |
@@ -816,10 +870,17 @@ int mount_autofs_offset(struct autofs_po
|
|
Ian Kent |
e24555 |
goto out_err;
|
|
Ian Kent |
e24555 |
}
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
+ status = pthread_mutex_lock(&fd_mutex);
|
|
Ian Kent |
e24555 |
+ if (status)
|
|
Ian Kent |
e24555 |
+ fatal(status);
|
|
Ian Kent |
e24555 |
+
|
|
Ian Kent |
e24555 |
/* Root directory for ioctl()'s */
|
|
Ian Kent |
e24555 |
ioctlfd = open(me->key, O_RDONLY);
|
|
Ian Kent |
e24555 |
if (ioctlfd < 0) {
|
|
Ian Kent |
e24555 |
crit(ap->logopt, "failed to create ioctl fd for %s", me->key);
|
|
Ian Kent |
e24555 |
+ status = pthread_mutex_unlock(&fd_mutex);
|
|
Ian Kent |
e24555 |
+ if (status)
|
|
Ian Kent |
e24555 |
+ fatal(status);
|
|
Ian Kent |
e24555 |
goto out_umount;
|
|
Ian Kent |
e24555 |
}
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
@@ -828,6 +889,10 @@ int mount_autofs_offset(struct autofs_po
|
|
Ian Kent |
e24555 |
fcntl(ioctlfd, F_SETFD, cl_flags);
|
|
Ian Kent |
e24555 |
}
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
+ status = pthread_mutex_unlock(&fd_mutex);
|
|
Ian Kent |
e24555 |
+ if (status)
|
|
Ian Kent |
e24555 |
+ fatal(status);
|
|
Ian Kent |
e24555 |
+
|
|
Ian Kent |
e24555 |
ioctl(ioctlfd, AUTOFS_IOC_SETTIMEOUT, &timeout);
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
ret = fstat(ioctlfd, &st);
|
|
Ian Kent |
e24555 |
@@ -1511,6 +1576,10 @@ int handle_packet_missing_direct(struct
|
|
Ian Kent |
e24555 |
return 1;
|
|
Ian Kent |
e24555 |
}
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
+ status = pthread_mutex_lock(&fd_mutex);
|
|
Ian Kent |
e24555 |
+ if (status)
|
|
Ian Kent |
e24555 |
+ fatal(status);
|
|
Ian Kent |
e24555 |
+
|
|
Ian Kent |
e24555 |
if (me->ioctlfd != -1) {
|
|
Ian Kent |
e24555 |
/* Maybe someone did a manual umount, clean up ! */
|
|
Ian Kent |
e24555 |
ioctlfd = me->ioctlfd;
|
|
Ian Kent |
e24555 |
@@ -1520,6 +1589,9 @@ int handle_packet_missing_direct(struct
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
if (ioctlfd == -1) {
|
|
Ian Kent |
e24555 |
cache_unlock(mc);
|
|
Ian Kent |
e24555 |
+ status = pthread_mutex_unlock(&fd_mutex);
|
|
Ian Kent |
e24555 |
+ if (status)
|
|
Ian Kent |
e24555 |
+ fatal(status);
|
|
Ian Kent |
e24555 |
pthread_setcancelstate(state, NULL);
|
|
Ian Kent |
e24555 |
crit(ap->logopt, "failed to create ioctl fd for %s", me->key);
|
|
Ian Kent |
e24555 |
/* TODO: how do we clear wait q in kernel ?? */
|
|
Ian Kent |
e24555 |
@@ -1531,6 +1603,10 @@ int handle_packet_missing_direct(struct
|
|
Ian Kent |
e24555 |
fcntl(ioctlfd, F_SETFD, cl_flags);
|
|
Ian Kent |
e24555 |
}
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
+ status = pthread_mutex_unlock(&fd_mutex);
|
|
Ian Kent |
e24555 |
+ if (status)
|
|
Ian Kent |
e24555 |
+ fatal(status);
|
|
Ian Kent |
e24555 |
+
|
|
Ian Kent |
e24555 |
debug(ap->logopt, "token %ld, name %s, request pid %u",
|
|
Ian Kent |
e24555 |
(unsigned long) pkt->wait_queue_token, me->key, pkt->pid);
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
diff -up autofs-5.0.1/lib/nss_parse.y.fd-close-on-exec-mutex autofs-5.0.1/lib/nss_parse.y
|
|
Ian Kent |
e24555 |
--- autofs-5.0.1/lib/nss_parse.y.fd-close-on-exec-mutex 2007-12-18 11:13:48.000000000 +0900
|
|
Ian Kent |
e24555 |
+++ autofs-5.0.1/lib/nss_parse.y 2007-12-18 11:38:47.000000000 +0900
|
|
Ian Kent |
e24555 |
@@ -33,6 +33,7 @@
|
|
Ian Kent |
e24555 |
#include "nss_parse.tab.h"
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
static pthread_mutex_t parse_mutex = PTHREAD_MUTEX_INITIALIZER;
|
|
Ian Kent |
e24555 |
+extern pthread_mutex_t fd_mutex;
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
static struct list_head *nss_list;
|
|
Ian Kent |
e24555 |
static struct nss_source *src;
|
|
Ian Kent |
e24555 |
@@ -165,16 +166,24 @@ static void parse_close_nsswitch(void *a
|
|
Ian Kent |
e24555 |
int nsswitch_parse(struct list_head *list)
|
|
Ian Kent |
e24555 |
{
|
|
Ian Kent |
e24555 |
FILE *nsswitch;
|
|
Ian Kent |
e24555 |
- int fd, cl_flags, status;
|
|
Ian Kent |
e24555 |
+ int fd, cl_flags, status, cur_state;
|
|
Ian Kent |
e24555 |
+
|
|
Ian Kent |
e24555 |
+ status = pthread_mutex_lock(&fd_mutex);
|
|
Ian Kent |
e24555 |
+ if (status)
|
|
Ian Kent |
e24555 |
+ fatal(status);
|
|
Ian Kent |
e24555 |
+
|
|
Ian Kent |
e24555 |
+ pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cur_state);
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
nsswitch = fopen(NSSWITCH_FILE, "r");
|
|
Ian Kent |
e24555 |
if (!nsswitch) {
|
|
Ian Kent |
e24555 |
error(LOGOPT_ANY, "couldn't open %s\n", NSSWITCH_FILE);
|
|
Ian Kent |
e24555 |
+ status = pthread_mutex_unlock(&fd_mutex);
|
|
Ian Kent |
e24555 |
+ if (status)
|
|
Ian Kent |
e24555 |
+ fatal(status);
|
|
Ian Kent |
e24555 |
+ pthread_setcancelstate(cur_state, NULL);
|
|
Ian Kent |
e24555 |
return 1;
|
|
Ian Kent |
e24555 |
}
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
- pthread_cleanup_push(parse_close_nsswitch, nsswitch);
|
|
Ian Kent |
e24555 |
-
|
|
Ian Kent |
e24555 |
fd = fileno(nsswitch);
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
if ((cl_flags = fcntl(fd, F_GETFD, 0)) != -1) {
|
|
Ian Kent |
e24555 |
@@ -182,9 +191,16 @@ int nsswitch_parse(struct list_head *lis
|
|
Ian Kent |
e24555 |
fcntl(fd, F_SETFD, cl_flags);
|
|
Ian Kent |
e24555 |
}
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
+ status = pthread_mutex_unlock(&fd_mutex);
|
|
Ian Kent |
e24555 |
+ if (status)
|
|
Ian Kent |
e24555 |
+ fatal(status);
|
|
Ian Kent |
e24555 |
+
|
|
Ian Kent |
e24555 |
parse_mutex_lock();
|
|
Ian Kent |
e24555 |
+ pthread_cleanup_push(parse_close_nsswitch, nsswitch);
|
|
Ian Kent |
e24555 |
pthread_cleanup_push(parse_mutex_unlock, NULL);
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
+ pthread_setcancelstate(cur_state, NULL);
|
|
Ian Kent |
e24555 |
+
|
|
Ian Kent |
e24555 |
nss_in = nsswitch;
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
nss_automount_found = 0;
|
|
Ian Kent |
e24555 |
diff -up autofs-5.0.1/lib/rpc_subs.c.fd-close-on-exec-mutex autofs-5.0.1/lib/rpc_subs.c
|
|
Ian Kent |
e24555 |
--- autofs-5.0.1/lib/rpc_subs.c.fd-close-on-exec-mutex 2007-12-18 11:13:48.000000000 +0900
|
|
Ian Kent |
e24555 |
+++ autofs-5.0.1/lib/rpc_subs.c 2007-12-18 11:14:39.000000000 +0900
|
|
Ian Kent |
e24555 |
@@ -57,6 +57,8 @@ static char *domain = NULL;
|
|
Ian Kent |
e24555 |
inline void dump_core(void);
|
|
Ian Kent |
e24555 |
static pthread_mutex_t networks_mutex = PTHREAD_MUTEX_INITIALIZER;
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
+extern pthread_mutex_t fd_mutex;
|
|
Ian Kent |
e24555 |
+
|
|
Ian Kent |
e24555 |
/*
|
|
Ian Kent |
e24555 |
* Create a UDP RPC client
|
|
Ian Kent |
e24555 |
*/
|
|
Ian Kent |
e24555 |
@@ -108,20 +110,31 @@ got_addr:
|
|
Ian Kent |
e24555 |
raddr.sin_port = htons(info->port);
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
if (!info->client) {
|
|
Ian Kent |
e24555 |
+ int status = pthread_mutex_lock(&fd_mutex);
|
|
Ian Kent |
e24555 |
+ if (status)
|
|
Ian Kent |
e24555 |
+ fatal(status);
|
|
Ian Kent |
e24555 |
/*
|
|
Ian Kent |
e24555 |
* bind to any unused port. If we left this up to the rpc
|
|
Ian Kent |
e24555 |
* layer, it would bind to a reserved port, which has been shown
|
|
Ian Kent |
e24555 |
* to exhaust the reserved port range in some situations.
|
|
Ian Kent |
e24555 |
*/
|
|
Ian Kent |
e24555 |
fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
|
|
Ian Kent |
e24555 |
- if (fd < 0)
|
|
Ian Kent |
e24555 |
+ if (fd < 0) {
|
|
Ian Kent |
e24555 |
+ status = pthread_mutex_unlock(&fd_mutex);
|
|
Ian Kent |
e24555 |
+ if (status)
|
|
Ian Kent |
e24555 |
+ fatal(status);
|
|
Ian Kent |
e24555 |
return NULL;
|
|
Ian Kent |
e24555 |
+ }
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
if ((cl_flags = fcntl(fd, F_GETFD, 0)) != -1) {
|
|
Ian Kent |
e24555 |
cl_flags |= FD_CLOEXEC;
|
|
Ian Kent |
e24555 |
fcntl(fd, F_SETFD, cl_flags);
|
|
Ian Kent |
e24555 |
}
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
+ status = pthread_mutex_unlock(&fd_mutex);
|
|
Ian Kent |
e24555 |
+ if (status)
|
|
Ian Kent |
e24555 |
+ fatal(status);
|
|
Ian Kent |
e24555 |
+
|
|
Ian Kent |
e24555 |
laddr.sin_family = AF_INET;
|
|
Ian Kent |
e24555 |
laddr.sin_port = 0;
|
|
Ian Kent |
e24555 |
laddr.sin_addr.s_addr = htonl(INADDR_ANY);
|
|
Ian Kent |
e24555 |
@@ -317,15 +330,27 @@ got_addr:
|
|
Ian Kent |
e24555 |
addr.sin_port = htons(info->port);
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
if (!info->client) {
|
|
Ian Kent |
e24555 |
+ int status = pthread_mutex_lock(&fd_mutex);
|
|
Ian Kent |
e24555 |
+ if (status)
|
|
Ian Kent |
e24555 |
+ fatal(status);
|
|
Ian Kent |
e24555 |
+
|
|
Ian Kent |
e24555 |
fd = socket(PF_INET, SOCK_STREAM, info->proto->p_proto);
|
|
Ian Kent |
e24555 |
- if (fd < 0)
|
|
Ian Kent |
e24555 |
+ if (fd < 0) {
|
|
Ian Kent |
e24555 |
+ status = pthread_mutex_unlock(&fd_mutex);
|
|
Ian Kent |
e24555 |
+ if (status)
|
|
Ian Kent |
e24555 |
+ fatal(status);
|
|
Ian Kent |
e24555 |
return NULL;
|
|
Ian Kent |
e24555 |
+ }
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
if ((cl_flags = fcntl(fd, F_GETFD, 0)) != -1) {
|
|
Ian Kent |
e24555 |
cl_flags |= FD_CLOEXEC;
|
|
Ian Kent |
e24555 |
fcntl(fd, F_SETFD, cl_flags);
|
|
Ian Kent |
e24555 |
}
|
|
Ian Kent |
e24555 |
|
|
Ian Kent |
e24555 |
+ status = pthread_mutex_unlock(&fd_mutex);
|
|
Ian Kent |
e24555 |
+ if (status)
|
|
Ian Kent |
e24555 |
+ fatal(status);
|
|
Ian Kent |
e24555 |
+
|
|
Ian Kent |
e24555 |
ret = connect_nb(fd, &addr, &info->timeout);
|
|
Ian Kent |
e24555 |
if (ret < 0)
|
|
Ian Kent |
e24555 |
goto out_close;
|