From owner-p4-projects Fri Nov 8 8: 8: 2 2002 Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id EA87E37B404; Fri, 8 Nov 2002 08:07:58 -0800 (PST) Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 829F237B401 for ; Fri, 8 Nov 2002 08:07:58 -0800 (PST) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id 217D143E42 for ; Fri, 8 Nov 2002 08:07:58 -0800 (PST) (envelope-from green@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.12.6/8.12.6) with ESMTP id gA8G5umV049148 for ; Fri, 8 Nov 2002 08:05:56 -0800 (PST) (envelope-from green@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.12.6/8.12.6/Submit) id gA8G5uBJ049145 for perforce@freebsd.org; Fri, 8 Nov 2002 08:05:56 -0800 (PST) Date: Fri, 8 Nov 2002 08:05:56 -0800 (PST) Message-Id: <200211081605.gA8G5uBJ049145@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to green@freebsd.org using -f From: Brian Feldman Subject: PERFORCE change 20843 for review To: Perforce Change Reviews Sender: owner-p4-projects@FreeBSD.ORG Precedence: bulk List-ID: List-Archive: (Web Archive) List-Help: (List Instructions) List-Subscribe: List-Unsubscribe: X-Loop: FreeBSD.ORG http://perforce.freebsd.org/chv.cgi?CH=20843 Change 20843 by green@green_laptop_2 on 2002/11/08 08:05:02 Allow UFS2 extended attribute support to remain resilient in the face of corrupted extents on the filesystem. There is not currently a way to repair them in fsck(8), but at least we won't end up going into an infinite loop trying to process them. Affected files ... .. //depot/projects/trustedbsd/mac/sys/ufs/ffs/ffs_vnops.c#16 edit Differences ... ==== //depot/projects/trustedbsd/mac/sys/ufs/ffs/ffs_vnops.c#16 (text+ko) ==== @@ -1324,7 +1324,8 @@ * the length of the EA, and possibly the pointer to the entry and to the data. */ static int -ffs_findextattr(u_char *ptr, uint length, int nspace, const char *name, u_char **eap, u_char **eac) +ffs_findextattr(u_char *ptr, uint length, int nspace, const char *name, + int *ealenp, u_char **eap, u_char **eac) { u_char *p, *pe, *pn, *p0; int eapad1, eapad2, ealength, ealen, nlen; @@ -1340,6 +1341,9 @@ /* make sure this entry is complete */ if (pn > pe) break; + /* don't loop forever on a corrupt entry */ + if (pn <= p) + return (EFTYPE); p += sizeof(uint32_t); if (*p != nspace) continue; @@ -1361,9 +1365,10 @@ *eap = p0; if (eac != NULL) *eac = p; - return (ealen); + *ealenp = ealen; + return (0); } - return(-1); + return (ENOATTR); } static int @@ -1597,16 +1602,13 @@ eae = ip->i_ea_area; easize = ip->i_ea_len; if (strlen(ap->a_name) > 0) { - ealen = ffs_findextattr(eae, easize, - ap->a_attrnamespace, ap->a_name, NULL, &p); - if (ealen >= 0) { - error = 0; + error = ffs_findextattr(eae, easize, + ap->a_attrnamespace, ap->a_name, &ealen, NULL, &p); + if (error == 0) { if (ap->a_size != NULL) *ap->a_size = ealen; else if (ap->a_uio != NULL) error = uiomove(p, ealen, ap->a_uio); - } else { - error = ENOATTR; } } else { error = 0; @@ -1711,16 +1713,16 @@ bcopy(ip->i_ea_area, eae, ip->i_ea_len); easize = ip->i_ea_len; - olen = ffs_findextattr(eae, easize, - ap->a_attrnamespace, ap->a_name, &p, NULL); - if (olen == -1 && ealength == 0) { - /* delete but nonexistent */ + error = ffs_findextattr(eae, easize, + ap->a_attrnamespace, ap->a_name, &olen, &p, NULL); + if ((error == ENOATTR && ealength == 0) || /* delete but nonexistent */ + (error != 0 && error != ENOATTR)) { /* corrupted? */ free(eae, M_TEMP); if (stand_alone) ffs_close_ea(ap->a_vp, 0, ap->a_cred, ap->a_td); - return(ENOATTR); + return (error); } - if (olen == -1) { + if (error == ENOATTR) { /* new, append at end */ p = eae + easize; easize += ealength; To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe p4-projects" in the body of the message