From 0b0c60d540d5e88bff6cda9de9e62c1dc7cd5389 Mon Sep 17 00:00:00 2001 From: Christian Vogelgsang Date: Sun, 2 Feb 2025 17:19:51 +0100 Subject: [PATCH] limit Seek() to file size or return error --- amitools/vamos/lib/DosLibrary.py | 14 +++++++++++--- amitools/vamos/lib/dos/FileHandle.py | 17 +++++++++++++++-- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/amitools/vamos/lib/DosLibrary.py b/amitools/vamos/lib/DosLibrary.py index b47217a0..01364db3 100644 --- a/amitools/vamos/lib/DosLibrary.py +++ b/amitools/vamos/lib/DosLibrary.py @@ -756,12 +756,20 @@ def Seek(self, ctx, fh_b_addr, pos, mode): old_pos = fh.tell() new_pos = fh.seek(pos, whence) - log_dos.info("Seek(%s, %06x, %s) -> old_pos=%06x", fh, pos, mode_str, old_pos) - if new_pos == -1: + log_dos.info( + "Seek(%s, %d, %s) -> old_pos=%d new_pos=%d", + fh, + pos, + mode_str, + old_pos, + new_pos, + ) + if new_pos < 0: self.setioerr(ctx, ERROR_SEEK_ERROR) + return -1 else: self.setioerr(ctx, 0) - return old_pos + return old_pos def FGetC(self, ctx, fh_b_addr): fh = self.file_mgr.get_by_b_addr(fh_b_addr, False) diff --git a/amitools/vamos/lib/dos/FileHandle.py b/amitools/vamos/lib/dos/FileHandle.py index af02df15..fc92f665 100644 --- a/amitools/vamos/lib/dos/FileHandle.py +++ b/amitools/vamos/lib/dos/FileHandle.py @@ -183,10 +183,23 @@ def tell(self): def seek(self, pos, whence): """set to position from whence - return -1 on error or new_pos + return -1 on error, -2 on too far or new_pos """ try: - return self.obj.seek(pos, whence) + new_pos = self.obj.seek(pos, whence) + + # we have to limit seek to file size + stat = os.stat(self.obj.fileno()) + file_size = stat.st_size + + # if seek to far then limit to file size + if new_pos > file_size: + # seek to end + self.obj.seek(file_size, 0) + return -2 + + return new_pos + except IOError: return -1