Avoid memory allocation while opening smackfs files.
authorRafal Krypa <r.krypa@samsung.com>
Mon, 22 Jul 2013 09:22:30 +0000 (11:22 +0200)
committerJarkko Sakkinen <jarkko.sakkinen@intel.com>
Fri, 16 Aug 2013 10:28:44 +0000 (13:28 +0300)
Using openat() on pre-opened smackfs directory eliminates need to construct
absolute path to a smackfs file before opening it.

libsmack/init.c
libsmack/libsmack.c
utils/common.c

index 1711904..c3465d9 100644 (file)
@@ -44,6 +44,7 @@
 #define OLDSMACKFSMNT "/smack"
 
 char *smack_mnt = NULL;
+int smack_mnt_dirfd = -1;
 
 void set_smackmnt(const char *mnt)
 {
@@ -61,24 +62,31 @@ static int verify_smackmnt(const char *mnt)
 {
        struct statfs sfbuf;
        int rc;
+       int fd;
+
+       fd = open(mnt, O_RDONLY, 0);
+       if (fd < 0)
+               return -1;
 
        do {
-               rc = statfs(mnt, &sfbuf);
+               rc = fstatfs(fd, &sfbuf);
        } while (rc < 0 && errno == EINTR);
 
        if (rc == 0) {
                if ((uint32_t)sfbuf.f_type == (uint32_t)SMACK_MAGIC) {
                        struct statvfs vfsbuf;
-                       rc = statvfs(mnt, &vfsbuf);
+                       rc = fstatvfs(fd, &vfsbuf);
                        if (rc == 0) {
                                if (!(vfsbuf.f_flag & ST_RDONLY)) {
                                        set_smackmnt(mnt);
                                }
+                               smack_mnt_dirfd = fd;
                                return 0;
                        }
                }
        }
 
+       close(fd);
        return -1;
 }
 
index d98f233..e0487ca 100644 (file)
@@ -30,7 +30,6 @@
 #include <sys/stat.h>
 #include <sys/types.h>
 #include <unistd.h>
-#include <limits.h>
 #include <sys/xattr.h>
 
 #define ACC_LEN 5
@@ -52,6 +51,7 @@
 #define SELF_LABEL_FILE "/proc/self/attr/current"
 
 extern char *smack_mnt;
+extern int smack_mnt_dirfd;
 
 struct smack_rule {
        char subject[SMACK_LABEL_LEN + 1];
@@ -285,21 +285,18 @@ int smack_have_access(const char *subject, const char *object,
        int ret;
        int fd;
        int access2 = 1;
-       char path[PATH_MAX];
 
-       if (!smack_mnt) {
+       if (smack_mnt_dirfd < 0) {
                errno = EFAULT;
-               return -1; 
+               return -1;
        }
-       
-       snprintf(path, sizeof path, "%s/access2", smack_mnt);
-       fd = open(path, O_RDWR);
+
+       fd = openat(smack_mnt_dirfd, "access2", O_RDWR);
        if (fd < 0) {
                if (errno != ENOENT)
                        return -1;
-               
-               snprintf(path, sizeof path, "%s/access", smack_mnt);
-               fd = open(path, O_RDWR);
+
+               fd = openat(smack_mnt_dirfd, "access", O_RDWR);
                if (fd < 0)
                        return -1;
                access2 = 0;
@@ -366,16 +363,14 @@ int smack_cipso_apply(struct smack_cipso *cipso)
        char buf[CIPSO_MAX_SIZE];
        int fd;
        int i;
-       char path[PATH_MAX];
        int offset=0;
 
-       if (!smack_mnt) {
+       if (smack_mnt_dirfd < 0) {
                errno = EFAULT;
                return -1;
        }
 
-       snprintf(path, sizeof path, "%s/cipso2", smack_mnt);
-       fd = open(path, O_WRONLY);
+       fd = openat(smack_mnt_dirfd, "cipso2", O_WRONLY);
        if (fd < 0)
                return -1;
 
@@ -600,14 +595,17 @@ int smack_revoke_subject(const char *subject)
        int ret;
        int fd;
        int len;
-       char path[PATH_MAX];
+
+       if (smack_mnt_dirfd < 0) {
+               errno = EFAULT;
+               return -1;
+       }
 
        len = strnlen(subject, SMACK_LABEL_LEN + 1);
        if (len > SMACK_LABEL_LEN)
                return -1;
 
-       snprintf(path, sizeof path, "%s/revoke-subject", smack_mnt);
-       fd = open(path, O_WRONLY);
+       fd = openat(smack_mnt_dirfd, "revoke-subject", O_WRONLY);
        if (fd < 0)
                return -1;
 
@@ -626,29 +624,25 @@ static int accesses_apply(struct smack_accesses *handle, int clear)
        int load_fd;
        int change_fd;
        int load2 = 1;
-       char path[PATH_MAX];
 
-       if (!smack_mnt) {
+       if (smack_mnt_dirfd < 0) {
                errno = EFAULT;
-               return -1; 
+               return -1;
        }
-       
-       snprintf(path, sizeof path, "%s/load2", smack_mnt);
-       load_fd = open(path, O_WRONLY);
+
+       load_fd = openat(smack_mnt_dirfd, "load2", O_WRONLY);
        if (load_fd < 0) {
                if (errno != ENOENT)
                        return -1;
                /* fallback */
-               snprintf(path, sizeof path, "%s/load", smack_mnt);
-               load_fd = open(path, O_WRONLY);
+               load_fd = openat(smack_mnt_dirfd, "load", O_WRONLY);
                /* Try to continue if the file doesn't exist, we might not need it. */
                if (load_fd < 0 && errno != ENOENT)
                        return -1;
                load2 = 0;
        }
 
-       snprintf(path, sizeof path, "%s/change-rule", smack_mnt);
-       change_fd = open(path, O_WRONLY);
+       change_fd = openat(smack_mnt_dirfd, "change-rule", O_WRONLY);
        /* Try to continue if the file doesn't exist, we might not need it. */
        if (change_fd < 0 && errno != ENOENT) {
                ret = -1;
index 0ff1e78..2ec0f35 100644 (file)
@@ -30,7 +30,6 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
-#include <limits.h>
 
 #define SMACK_MAGIC 0x43415d53
 
@@ -67,10 +66,8 @@ int clear(void)
        int fd;
        int ret;
        const char * smack_mnt;
-       char path[PATH_MAX];
 
-       smack_mnt = smack_smackfs_path();
-       if (!smack_mnt) {
+       if (smack_mnt_dirfd < 0) {
                errno = EFAULT;
                return -1;
        }
@@ -78,8 +75,7 @@ int clear(void)
        if (is_smackfs_mounted() != 1)
                return -1;
 
-       snprintf(path, sizeof path, "%s/load2", smack_mnt);
-       fd = open(path, O_RDONLY);
+       fd = openat(smack_mnt_dirfd, "load2", O_RDONLY);
        if (fd < 0)
                return -1;