From 33c0d6f02228125a40a10a2493eab7c059f1362f Mon Sep 17 00:00:00 2001 From: Slava Zanko Date: Tue, 14 Jul 2009 18:11:52 +0300 Subject: [PATCH] Fixed segfault with fish operations Reason: If some directory in fish is a read-only, then mc will crashed Issue: In fish_mkdir added additional check if directory was created. Signed-off-by: Slava Zanko --- vfs/fish.c | 35 ++++++++++++++++++++++++++++++++++- vfs/vfs.c | 6 ++++++ 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/vfs/fish.c b/vfs/fish.c index a4e8e7a9b..ad066eead 100644 --- a/vfs/fish.c +++ b/vfs/fish.c @@ -1045,8 +1045,31 @@ static int fish_unlink (struct vfs_class *me, const char *path) POSTFIX(OPT_FLUSH); } +static int fish_exists (struct vfs_class *me, const char *path) +{ + int ret_code; + + PREFIX + + g_snprintf(buf, sizeof(buf), + "#ISEXISTS \"/%s\"\n" + "ls -l \"/%s\" >/dev/null 2>/dev/null\n" + "echo '### '$?\n", + rpath, rpath); + + g_free (rpath); + + if ( fish_send_command(me, super, buf, OPT_FLUSH) == 0 ) + return 1; + + return 0; +} + + static int fish_mkdir (struct vfs_class *me, const char *path, mode_t mode) { + int ret_code; + PREFIX (void) mode; @@ -1056,7 +1079,17 @@ static int fish_mkdir (struct vfs_class *me, const char *path, mode_t mode) "mkdir /%s 2>/dev/null\n" "echo '### 000'\n", rpath, rpath); - POSTFIX(OPT_FLUSH); + + g_free (rpath); + ret_code = fish_send_command(me, super, buf, OPT_FLUSH); + + if ( ret_code != 0 ) + return ret_code; + + if ( ! fish_exists (me, path) ){ + ERRNOR (EACCES, -1); + } + return 0; } static int fish_rmdir (struct vfs_class *me, const char *path) diff --git a/vfs/vfs.c b/vfs/vfs.c index b645a0fb1..184cf0c6e 100644 --- a/vfs/vfs.c +++ b/vfs/vfs.c @@ -564,6 +564,10 @@ int mc_##name inarg \ char *mpath = vfs_canon_and_translate (path); \ if (mpath != NULL) { \ vfs = vfs_get_class (mpath); \ + if (vfs == NULL){ \ + g_free (mpath); \ + return -1; \ + } \ result = vfs->name ? (*vfs->name)callarg : -1; \ g_free (mpath); \ if (result == -1) \ @@ -618,6 +622,8 @@ ssize_t mc_##name inarg \ if (handle == -1) \ return -1; \ vfs = vfs_op (handle); \ + if (vfs == NULL) \ + return -1; \ result = vfs->name ? (*vfs->name)callarg : -1; \ if (result == -1) \ errno = vfs->name ? ferrno (vfs) : E_NOTSUPP; \