Merge tag 'Smack-for-v5.12' of git://github.com/cschaufler/smack-next
authorLinus Torvalds <torvalds@linux-foundation.org>
Mon, 22 Feb 2021 01:11:07 +0000 (17:11 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Mon, 22 Feb 2021 01:11:07 +0000 (17:11 -0800)
Pull smack updates from Casey Schaufler:
 "Bounds checking for writes to smackfs interfaces"

* tag 'Smack-for-v5.12' of git://github.com/cschaufler/smack-next:
  smackfs: restrict bytes count in smackfs write functions

security/smack/smackfs.c

index 5d44b7d..22ded2c 100644 (file)
@@ -1167,7 +1167,7 @@ static ssize_t smk_write_net4addr(struct file *file, const char __user *buf,
                return -EPERM;
        if (*ppos != 0)
                return -EINVAL;
-       if (count < SMK_NETLBLADDRMIN)
+       if (count < SMK_NETLBLADDRMIN || count > PAGE_SIZE - 1)
                return -EINVAL;
 
        data = memdup_user_nul(buf, count);
@@ -1427,7 +1427,7 @@ static ssize_t smk_write_net6addr(struct file *file, const char __user *buf,
                return -EPERM;
        if (*ppos != 0)
                return -EINVAL;
-       if (count < SMK_NETLBLADDRMIN)
+       if (count < SMK_NETLBLADDRMIN || count > PAGE_SIZE - 1)
                return -EINVAL;
 
        data = memdup_user_nul(buf, count);
@@ -1834,6 +1834,10 @@ static ssize_t smk_write_ambient(struct file *file, const char __user *buf,
        if (!smack_privileged(CAP_MAC_ADMIN))
                return -EPERM;
 
+       /* Enough data must be present */
+       if (count == 0 || count > PAGE_SIZE)
+               return -EINVAL;
+
        data = memdup_user_nul(buf, count);
        if (IS_ERR(data))
                return PTR_ERR(data);
@@ -2005,6 +2009,9 @@ static ssize_t smk_write_onlycap(struct file *file, const char __user *buf,
        if (!smack_privileged(CAP_MAC_ADMIN))
                return -EPERM;
 
+       if (count > PAGE_SIZE)
+               return -EINVAL;
+
        data = memdup_user_nul(buf, count);
        if (IS_ERR(data))
                return PTR_ERR(data);
@@ -2092,6 +2099,9 @@ static ssize_t smk_write_unconfined(struct file *file, const char __user *buf,
        if (!smack_privileged(CAP_MAC_ADMIN))
                return -EPERM;
 
+       if (count > PAGE_SIZE)
+               return -EINVAL;
+
        data = memdup_user_nul(buf, count);
        if (IS_ERR(data))
                return PTR_ERR(data);
@@ -2648,6 +2658,10 @@ static ssize_t smk_write_syslog(struct file *file, const char __user *buf,
        if (!smack_privileged(CAP_MAC_ADMIN))
                return -EPERM;
 
+       /* Enough data must be present */
+       if (count == 0 || count > PAGE_SIZE)
+               return -EINVAL;
+
        data = memdup_user_nul(buf, count);
        if (IS_ERR(data))
                return PTR_ERR(data);
@@ -2740,10 +2754,13 @@ static ssize_t smk_write_relabel_self(struct file *file, const char __user *buf,
                return -EPERM;
 
        /*
+        * No partial write.
         * Enough data must be present.
         */
        if (*ppos != 0)
                return -EINVAL;
+       if (count == 0 || count > PAGE_SIZE)
+               return -EINVAL;
 
        data = memdup_user_nul(buf, count);
        if (IS_ERR(data))