|
@@ -1473,7 +1473,7 @@ static int smack_inode_removexattr(struct dentry *dentry, const char *name)
|
|
|
* @inode: the object
|
|
|
* @name: attribute name
|
|
|
* @buffer: where to put the result
|
|
|
- * @alloc: unused
|
|
|
+ * @alloc: duplicate memory
|
|
|
*
|
|
|
* Returns the size of the attribute or an error code
|
|
|
*/
|
|
@@ -1486,43 +1486,38 @@ static int smack_inode_getsecurity(struct inode *inode,
|
|
|
struct super_block *sbp;
|
|
|
struct inode *ip = (struct inode *)inode;
|
|
|
struct smack_known *isp;
|
|
|
- int ilen;
|
|
|
- int rc = 0;
|
|
|
|
|
|
- if (strcmp(name, XATTR_SMACK_SUFFIX) == 0) {
|
|
|
+ if (strcmp(name, XATTR_SMACK_SUFFIX) == 0)
|
|
|
isp = smk_of_inode(inode);
|
|
|
- ilen = strlen(isp->smk_known);
|
|
|
- *buffer = isp->smk_known;
|
|
|
- return ilen;
|
|
|
- }
|
|
|
+ else {
|
|
|
+ /*
|
|
|
+ * The rest of the Smack xattrs are only on sockets.
|
|
|
+ */
|
|
|
+ sbp = ip->i_sb;
|
|
|
+ if (sbp->s_magic != SOCKFS_MAGIC)
|
|
|
+ return -EOPNOTSUPP;
|
|
|
|
|
|
- /*
|
|
|
- * The rest of the Smack xattrs are only on sockets.
|
|
|
- */
|
|
|
- sbp = ip->i_sb;
|
|
|
- if (sbp->s_magic != SOCKFS_MAGIC)
|
|
|
- return -EOPNOTSUPP;
|
|
|
+ sock = SOCKET_I(ip);
|
|
|
+ if (sock == NULL || sock->sk == NULL)
|
|
|
+ return -EOPNOTSUPP;
|
|
|
|
|
|
- sock = SOCKET_I(ip);
|
|
|
- if (sock == NULL || sock->sk == NULL)
|
|
|
- return -EOPNOTSUPP;
|
|
|
-
|
|
|
- ssp = sock->sk->sk_security;
|
|
|
+ ssp = sock->sk->sk_security;
|
|
|
|
|
|
- if (strcmp(name, XATTR_SMACK_IPIN) == 0)
|
|
|
- isp = ssp->smk_in;
|
|
|
- else if (strcmp(name, XATTR_SMACK_IPOUT) == 0)
|
|
|
- isp = ssp->smk_out;
|
|
|
- else
|
|
|
- return -EOPNOTSUPP;
|
|
|
+ if (strcmp(name, XATTR_SMACK_IPIN) == 0)
|
|
|
+ isp = ssp->smk_in;
|
|
|
+ else if (strcmp(name, XATTR_SMACK_IPOUT) == 0)
|
|
|
+ isp = ssp->smk_out;
|
|
|
+ else
|
|
|
+ return -EOPNOTSUPP;
|
|
|
+ }
|
|
|
|
|
|
- ilen = strlen(isp->smk_known);
|
|
|
- if (rc == 0) {
|
|
|
- *buffer = isp->smk_known;
|
|
|
- rc = ilen;
|
|
|
+ if (alloc) {
|
|
|
+ *buffer = kstrdup(isp->smk_known, GFP_KERNEL);
|
|
|
+ if (*buffer == NULL)
|
|
|
+ return -ENOMEM;
|
|
|
}
|
|
|
|
|
|
- return rc;
|
|
|
+ return strlen(isp->smk_known);
|
|
|
}
|
|
|
|
|
|
|