Date: Fri, 8 Nov 2002 10:50:25 -0800 (PST) From: Brian Feldman <green@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 20860 for review Message-ID: <200211081850.gA8IoP1s065300@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=20860 Change 20860 by green@green_laptop_2 on 2002/11/08 10:49:58 Make fsck_ffs(8)'s extended attribute checks do something useful: actually perform sanity checks on the extent and offer to dump the entire extent for debugging. Affected files ... .. //depot/projects/trustedbsd/mac/sbin/fsck_ffs/ea.c#2 edit Differences ... ==== //depot/projects/trustedbsd/mac/sbin/fsck_ffs/ea.c#2 (text+ko) ==== @@ -47,42 +47,84 @@ #include <ufs/ffs/fs.h> #include <err.h> +#include <errno.h> #include <string.h> +#include <unistd.h> #include "fsck.h" +static int chkextattr(u_char *, int32_t); + /* - * Scan each entry in an ea block. + * Scan each entry in an ea block and do basic sanity checks as per + * those in src/sys/ufs/ffs/ffs_vnops.c:ffs_findextattr(). */ int eascan(struct inodesc *idesc, struct ufs2_dinode *dp) { -#if 1 - return (0); -#else struct bufarea *bp; - u_int dsize, n; + char tmpf[sizeof("/tmp/fsck_ffs-extent.XXXXXX")]; u_char *cp; long blksiz; - char dbuf[DIRBLKSIZ]; + int fd; - printf("Inode %ju extsize %ju\n", - (intmax_t)idesc->id_number, (intmax_t)dp->di_extsize); if (dp->di_extsize == 0) return 0; if (dp->di_extsize <= sblock.fs_fsize) blksiz = sblock.fs_fsize; else - blksiz = sblock.fs_bsize; - printf("blksiz = %ju\n", (intmax_t)blksiz); + blksiz = dp->di_extsize; bp = getdatablk(dp->di_extb[0], blksiz); cp = (u_char *)bp->b_un.b_buf; - for (n = 0; n < blksiz; n++) { - printf("%02x", cp[n]); - if ((n & 31) == 31) - printf("\n"); + if (chkextattr(cp, dp->di_extsize)) { + pfatal("CORRUPT EXTENDED ATTRIBUTES I=%lu", + (u_long)idesc->id_number); + if (reply("DUMP EXTENT") == 1) { + strcpy(tmpf, "/tmp/fsck_ffs-extent.XXXXXX"); + fd = mkstemp(tmpf); + if (fd == -1) { + pwarn("temp file for dump: %s\n", + strerror(errno)); + } else { + pwarn("dump file at %s\n", tmpf); + (void)write(fd, cp, dp->di_extsize); + (void)close(fd); + } + } } - return (STOP); -#endif + bp->b_flags &= ~B_INUSE; + return (0); } +static int +chkextattr(u_char *ptr, int32_t length) +{ + u_char *p, *pe, *pn; + int nlen; + uint32_t ul, eapad2; + + pe = ptr + length; + + for (p = ptr; p < pe; p = pn) { + bcopy(p, &ul, sizeof(ul)); + pn = p + ul; + /* make sure this entry is complete */ + if (pn > pe) + return (EIO); + /* don't loop forever on a corrupt entry */ + if (pn <= p) + return (EIO); + p += sizeof(uint32_t); + p++; + eapad2 = *p++; + /* padding is at most 7 bytes */ + if (eapad2 >= 8) + return (EIO); + nlen = *p; + p++; + /* compare only up to the end of this attribute */ + if (p + nlen > pn) + return (EIO); + } + return (0); +} To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe p4-projects" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200211081850.gA8IoP1s065300>