diff options
| author | Poul-Henning Kamp <phk@FreeBSD.org> | 2002-08-20 11:34:58 +0000 |
|---|---|---|
| committer | Poul-Henning Kamp <phk@FreeBSD.org> | 2002-08-20 11:34:58 +0000 |
| commit | 7428de69d2f18c9596699117dce2d1c069b34bb5 (patch) | |
| tree | 1d60247bc4c18d0a0d7585e18e0080a48b480168 /sys | |
| parent | 8453c174a178a8ad1ae28ed0385bcfb0dc021ac8 (diff) | |
Notes
Diffstat (limited to 'sys')
| -rw-r--r-- | sys/ufs/ffs/ffs_vnops.c | 42 |
1 files changed, 33 insertions, 9 deletions
diff --git a/sys/ufs/ffs/ffs_vnops.c b/sys/ufs/ffs/ffs_vnops.c index 7c9f9bb93321..b88be6c6299d 100644 --- a/sys/ufs/ffs/ffs_vnops.c +++ b/sys/ufs/ffs/ffs_vnops.c @@ -1396,9 +1396,10 @@ vop_getextattr { { struct inode *ip; struct fs *fs; - u_char *eae, *p; + u_char *eae, *p, *pe, *pn; struct ufs2_dinode *dp; unsigned easize; + uint32_t ul; int error, ealen; ip = VTOI(ap->a_vp); @@ -1412,15 +1413,38 @@ vop_getextattr { if (error) return (error); easize = dp->di_extsize; - error = ENOATTR; - ealen = ffs_findextattr(eae, easize, - ap->a_attrnamespace, ap->a_name, NULL, &p); - if (ealen != 0) { + if (strlen(ap->a_name) > 0) { + error = ENOATTR; + ealen = ffs_findextattr(eae, easize, + ap->a_attrnamespace, ap->a_name, NULL, &p); + if (ealen != 0) { + 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 = 0; if (ap->a_size != NULL) - *ap->a_size = ealen; - else if (ap->a_uio != NULL) - error = uiomove(p, ealen, ap->a_uio); + *ap->a_size = 0; + pe = eae + easize; + for(p = eae; error == 0 && p < pe; p = pn) { + bcopy(p, &ul, sizeof(ul)); + pn = p + ul; + if (pn > pe) + break; + p += sizeof(ul); + if (*p++ != ap->a_attrnamespace) + continue; + p++; /* pad2 */ + ealen = *p; + if (ap->a_size != NULL) { + *ap->a_size += ealen + 1; + } else if (ap->a_uio != NULL) { + error = uiomove(p, ealen + 1, ap->a_uio); + } + } } free(eae, M_TEMP); return(error); @@ -1465,7 +1489,7 @@ vop_setextattr { dp = ip->i_din2; /* Calculate the length of the EA entry */ - if (ap->a_uio == NULL) { + if (ap->a_uio == NULL || ap->a_uio->uio_resid == 0) { /* delete */ ealength = eapad1 = ealen = eapad2 = eacont = 0; } else { |
