diff options
author | pfg <pfg@FreeBSD.org> | 2016-01-07 21:43:43 +0000 |
---|---|---|
committer | pfg <pfg@FreeBSD.org> | 2016-01-07 21:43:43 +0000 |
commit | a32f535abcc78898d1fabfee3ab20ee1cc868a4a (patch) | |
tree | 8fd827330da4f2f2107dfb824edc3456cea2f9a4 /sys/fs | |
parent | 5fa22c55c2362f042e1e4eb9dba3181b58b6e794 (diff) | |
download | FreeBSD-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.c | 19 |
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); } /* |