Fix a few bugs, especially when repairing disks:

Print correct pathname in error messages
Fix unterminating loop when trying to correct a bad fat
Require fat media byte to be the same as the one in the bpb
Fix unterminating loop when looking for free directory slot in LOST.DIR
(bad disk image provided by Christoph Badura)
This commit is contained in:
ws 1997-09-08 14:05:30 +00:00
parent 70707ec9bc
commit daa7d68f2a
2 changed files with 23 additions and 33 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: dir.c,v 1.8 1996/09/27 23:22:52 christos Exp $ */
/* $NetBSD: dir.c,v 1.9 1997/09/08 14:05:30 ws Exp $ */
/*
* Copyright (C) 1995, 1996 Wolfgang Solfrank
@ -36,7 +36,7 @@
#ifndef lint
static char rcsid[] = "$NetBSD: dir.c,v 1.8 1996/09/27 23:22:52 christos Exp $";
static char rcsid[] = "$NetBSD: dir.c,v 1.9 1997/09/08 14:05:30 ws Exp $";
#endif /* not lint */
#include <stdio.h>
@ -187,6 +187,8 @@ fullpath(dir)
} while ((dir = dir->parent) != NULL);
if (dir)
*--cp = '?';
else
cp++;
return cp;
}
@ -654,6 +656,8 @@ readDosDirSection(f, boot, fat, dir)
}
vallfn = NULL; /* not used any longer */
invlfn = NULL;
dirent.parent = dir;
dirent.next = dir->child;
if (dirent.size == 0 && !(dirent.flags & ATTR_DIRECTORY)) {
if (dirent.head != 0) {
@ -715,8 +719,6 @@ readDosDirSection(f, boot, fat, dir)
}
}
dirent.parent = dir;
dirent.next = dir->child;
if (dirent.head >= CLUST_FIRST && dirent.head < boot->NumClusters)
fat[dirent.head].flags |= FAT_USED;
@ -769,14 +771,11 @@ readDosDirSection(f, boot, fat, dir)
continue;
}
boot->NumFiles++;
/* create directory tree node */
if (!(d = newDosDirEntry())) {
perror("No space for directory");
return FSFATAL;
}
memcpy(d, &dirent, sizeof(struct dosDirEntry));
/* link it into the tree */
dir->child = d;
@ -793,8 +792,8 @@ readDosDirSection(f, boot, fat, dir)
mod |= k = checksize(boot, fat, p, &dirent);
if (k & FSDIRMOD)
mod |= THISMOD;
boot->NumFiles++;
}
boot->NumFiles++;
}
if (mod & THISMOD) {
last *= 32;
@ -902,7 +901,7 @@ reconnect(dosfs, boot, fat, head)
p = lfbuf;
while (1) {
if (p)
while (p < lfbuf + boot->ClusterSize)
for (; p < lfbuf + boot->ClusterSize; p += 32)
if (*p == SLOT_EMPTY
|| *p == SLOT_DELETED)
break;
@ -917,7 +916,7 @@ reconnect(dosfs, boot, fat, head)
lfoff = lfcl * boot->ClusterSize
+ boot->ClusterOffset * boot->BytesPerSec;
if (lseek(dosfs, lfoff, SEEK_SET) != lfoff
|| read(dosfs, buffer, boot->ClusterSize) != boot->ClusterSize) {
|| read(dosfs, lfbuf, boot->ClusterSize) != boot->ClusterSize) {
perror("could not read LOST.DIR");
return FSFATAL;
}
@ -946,7 +945,7 @@ reconnect(dosfs, boot, fat, head)
p[31] = (u_char)(d.size >> 24);
fat[head].flags |= FAT_USED;
if (lseek(dosfs, lfoff, SEEK_SET) != lfoff
|| write(dosfs, buffer, boot->ClusterSize) != boot->ClusterSize) {
|| write(dosfs, lfbuf, boot->ClusterSize) != boot->ClusterSize) {
perror("could not write LOST.DIR");
return FSFATAL;
}

View File

@ -1,4 +1,4 @@
/* $NetBSD: fat.c,v 1.5 1997/01/03 14:32:49 ws Exp $ */
/* $NetBSD: fat.c,v 1.6 1997/09/08 14:05:31 ws Exp $ */
/*
* Copyright (C) 1995, 1996 Wolfgang Solfrank
@ -34,7 +34,7 @@
#ifndef lint
static char rcsid[] = "$NetBSD: fat.c,v 1.5 1997/01/03 14:32:49 ws Exp $";
static char rcsid[] = "$NetBSD: fat.c,v 1.6 1997/09/08 14:05:31 ws Exp $";
#endif /* not lint */
#include <stdlib.h>
@ -140,7 +140,8 @@ readfat(fs, boot, no, fp)
fat[0].length = buffer[0]|(buffer[1] << 8)|(buffer[2] << 16);
if (boot->Is16BitFat)
fat[0].length |= buffer[3] << 24;
if (buffer[1] != 0xff || buffer[2] != 0xff
if (buffer[0] != boot->Media
|| buffer[1] != 0xff || buffer[2] != 0xff
|| (boot->Is16BitFat && buffer[3] != 0xff)) {
char *msg = boot->Is16BitFat
? "FAT starts with odd byte sequence (%02x%02x%02x%02x)\n"
@ -273,18 +274,6 @@ comparefat(boot, first, second, fatnum)
cl_t cl;
int ret = FSOK;
if (first[0].next != second[0].next) {
pwarn("Media bytes in cluster 1(%02x) and %d(%02x) differ\n",
first[0].next, fatnum, second[0].next);
if (ask(1, "Use media byte from FAT 1")) {
second[0].next = first[0].next;
ret |= FSFATMOD;
} else if (ask(0, "Use media byte from FAT %d", fatnum)) {
first[0].next = second[0].next;
ret |= FSFATMOD;
} else
ret |= FSERROR;
}
for (cl = CLUST_FIRST; cl < boot->NumClusters; cl++)
if (first[cl].next != second[cl].next)
ret |= clustdiffer(cl, &first[cl].next, &second[cl].next, fatnum);
@ -326,7 +315,7 @@ checkfat(boot, fat)
*/
for (head = CLUST_FIRST; head < boot->NumClusters; head++) {
/* find next untraveled chain */
if (fat[head].head != 0 /* cluster already belongs to some chain*/
if (fat[head].head != 0 /* cluster already belongs to some chain */
|| fat[head].next == CLUST_FREE
|| fat[head].next == CLUST_BAD)
continue; /* skip it. */
@ -446,16 +435,18 @@ writefat(fs, boot, fat)
}
memset(buffer, 0, fatsz);
boot->NumFree = 0;
buffer[0] = (u_char)fat[0].length;
buffer[1] = (u_char)(fat[0].length >> 8);
p = buffer;
*p++ = (u_char)fat[0].length;
*p++ = (u_char)(fat[0].length >> 8);
*p++ = (u_char)(fat[0].length >> 16);
if (boot->Is16BitFat)
buffer[3] = (u_char)(fat[0].length >> 24);
for (cl = CLUST_FIRST, p = buffer; cl < boot->NumClusters;) {
*p++ = (u_char)(fat[0].length >> 24);
for (cl = CLUST_FIRST; cl < boot->NumClusters; cl++) {
if (boot->Is16BitFat) {
p[0] = (u_char)fat[cl].next;
if (fat[cl].next == CLUST_FREE)
boot->NumFree++;
p[1] = (u_char)(fat[cl++].next >> 8);
p[1] = (u_char)(fat[cl].next >> 8);
p += 2;
} else {
if (fat[cl].next == CLUST_FREE)
@ -466,7 +457,7 @@ writefat(fs, boot, fat)
p[0] = (u_char)fat[cl].next;
p[1] = (u_char)((fat[cl].next >> 8) & 0xf)
|(u_char)(fat[cl+1].next << 4);
p[2] = (u_char)(fat[cl++].next >> 8);
p[2] = (u_char)(fat[++cl].next >> 4);
p += 3;
}
}