summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2021-09-11 12:26:35 +0000
committercinap_lenrek <cinap_lenrek@felloff.net>2021-09-11 12:26:35 +0000
commit546f8cfeca6fca0b6b246c8dbf035027e3f15f8c (patch)
treec2998fab7c52dcd13aba85d8d583cce49b4c173f
parente2796993445b62379e908564e900e6955b30b830 (diff)
9boot: fix isowalk() for directories spanning multiple sectors
directory entries cannot span sector boundaries, meaning that the end of a sector would be zero padded until the next sector. we have to skip over these zero paddings to fully read the directory.
-rw-r--r--sys/src/boot/efi/iso.c12
-rw-r--r--sys/src/boot/pc/iso.c12
2 files changed, 16 insertions, 8 deletions
diff --git a/sys/src/boot/efi/iso.c b/sys/src/boot/efi/iso.c
index 74e414a19..6a878667b 100644
--- a/sys/src/boot/efi/iso.c
+++ b/sys/src/boot/efi/iso.c
@@ -129,15 +129,19 @@ Foundpvd:
return 0;
for(;;){
- if(readn(ex, &d, Dirsz) != Dirsz)
+ if(read(ex, &d.dirlen, 1) != 1)
break;
if(d.dirlen == 0)
+ continue; /* zero padding to next sector */
+ if(read(ex, &d.dirlen + 1, Dirsz-1) != Dirsz-1)
break;
- if(readn(ex, name, d.namelen) != d.namelen)
+ if(read(ex, name, d.namelen) != d.namelen)
break;
i = d.dirlen - (Dirsz + d.namelen);
- while(i-- > 0)
- read(ex, &c, 1);
+ while(i-- > 0){
+ if(read(ex, &c, 1) != 1)
+ break;
+ }
for(i=0; i<d.namelen; i++){
c = name[i];
if(c >= 'A' && c <= 'Z'){
diff --git a/sys/src/boot/pc/iso.c b/sys/src/boot/pc/iso.c
index e6a483902..d43ad4231 100644
--- a/sys/src/boot/pc/iso.c
+++ b/sys/src/boot/pc/iso.c
@@ -111,15 +111,19 @@ isowalk(Extend *ex, int drive, char *path)
ex->len = *((ulong*)(ex->buf + 156 + 10));
for(;;){
- if(readn(ex, &d, Dirsz) != Dirsz)
+ if(read(ex, &d.dirlen, 1) != 1)
break;
if(d.dirlen == 0)
+ continue; /* zero padding to next sector */
+ if(read(ex, &d.dirlen + 1, Dirsz-1) != Dirsz-1)
break;
- if(readn(ex, name, d.namelen) != d.namelen)
+ if(read(ex, name, d.namelen) != d.namelen)
break;
i = d.dirlen - (Dirsz + d.namelen);
- while(i-- > 0)
- read(ex, &c, 1);
+ while(i-- > 0){
+ if(read(ex, &c, 1) != 1)
+ break;
+ }
for(i=0; i<d.namelen; i++){
c = name[i];
if(c >= 'A' && c <= 'Z'){