|
@@ -55,9 +55,15 @@ move_archive (off_t count)
|
|
|
off_t position0 = rmtlseek (archive, 0, SEEK_CUR), position = 0;
|
|
|
if (0 <= position0)
|
|
|
{
|
|
|
- off_t increment;
|
|
|
+ /* Pretend the starting position is at the first record
|
|
|
+ boundary after POSITION0. This is useful at EOF after
|
|
|
+ a short read. */
|
|
|
+ idx_t short_size = position0 % record_size;
|
|
|
+ idx_t start_offset = short_size ? record_size - short_size : 0;
|
|
|
+ off_t increment, move_start;
|
|
|
if (INT_MULTIPLY_WRAPV (record_size, count, &increment)
|
|
|
- || INT_ADD_WRAPV (position0, increment, &position)
|
|
|
+ || INT_ADD_WRAPV (position0, start_offset, &move_start)
|
|
|
+ || INT_ADD_WRAPV (move_start, increment, &position)
|
|
|
|| position < 0)
|
|
|
{
|
|
|
ERROR ((0, EOVERFLOW, "lseek: %s", archive_name_array[0]));
|