From b89d1480c656a4f4642cb84ed18d9214faca1308 Mon Sep 17 00:00:00 2001 From: "H. Peter Anvin" Date: Wed, 27 Feb 2008 16:17:23 -0800 Subject: Tighten close_file, fix SYSLINUX new file API Define close_file slightly tighter: - It is permitted to call close_file with a zero filehandle - close_file zeros SI Fix the handling of the new API in SYSLINUX. It appears file_left was never actually initialized; it simply didn't matter since the old code would either trip on reaching the end of the FAT chain or count the data it needed. Now operating according to spec. --- ldlinux.asm | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) (limited to 'ldlinux.asm') diff --git a/ldlinux.asm b/ldlinux.asm index 4df94b73..b12403eb 100644 --- a/ldlinux.asm +++ b/ldlinux.asm @@ -1034,7 +1034,8 @@ search_dos_dir: close_file: and si,si jz .closed - mov dword [si],0 ; First dword == file_left + mov dword [si],0 ; First dword == file_sector + xor si,si .closed: ret ; @@ -1092,6 +1093,11 @@ searchdir: ; SI and EAX are already set mov [si+file_bytesleft],eax + push eax + add eax,SECTOR_SIZE-1 + shr eax,SECTOR_SHIFT + mov [si+file_left],eax ; Sectors left + pop eax and eax,eax ; EAX != 0 jz .badfile ret ; Done! @@ -1361,14 +1367,18 @@ getfssec: call getfssec_edx mov [si+file_sector],edx pop ecx ; Sectors requested read - pushf ; Save CF from getfssec_edx shl ecx,SECTOR_SHIFT cmp ecx,[si+file_bytesleft] - jna .noteof + ja .eof +.noteof: + sub [si+file_bytesleft],ecx ; CF <- 0 + pop edx + ret +.eof: mov ecx,[si+file_bytesleft] -.noteof: sub ecx,[si+file_bytesleft] - popf + call close_file pop edx + stc ret ; -- cgit v1.2.1