Tighten close_file, fix SYSLINUX new file API syslinux-3.70-pre2
authorH. Peter Anvin <hpa@zytor.com>
Thu, 28 Feb 2008 00:17:23 +0000 (16:17 -0800)
committerH. Peter Anvin <hpa@zytor.com>
Thu, 28 Feb 2008 00:17:23 +0000 (16:17 -0800)
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.

comboot.inc
extlinux.asm
isolinux.asm
ldlinux.asm

index 99a4115..07ec352 100644 (file)
 
 ; Looks like a COMBOOT image but too large
 comboot_too_large:
-               and si,si
-               jnz .closed
                call close_file
-.closed:
                mov si,err_comlarge
                call cwritestr
                jmp enter_command
index afcdb33..73c8bed 100644 (file)
@@ -1010,6 +1010,7 @@ close_file:
                and si,si
                jz .closed
                mov dword [si],0                ; First dword == file_bytesleft
+               xor si,si
 .closed:       ret
 
 ;
index cee100f..4293564 100644 (file)
@@ -1141,6 +1141,7 @@ close_file:
                and si,si
                jz .closed
                mov dword [si],0                ; First dword == file_left
+               xor si,si
 .closed:       ret
 
 ;
index 4df94b7..b12403e 100644 (file)
@@ -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
 
 ;