{
int res;
int status;
+ sigset_t blockmask;
+ sigset_t oldmask;
if (!mtab_needs_update(mnt))
return 0;
+ sigemptyset(&blockmask);
+ sigaddset(&blockmask, SIGCHLD);
+ res = sigprocmask(SIG_BLOCK, &blockmask, &oldmask);
+ if (res == -1) {
+ fprintf(stderr, "%s: sigprocmask: %s\n", progname, strerror(errno));
+ return -1;
+ }
+
res = fork();
if (res == -1) {
fprintf(stderr, "%s: fork: %s\n", progname, strerror(errno));
- return -1;
+ goto out_restore;
}
if (res == 0) {
char templ[] = "/tmp/fusermountXXXXXX";
char *tmp;
+ sigprocmask(SIG_SETMASK, &oldmask, NULL);
setuid(geteuid());
/*
exit(1);
}
res = waitpid(res, &status, 0);
- if (res == -1) {
+ if (res == -1)
fprintf(stderr, "%s: waitpid: %s\n", progname, strerror(errno));
- return -1;
- }
+
if (status != 0)
- return -1;
+ res = -1;
- return 0;
+ out_restore:
+ sigprocmask(SIG_SETMASK, &oldmask, NULL);
+ return res;
}
int fuse_mnt_umount(const char *progname, const char *mnt, int lazy)
{
int res;
int status;
+ sigset_t blockmask;
+ sigset_t oldmask;
if (!mtab_needs_update(mnt)) {
res = umount2(mnt, lazy ? 2 : 0);
return res;
}
+ sigemptyset(&blockmask);
+ sigaddset(&blockmask, SIGCHLD);
+ res = sigprocmask(SIG_BLOCK, &blockmask, &oldmask);
+ if (res == -1) {
+ fprintf(stderr, "%s: sigprocmask: %s\n", progname, strerror(errno));
+ return -1;
+ }
+
res = fork();
if (res == -1) {
fprintf(stderr, "%s: fork: %s\n", progname, strerror(errno));
- return -1;
+ goto out_restore;
}
if (res == 0) {
+ sigprocmask(SIG_SETMASK, &oldmask, NULL);
setuid(geteuid());
execl("/bin/umount", "/bin/umount", "-i", mnt,
lazy ? "-l" : NULL, NULL);
exit(1);
}
res = waitpid(res, &status, 0);
- if (res == -1) {
+ if (res == -1)
fprintf(stderr, "%s: waitpid: %s\n", progname, strerror(errno));
- return -1;
- }
+
if (status != 0)
- return -1;
+ res = -1;
- return 0;
+ out_restore:
+ sigprocmask(SIG_SETMASK, &oldmask, NULL);
+ return res;
}
char *fuse_mnt_resolve_path(const char *progname, const char *orig)