diff options
Diffstat (limited to 'src/delete.c')
-rw-r--r-- | src/delete.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/src/delete.c b/src/delete.c index 1d4d2681..3bee5c65 100644 --- a/src/delete.c +++ b/src/delete.c @@ -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])); |