summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiklos Szeredi <miklos@szeredi.hu>2007-07-25 09:36:52 +0000
committerMiklos Szeredi <miklos@szeredi.hu>2007-07-25 09:36:52 +0000
commit7f571e320e39a5dd0bb7ab2c1b2a40b174879b18 (patch)
tree60add554a3444a0f1be63d4ec2b0d2e1dcfe15b9
parent5e1769c04dabef220cc5bf56825ce848ae4da226 (diff)
downloadfuse-7f571e320e39a5dd0bb7ab2c1b2a40b174879b18.tar.gz
Don't call /bin/[u]mount if /etc/mtab is a symlink
-rw-r--r--ChangeLog5
-rw-r--r--lib/fuse_opt.c12
-rw-r--r--lib/mount_util.c17
3 files changed, 29 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index 0d46ef9..2bf2251 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2007-07-25 Miklos Szeredi <miklos@szeredi.hu>
+
+ * Don't call /bin/[u]mount if /etc/mtab is a symlink. Reported by
+ Tomas M
+
2007-07-12 Miklos Szeredi <miklos@szeredi.hu>
* Reset args->argc in fuse_opt_free_args(). Patch by Lucas
diff --git a/lib/fuse_opt.c b/lib/fuse_opt.c
index 31cffaf..9b464a1 100644
--- a/lib/fuse_opt.c
+++ b/lib/fuse_opt.c
@@ -27,11 +27,13 @@ struct fuse_opt_context {
void fuse_opt_free_args(struct fuse_args *args)
{
- if (args && args->argv && args->allocated) {
- int i;
- for (i = 0; i < args->argc; i++)
- free(args->argv[i]);
- free(args->argv);
+ if (args) {
+ if (args->argv && args->allocated) {
+ int i;
+ for (i = 0; i < args->argc; i++)
+ free(args->argv[i]);
+ free(args->argv);
+ }
args->argc = 0;
args->argv = NULL;
args->allocated = 0;
diff --git a/lib/mount_util.c b/lib/mount_util.c
index dccecdf..55b5f4e 100644
--- a/lib/mount_util.c
+++ b/lib/mount_util.c
@@ -14,15 +14,29 @@
#include <dirent.h>
#include <errno.h>
#include <limits.h>
+#include <mntent.h>
#include <sys/stat.h>
#include <sys/wait.h>
+static int mtab_is_symlink(void)
+{
+ struct stat stbuf;
+
+ if (lstat(_PATH_MOUNTED, &stbuf) != -1 && S_ISLNK(stbuf.st_mode))
+ return 1;
+ else
+ return 0;
+}
+
int fuse_mnt_add_mount(const char *progname, const char *fsname,
const char *mnt, const char *type, const char *opts)
{
int res;
int status;
+ if (mtab_is_symlink())
+ return 0;
+
res = fork();
if (res == -1) {
fprintf(stderr, "%s: fork: %s\n", progname, strerror(errno));
@@ -72,6 +86,9 @@ int fuse_mnt_umount(const char *progname, const char *mnt, int lazy)
int res;
int status;
+ if (mtab_is_symlink())
+ return 0;
+
res = fork();
if (res == -1) {
fprintf(stderr, "%s: fork: %s\n", progname, strerror(errno));