diff options
author | Lachlan McIlroy <lachlan@sgi.com> | 2008-01-10 00:43:36 -0500 |
---|---|---|
committer | Lachlan McIlroy <lachlan@redback.melbourne.sgi.com> | 2008-02-07 02:20:58 -0500 |
commit | 9742bb93da27737fe490eab2af9fba1efa243dcb (patch) | |
tree | a5563e9775d42756024bc741d12d139f9a068dcb /fs/xfs/xfs_log_recover.c | |
parent | f71354bc3a96c657a70e36dcf980cbad6c9fc63f (diff) |
[XFS] prevent panic during log recovery due to bogus op_hdr length
A problem was reported where a system panicked in log recovery due to a
corrupt log record. The cause of the corruption is not known but this
change will at least prevent a crash for this specific scenario. Log
recovery definitely needs some more work in this area.
SGI-PV: 974151
SGI-Modid: xfs-linux-melb:xfs-kern:30318a
Signed-off-by: Lachlan McIlroy <lachlan@sgi.com>
Signed-off-by: David Chinner <dgc@sgi.com>
Signed-off-by: Christoph Hellwig <hch@infradead.org>
Diffstat (limited to 'fs/xfs/xfs_log_recover.c')
-rw-r--r-- | fs/xfs/xfs_log_recover.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 071672969421..b82d5d4d2462 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c | |||
@@ -2912,7 +2912,12 @@ xlog_recover_process_data( | |||
2912 | xlog_recover_new_tid(&rhash[hash], tid, | 2912 | xlog_recover_new_tid(&rhash[hash], tid, |
2913 | be64_to_cpu(rhead->h_lsn)); | 2913 | be64_to_cpu(rhead->h_lsn)); |
2914 | } else { | 2914 | } else { |
2915 | ASSERT(dp + be32_to_cpu(ohead->oh_len) <= lp); | 2915 | if (dp + be32_to_cpu(ohead->oh_len) > lp) { |
2916 | xlog_warn( | ||
2917 | "XFS: xlog_recover_process_data: bad length"); | ||
2918 | WARN_ON(1); | ||
2919 | return (XFS_ERROR(EIO)); | ||
2920 | } | ||
2916 | flags = ohead->oh_flags & ~XLOG_END_TRANS; | 2921 | flags = ohead->oh_flags & ~XLOG_END_TRANS; |
2917 | if (flags & XLOG_WAS_CONT_TRANS) | 2922 | if (flags & XLOG_WAS_CONT_TRANS) |
2918 | flags &= ~XLOG_CONTINUE_TRANS; | 2923 | flags &= ~XLOG_CONTINUE_TRANS; |