bool mount_all;
RootFsOption rootfs;
+ char cur_dir_path[PATH_MAX];
int cur_dir_fd;
int cur_rootdir_fd;
};
#define XFLAG_NOAUTO 0x01
#define XFLAG_FILE 0x02
+#define XFLAG_NOMTAB 0x04
static struct option const
CMDLINE_OPTIONS[] = {
{ "private", MS_PRIVATE, MS_PRIVATE, 0, false },
{ "slave", MS_SLAVE, MS_SLAVE, 0, false },
{ "shared", MS_SHARED, MS_SHARED, 0, false },
+ { "nomtab", 0, 0, XFLAG_NOMTAB, false },
};
int wrapper_exit_code = 1;
}
static bool
-mountSingle(struct MountInfo const *mnt, struct Options const *opt)
+mountSingle(struct MountInfo const *mnt, struct Options *opt)
{
assert(mnt->dst!=0);
perror("secure-mount: mount()");
return false;
}
- if ((mnt->flag & MS_BIND) &&
- (mnt->flag & ~(MS_BIND|MS_REC))) {
+ if (strcmp(mnt->dst, "/") == 0) {
+ /* XXX: Hack */
+ if (chdir(opt->cur_dir_path) == -1) {
+ perror("secure-mount: chdir(.)");
+ return false;
+ }
+ close(opt->cur_dir_fd);
+ opt->cur_dir_fd = Eopen(".", O_RDONLY|O_DIRECTORY, 0);
+ Efcntl(opt->cur_dir_fd, F_SETFD, FD_CLOEXEC);
+ }
+ if (!vc_isSupported(vcFEATURE_BME) &&
+ (mnt->flag & MS_BIND) &&
+ (mnt->mask & ~(MS_BIND|MS_REC))) {
/* This is needed to put us in the new mountpoint */
if (!secureChdir(mnt->dst, opt))
return false;
else if (!callExternalMount(mnt))
return false;
- if (!opt->ignore_mtab &&
+ if (!opt->ignore_mtab && (mnt->xflag & XFLAG_NOMTAB)==0 &&
updateMtab(mnt, opt)==-1) {
WRITE_MSG(2, "Failed to update mtab-file\n");
// no error
}
static bool
-mountFstab(struct Options const *opt)
+mountFstab(struct Options *opt)
{
bool res = false;
int fd;
Efcntl(opt->cur_dir_fd, F_SETFD, FD_CLOEXEC);
Efcntl(opt->cur_rootdir_fd, F_SETFD, FD_CLOEXEC);
+
+ if (getcwd(opt->cur_dir_path, sizeof(opt->cur_dir_path)) == NULL) {
+ perror("secure-mount: getcwd()");
+ exit(wrapper_exit_code);
+ }
}
static RootFsOption