From 0f86bf5061a67a38b4facb6868dc119fd97a15fc Mon Sep 17 00:00:00 2001 From: Fabian Keil Date: Fri, 4 Nov 2011 21:40:09 +0100 Subject: [PATCH] Prevent an endless-loop if only single invalid block needs to be skipped --- vobcopy.c | 31 +++++++++++++++++++------------ 1 files changed, 19 insertions(+), 12 deletions(-) diff --git a/vobcopy.c b/vobcopy.c index 293c966..5b42d41 100644 --- a/vobcopy.c +++ b/vobcopy.c @@ -80,23 +80,30 @@ static int get_number_of_blocks_to_skip(dvd_file_t *dvd_file, int original_offse offset = original_offset + blocks_to_skip; } while ((blocks = DVDReadBlocks(dvd_file, offset, 1, bufferin)) <= 0); - fprintf( stderr, _("Got a valid block at offset %d, after skipping %d. Trying to reduce the skipped blocks\n"), + fprintf( stderr, _("Got a valid block at offset %d, after skipping %d.\n"), offset, blocks_to_skip); - do + if (blocks_to_skip > 1) { - /* - * XXX: This could be done smarter, for example by using a binary search. - */ - blocks_to_skip--; - offset = original_offset + blocks_to_skip; - } - while (blocks_to_skip > 0 && (blocks = DVDReadBlocks(dvd_file, offset, 1, bufferin)) > 0); + fprintf( stderr, _(" Trying to reduce the skipped blocks\n")); - fprintf( stderr, _("Got an ivalid block at offset %d, after skipping %d. Returning %d\n"), - offset, blocks_to_skip, blocks_to_skip +1); + do + { + /* + * XXX: This could be done smarter, for example by using a binary search. + */ + blocks_to_skip--; + offset = original_offset + blocks_to_skip; + } + while (blocks_to_skip > 0 && (blocks = DVDReadBlocks(dvd_file, offset, 1, bufferin)) > 0); + + blocks_to_skip++; + + fprintf( stderr, _("Got an ivalid block at offset %d, after skipping %d. Returning %d\n"), + offset, blocks_to_skip-1, blocks_to_skip); + } - return blocks_to_skip + 1; + return blocks_to_skip; } -- 1.7.6