summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrobi6 <robi6@users.sourceforge.net>2014-09-03 00:12:40 +0200
committerrobi6 <robi6@users.sourceforge.net>2014-09-03 00:12:40 +0200
commit4039f96fc313861002b7b5846e266a5c875d0f61 (patch)
tree62606d29f79c04e677f58e82b7322d148241f9b4
parentb589231ba5a3f4ef1e19a0da38c56dffa3955047 (diff)
prevent a segfault while reading journal data
-rw-r--r--src/journal.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/src/journal.c b/src/journal.c
index 95c2a8f..a32d2d7 100644
--- a/src/journal.c
+++ b/src/journal.c
@@ -1045,7 +1045,7 @@ int next_block_bitmap(ext2fs_block_bitmap d_bmap){
int retval;
char *diff_buf;
- if (jbbm.pointer->transaction < jbbm.first_trans)
+ if ((jbbm.pointer->transaction < jbbm.first_trans)||(jbbm.pointer < jbbm.list))
return 0;
fs_bitmap = (struct ext2fs_struct_loc_generic_bitmap*) current_fs->block_map;
@@ -1079,7 +1079,7 @@ int next_block_bitmap(ext2fs_block_bitmap d_bmap){
p1 = jbbm.pointer;
diff_buf = jbbm.block_buf + jbbm.blocksize ;
- while ((p1->transaction >= jbbm.first_trans) && (p1->transaction == jbbm.pointer->transaction)){
+ while ((p1->transaction >= jbbm.first_trans) && (p1->transaction == jbbm.pointer->transaction) && (p1 >= jbbm.list)){
p2 = p1 -1;
blockg = (__u32)p1->blockgroup;
skip = (jbbm.blocklen * blockg);
@@ -1091,7 +1091,7 @@ int next_block_bitmap(ext2fs_block_bitmap d_bmap){
fprintf(stderr,"Error: while reading journal\n");
goto errout;
}
- if ((p2 == jbbm.list) && ((__u32)p2->blockgroup != blockg)){
+ if ((p2 < jbbm.list) || ((p2 == jbbm.list) && ((__u32)p2->blockgroup != blockg))){
//no previous block copy found, create difference to the entire block group
for (i = 0 ; i < len ; i++){
*((df_bitmap->bitmap)+skip+i) = *(jbbm.block_buf + i) ^ 0xFF ;