Author: cem
Date: Wed Jan 18 17:55:49 2017
New Revision: 312391
URL: https://svnweb.freebsd.org/changeset/base/312391
Log:
ufs/extattr.h: Fix documentation of ea_name termination
The ea_name string is not nul-terminated. Correct the documentation.
Because the subsequent field is padded to 8 bytes, and the padding is
zeroed, the ea_name string will appear to be nul-terminated whenever the
length isn't exactly one (mod eight).
This was introduced in r167010 (2007).
Additionally, mark the length fields as unsigned. This particularly
matters for the single byte ea_namelength field, which can represent
extended attribute names up to 255 bytes long.
No functional change.
PR: 216127
Reported by: dewayne at heuristicsystems.com.au
Reviewed by: kib@
Sponsored by: Dell EMC Isilon
Differential Revision:https://reviews.freebsd.org/D9206
Modified:
head/share/man/man5/fs.5
head/sys/ufs/ufs/extattr.h
Modified: head/share/man/man5/fs.5
==
--- head/share/man/man5/fs.5Wed Jan 18 17:55:08 2017(r312390)
+++ head/share/man/man5/fs.5Wed Jan 18 17:55:49 2017(r312391)
@@ -28,7 +28,7 @@
.\" @(#)fs.5 8.2 (Berkeley) 4/19/94
.\" $FreeBSD$
.\"
-.Dd April 23, 2016
+.Dd January 16, 2017
.Dt FS 5
.Os
.Sh NAME
@@ -388,18 +388,19 @@ For further information, see the include
The format of an external attribute is defined by the extattr structure:
.Bd -literal
struct extattr {
- int32_t ea_length; /* length of this attribute */
- int8_t ea_namespace; /* name space of this attribute */
- int8_t ea_contentpadlen; /* padding at end of attribute */
- int8_t ea_namelength; /* length of attribute name */
- charea_name[1]; /* null-terminated attribute name */
+ uint32_t ea_length; /* length of this attribute */
+ uint8_t ea_namespace; /* name space of this attribute */
+ uint8_t ea_contentpadlen; /* bytes of padding at end of attribute */
+ uint8_t ea_namelength; /* length of attribute name */
+ charea_name[1]; /* attribute name (NOT nul-terminated) */
+ /* padding, if any, to align attribute content to 8 byte boundary */
/* extended attribute content follows */
};
.Ed
.Pp
Several macros are defined to manipulate these structures.
Each macro takes a pointer to an extattr structure.
-.Bl -tag -width ".Dv EXTATTR_SET_LENGTHS(eap, size)"
+.Bl -tag -width ".Dv EXTATTR_CONTENT_SIZE(eap)"
.It Dv EXTATTR_NEXT(eap)
Returns a pointer to the next extended attribute following
.Fa eap .
@@ -409,35 +410,19 @@ Returns a pointer to the extended attrib
.It Dv EXTATTR_CONTENT_SIZE(eap)
Returns the size of the extended attribute content referenced by
.Fa eap .
-.It Dv EXTATTR_SET_LENGTHS(eap, size)
-Called with the size of the attribute content after initializing
-the attribute name to calculate and set the
-.Fa ea_length ,
-.Fa ea_namelength ,
-and
-.Fa ea_contentpadlen
-fields of the extended attribute structure.
.El
.Pp
The following code identifies an ACL:
.Bd -literal
if (eap->ea_namespace == EXTATTR_NAMESPACE_SYSTEM &&
- !strcmp(eap->ea_name, POSIX1E_ACL_ACCESS_EXTATTR_NAME) {
+eap->ea_namelength == sizeof(POSIX1E_ACL_ACCESS_EXTATTR_NAME) - 1
&&
+ strncmp(eap->ea_name, POSIX1E_ACL_ACCESS_EXTATTR_NAME,
+ sizeof(POSIX1E_ACL_ACCESS_EXTATTR_NAME) - 1) == 0) {
aclp = EXTATTR_CONTENT(eap);
acllen = EXTATTR_CONTENT_SIZE(eap);
...
}
.Ed
-.Pp
-The following code creates an extended attribute
-containing a copy of a structure
-.Fa mygif :
-.Bd -literal
- eap->ea_namespace = EXTATTR_NAMESPACE_USER;
- strcpy(eap->ea_name, "filepic.gif");
- EXTATTR_SET_LENGTHS(eap, sizeof(struct mygif));
- memcpy(EXTATTR_CONTENT(eap), , sizeof(struct mygif));
-.Ed
.Sh HISTORY
A super-block structure named filsys appeared in
.At v6 .
Modified: head/sys/ufs/ufs/extattr.h
==
--- head/sys/ufs/ufs/extattr.h Wed Jan 18 17:55:08 2017(r312390)
+++ head/sys/ufs/ufs/extattr.h Wed Jan 18 17:55:49 2017(r312391)
@@ -73,11 +73,12 @@ struct ufs_extattr_header {
* This structure defines the required fields of an extended-attribute header.
*/
struct extattr {
- int32_t ea_length; /* length of this attribute */
- int8_t ea_namespace; /* name space of this attribute */
- int8_t ea_contentpadlen; /* bytes of padding at end of attribute */
- int8_t ea_namelength; /* length of attribute name */
- charea_name[1]; /* null-terminated attribute name */
+ uint32_t ea_length; /* length of this attribute */
+ uint8_t ea_namespace; /* name space