Subject: [PATCH v4 4/3] LSM: Improve context interface for proc attrs

Replace kzalloc ... sprintf with kasprintf in the
"context" procfs attr code.

Signed-off-by: Casey Schaufler <ca...@schaufler-ca.com>

---
 security/apparmor/lsm.c    | 47 +++++++++++++++++++++++-----------------------
 security/selinux/hooks.c   |  4 +---
 security/smack/smack_lsm.c |  5 +----
 3 files changed, 26 insertions(+), 30 deletions(-)

diff --git a/security/apparmor/lsm.c b/security/apparmor/lsm.c
index 3790a7d..5cac15f 100644
--- a/security/apparmor/lsm.c
+++ b/security/apparmor/lsm.c
@@ -476,6 +476,8 @@ static int apparmor_getprocattr(struct task_struct *task, 
char *name,
        const struct cred *cred = get_task_cred(task);
        struct aa_task_cxt *cxt = cred_cxt(cred);
        struct aa_profile *profile = NULL;
+       char *vp;
+       char *np;
 
        if (strcmp(name, "current") == 0)
                profile = aa_get_newest_profile(cxt->profile);
@@ -488,30 +490,29 @@ static int apparmor_getprocattr(struct task_struct *task, 
char *name,
        else
                error = -EINVAL;
 
-       if (profile) {
-               if (strcmp(name, "context") == 0) {
-                       char *vp;
-                       char *np;
-
-                       error = aa_getprocattr(profile, &vp);
-                       if (error > 0) {
-                               error += 12;
-                               *value = kzalloc(error, GFP_KERNEL);
-                               if (*value == NULL)
-                                       error = -ENOMEM;
-                               else {
-                                       sprintf(*value, "apparmor='%s'", vp);
-                                       np = strchr(*value, '\n');
-                                       if (np != NULL) {
-                                               np[0] = '\'';
-                                               np[1] = '\0';
-                                       }
-                               }
-                       }
-               } else
-                       error = aa_getprocattr(profile, value);
-       }
+       if (profile == NULL)
+               goto put_out;
+
+       error = aa_getprocattr(profile, &vp);
+       if (error < 0)
+               goto put_out;
+
+       if (strcmp(name, "context") == 0) {
+               *value = kasprintf(GFP_KERNEL, "apparmor='%s'", vp);
+               if (*value == NULL) {
+                       error = -ENOMEM;
+                       goto put_out;
+               }
+               np = strchr(*value, '\n');
+               if (np != NULL) {
+                       np[0] = '\'';
+                       np[1] = '\0';
+               }
+               error = strlen(*value);
+       } else
+               *value = vp;
 
+put_out:
        aa_put_profile(profile);
        put_cred(cred);
 
diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c
index 3a21c2b..6397721 100644
--- a/security/selinux/hooks.c
+++ b/security/selinux/hooks.c
@@ -5737,11 +5737,9 @@ static int selinux_getprocattr(struct task_struct *p,
 
                error = security_sid_to_context(sid, &vp, &len);
                if (!error) {
-                       *value = kzalloc(len + 10, GFP_KERNEL);
+                       *value = kasprintf(GFP_KERNEL, "selinux='%s'", vp);
                        if (*value == NULL)
                                error = -ENOMEM;
-                       else
-                               sprintf(*value, "selinux='%s'", vp);
                }
        }
 
diff --git a/security/smack/smack_lsm.c b/security/smack/smack_lsm.c
index d2d8624..92e66f8 100644
--- a/security/smack/smack_lsm.c
+++ b/security/smack/smack_lsm.c
@@ -3574,18 +3574,15 @@ static int smack_getprocattr(struct task_struct *p, 
char *name, char **value)
 {
        struct smack_known *skp = smk_of_task_struct(p);
        char *cp;
-       int slen;
 
        if (strcmp(name, "current") == 0) {
                cp = kstrdup(skp->smk_known, GFP_KERNEL);
                if (cp == NULL)
                        return -ENOMEM;
        } else if (strcmp(name, "context") == 0) {
-               slen = strlen(skp->smk_known) + 9;
-               cp = kzalloc(slen, GFP_KERNEL);
+               cp = kasprintf(GFP_KERNEL, "smack='%s'", skp->smk_known);
                if (cp == NULL)
                        return -ENOMEM;
-               sprintf(cp, "smack='%s'", skp->smk_known);
        } else
                return -EINVAL;
 

Reply via email to