misc/177328: [patch] libstand fails on ext2fs directories with more than one block
Eric van Gyzen
eric at vangyzen.net
Sun Mar 24 02:50:01 UTC 2013
>Number: 177328
>Category: misc
>Synopsis: [patch] libstand fails on ext2fs directories with more than one block
>Confidential: no
>Severity: non-critical
>Priority: low
>Responsible: freebsd-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Sun Mar 24 02:50:00 UTC 2013
>Closed-Date:
>Last-Modified:
>Originator: Eric van Gyzen
>Release: 8.1-RELEASE
>Organization:
Dell, Inc.
>Environment:
N/A
>Description:
When booting from an ext2fs file system, the loader skips the first 1k of a file if the directory entry for that file isn't in the first 1k of the directory of the root directory.
>How-To-Repeat:
Put several files in the boot directory, then add the kernel, to ensure that the kernel's directory entry isn't in the first block of the directory.
>Fix:
Port this fix from ufs.c (from 2004):
http://svnweb.freebsd.org/base?view=revision&revision=134760
We've been running with the attached patch since August 2011.
Patch attached with submission follows:
diff --git a/src/lib/libstand/ext2fs.c b/src/lib/libstand/ext2fs.c
index 53c4f56..40ce167 100644
--- a/src/lib/libstand/ext2fs.c
+++ b/src/lib/libstand/ext2fs.c
@@ -536,6 +536,17 @@ ext2fs_open(const char *upath, struct open_file *f)
* Found terminal component.
*/
error = 0;
+
+ // Reset the seek pointer to 0 when a file is successfully opened,
+ // since otherwise the initial seek offset will contain the directory
+ // offset of the filesystem block that contained its directory entry.
+ // This bug was mostly harmless because typically the directory is
+ // less than one filesystem block in size so the offset would be zero.
+ // It did however generally break loading a kernel from the (large)
+ // kernel compile directory.
+ // http://www.freebsd.org/cgi/cvsweb.cgi/src/lib/libstand/ufs.c#rev1.15
+ fp->f_seekp = 0;
+
out:
if (buf)
free(buf);
@@ -585,6 +596,16 @@ read_inode(ino_t inumber, struct open_file *f)
fp->f_blkno[level] = -1;
fp->f_buf_blkno = -1;
+ // Reset the seek pointer to 0 when a file is successfully opened,
+ // since otherwise the initial seek offset will contain the directory
+ // offset of the filesystem block that contained its directory entry.
+ // This bug was mostly harmless because typically the directory is
+ // less than one filesystem block in size so the offset would be zero.
+ // It did however generally break loading a kernel from the (large)
+ // kernel compile directory.
+ // http://www.freebsd.org/cgi/cvsweb.cgi/src/lib/libstand/ufs.c#rev1.15
+ fp->f_seekp = 0;
+
out:
free(buf);
return (error);
>Release-Note:
>Audit-Trail:
>Unformatted:
More information about the freebsd-bugs
mailing list