summaryrefslogtreecommitdiffstats
path: root/sys/fs
diff options
context:
space:
mode:
authorpfg <pfg@FreeBSD.org>2016-01-07 21:43:43 +0000
committerpfg <pfg@FreeBSD.org>2016-01-07 21:43:43 +0000
commita32f535abcc78898d1fabfee3ab20ee1cc868a4a (patch)
tree8fd827330da4f2f2107dfb824edc3456cea2f9a4 /sys/fs
parent5fa22c55c2362f042e1e4eb9dba3181b58b6e794 (diff)
downloadFreeBSD-src-a32f535abcc78898d1fabfee3ab20ee1cc868a4a.zip
FreeBSD-src-a32f535abcc78898d1fabfee3ab20ee1cc868a4a.tar.gz
ext2fs: reading mmaped file in Ext4 causes panic
Always call brelse(path.ep_bp), fixing reading EXT4 files using mmap(). Patch by Damjan Jovanovic. PR: 205938 MFC after: 1 week
Diffstat (limited to 'sys/fs')
-rw-r--r--sys/fs/ext2fs/ext2_bmap.c19
1 files changed, 13 insertions, 6 deletions
diff --git a/sys/fs/ext2fs/ext2_bmap.c b/sys/fs/ext2fs/ext2_bmap.c
index d144e92..7d4a880 100644
--- a/sys/fs/ext2fs/ext2_bmap.c
+++ b/sys/fs/ext2fs/ext2_bmap.c
@@ -96,6 +96,7 @@ ext4_bmapext(struct vnode *vp, int32_t bn, int64_t *bnp, int *runp, int *runb)
struct ext4_extent *ep;
struct ext4_extent_path path = { .ep_bp = NULL };
daddr_t lbn;
+ int ret = 0;
ip = VTOI(vp);
fs = ip->i_e2fs;
@@ -113,15 +114,21 @@ ext4_bmapext(struct vnode *vp, int32_t bn, int64_t *bnp, int *runp, int *runb)
ext4_ext_find_extent(fs, ip, lbn, &path);
ep = path.ep_ext;
if (ep == NULL)
- return (EIO);
+ ret = EIO;
+ else {
+ *bnp = fsbtodb(fs, lbn - ep->e_blk +
+ (ep->e_start_lo | (daddr_t)ep->e_start_hi << 32));
- *bnp = fsbtodb(fs, lbn - ep->e_blk +
- (ep->e_start_lo | (daddr_t)ep->e_start_hi << 32));
+ if (*bnp == 0)
+ *bnp = -1;
+ }
- if (*bnp == 0)
- *bnp = -1;
+ if (path.ep_bp != NULL) {
+ brelse(path.ep_bp);
+ path.ep_bp = NULL;
+ }
- return (0);
+ return (ret);
}
/*
OpenPOWER on IntegriCloud