summaryrefslogtreecommitdiffstats
path: root/sbin
diff options
context:
space:
mode:
authordg <dg@FreeBSD.org>1994-09-09 11:06:27 +0000
committerdg <dg@FreeBSD.org>1994-09-09 11:06:27 +0000
commit07c3866a6e3d1bc84ae70e71b9dc5209d2c82321 (patch)
treee0851b00dd84ff861664fa1372a7b37d8932f469 /sbin
parent692067737c6d489a3ad726eaa444614b94e79442 (diff)
downloadFreeBSD-src-07c3866a6e3d1bc84ae70e71b9dc5209d2c82321.zip
FreeBSD-src-07c3866a6e3d1bc84ae70e71b9dc5209d2c82321.tar.gz
Two fixes from the NetBSD group (Charles Hannum):
1) dir.c: get byte order right in mkentry() 2) pass1.c: When doing -c2 conversion, do secsize reads for a symlink - not doing so was causing the conversion to fail because the device driver can't deal with short reads.
Diffstat (limited to 'sbin')
-rw-r--r--sbin/fsck/dir.c17
-rw-r--r--sbin/fsck/pass1.c5
-rw-r--r--sbin/fsck_ffs/dir.c17
-rw-r--r--sbin/fsck_ffs/pass1.c5
-rw-r--r--sbin/fsck_ifs/dir.c17
-rw-r--r--sbin/fsck_ifs/pass1.c5
6 files changed, 45 insertions, 21 deletions
diff --git a/sbin/fsck/dir.c b/sbin/fsck/dir.c
index ee5d095..77769cc 100644
--- a/sbin/fsck/dir.c
+++ b/sbin/fsck/dir.c
@@ -328,13 +328,20 @@ mkentry(idesc)
dirp->d_reclen = oldlen;
dirp = (struct direct *)(((char *)dirp) + oldlen);
dirp->d_ino = idesc->id_parent; /* ino to be entered is in id_parent */
- if (newinofmt)
+ if (newinofmt) {
dirp->d_type = typemap[idesc->id_parent];
- else
- dirp->d_type = 0;
+ dirp->d_namlen = newent.d_namlen;
+ } else {
+# if (BYTE_ORDER == LITTLE_ENDIAN)
+ dirp->d_type = newent.d_namlen;
+ dirp->d_namlen = 0;
+# else
+ dirp->d_type = 0;
+ dirp->d_namlen = newent.d_namlen;
+# endif
+ }
dirp->d_reclen = newent.d_reclen;
- dirp->d_namlen = newent.d_namlen;
- bcopy(idesc->id_name, dirp->d_name, (size_t)dirp->d_namlen + 1);
+ bcopy(idesc->id_name, dirp->d_name, (size_t)newent.d_namlen + 1);
return (ALTERED|STOP);
}
diff --git a/sbin/fsck/pass1.c b/sbin/fsck/pass1.c
index a3ab2f9..fc46eb0 100644
--- a/sbin/fsck/pass1.c
+++ b/sbin/fsck/pass1.c
@@ -95,7 +95,7 @@ checkinode(inumber, idesc)
struct zlncnt *zlnp;
int ndb, j;
mode_t mode;
- char symbuf[MAXSYMLINKLEN];
+ char *symbuf;
dp = getnextinode(inumber);
mode = dp->di_mode & IFMT;
@@ -141,9 +141,10 @@ checkinode(inumber, idesc)
if (doinglevel2 &&
dp->di_size > 0 && dp->di_size < MAXSYMLINKLEN &&
dp->di_blocks != 0) {
+ symbuf = alloca(secsize);
if (bread(fsreadfd, symbuf,
fsbtodb(&sblock, dp->di_db[0]),
- (long)dp->di_size) != 0)
+ (long)secsize) != 0)
errexit("cannot read symlink");
if (debug) {
symbuf[dp->di_size] = 0;
diff --git a/sbin/fsck_ffs/dir.c b/sbin/fsck_ffs/dir.c
index ee5d095..77769cc 100644
--- a/sbin/fsck_ffs/dir.c
+++ b/sbin/fsck_ffs/dir.c
@@ -328,13 +328,20 @@ mkentry(idesc)
dirp->d_reclen = oldlen;
dirp = (struct direct *)(((char *)dirp) + oldlen);
dirp->d_ino = idesc->id_parent; /* ino to be entered is in id_parent */
- if (newinofmt)
+ if (newinofmt) {
dirp->d_type = typemap[idesc->id_parent];
- else
- dirp->d_type = 0;
+ dirp->d_namlen = newent.d_namlen;
+ } else {
+# if (BYTE_ORDER == LITTLE_ENDIAN)
+ dirp->d_type = newent.d_namlen;
+ dirp->d_namlen = 0;
+# else
+ dirp->d_type = 0;
+ dirp->d_namlen = newent.d_namlen;
+# endif
+ }
dirp->d_reclen = newent.d_reclen;
- dirp->d_namlen = newent.d_namlen;
- bcopy(idesc->id_name, dirp->d_name, (size_t)dirp->d_namlen + 1);
+ bcopy(idesc->id_name, dirp->d_name, (size_t)newent.d_namlen + 1);
return (ALTERED|STOP);
}
diff --git a/sbin/fsck_ffs/pass1.c b/sbin/fsck_ffs/pass1.c
index a3ab2f9..fc46eb0 100644
--- a/sbin/fsck_ffs/pass1.c
+++ b/sbin/fsck_ffs/pass1.c
@@ -95,7 +95,7 @@ checkinode(inumber, idesc)
struct zlncnt *zlnp;
int ndb, j;
mode_t mode;
- char symbuf[MAXSYMLINKLEN];
+ char *symbuf;
dp = getnextinode(inumber);
mode = dp->di_mode & IFMT;
@@ -141,9 +141,10 @@ checkinode(inumber, idesc)
if (doinglevel2 &&
dp->di_size > 0 && dp->di_size < MAXSYMLINKLEN &&
dp->di_blocks != 0) {
+ symbuf = alloca(secsize);
if (bread(fsreadfd, symbuf,
fsbtodb(&sblock, dp->di_db[0]),
- (long)dp->di_size) != 0)
+ (long)secsize) != 0)
errexit("cannot read symlink");
if (debug) {
symbuf[dp->di_size] = 0;
diff --git a/sbin/fsck_ifs/dir.c b/sbin/fsck_ifs/dir.c
index ee5d095..77769cc 100644
--- a/sbin/fsck_ifs/dir.c
+++ b/sbin/fsck_ifs/dir.c
@@ -328,13 +328,20 @@ mkentry(idesc)
dirp->d_reclen = oldlen;
dirp = (struct direct *)(((char *)dirp) + oldlen);
dirp->d_ino = idesc->id_parent; /* ino to be entered is in id_parent */
- if (newinofmt)
+ if (newinofmt) {
dirp->d_type = typemap[idesc->id_parent];
- else
- dirp->d_type = 0;
+ dirp->d_namlen = newent.d_namlen;
+ } else {
+# if (BYTE_ORDER == LITTLE_ENDIAN)
+ dirp->d_type = newent.d_namlen;
+ dirp->d_namlen = 0;
+# else
+ dirp->d_type = 0;
+ dirp->d_namlen = newent.d_namlen;
+# endif
+ }
dirp->d_reclen = newent.d_reclen;
- dirp->d_namlen = newent.d_namlen;
- bcopy(idesc->id_name, dirp->d_name, (size_t)dirp->d_namlen + 1);
+ bcopy(idesc->id_name, dirp->d_name, (size_t)newent.d_namlen + 1);
return (ALTERED|STOP);
}
diff --git a/sbin/fsck_ifs/pass1.c b/sbin/fsck_ifs/pass1.c
index a3ab2f9..fc46eb0 100644
--- a/sbin/fsck_ifs/pass1.c
+++ b/sbin/fsck_ifs/pass1.c
@@ -95,7 +95,7 @@ checkinode(inumber, idesc)
struct zlncnt *zlnp;
int ndb, j;
mode_t mode;
- char symbuf[MAXSYMLINKLEN];
+ char *symbuf;
dp = getnextinode(inumber);
mode = dp->di_mode & IFMT;
@@ -141,9 +141,10 @@ checkinode(inumber, idesc)
if (doinglevel2 &&
dp->di_size > 0 && dp->di_size < MAXSYMLINKLEN &&
dp->di_blocks != 0) {
+ symbuf = alloca(secsize);
if (bread(fsreadfd, symbuf,
fsbtodb(&sblock, dp->di_db[0]),
- (long)dp->di_size) != 0)
+ (long)secsize) != 0)
errexit("cannot read symlink");
if (debug) {
symbuf[dp->di_size] = 0;
OpenPOWER on IntegriCloud