chiark / gitweb /
[PATCH] udev selinux fix
[elogind.git] / udev_add.c
index 66264f06e0771b3b85e0a05d6a7d8540719db504..e5bd042a5c41bec14cb28b2f76ba03e83e998fff 100644 (file)
@@ -70,16 +70,12 @@ int udev_make_node(struct udevice *udev, const char *file, dev_t devt, mode_t mo
 
 create:
        switch (udev->type) {
-       case 'b':
+       case BLOCK:
                mode |= S_IFBLK;
                break;
-       case 'c':
-       case 'u':
+       case CLASS:
                mode |= S_IFCHR;
                break;
-       case 'p':
-               mode |= S_IFIFO;
-               break;
        default:
                dbg("unknown node type %c\n", udev->type);
                return -EINVAL;
@@ -87,6 +83,7 @@ create:
 
        selinux_setfscreatecon(file, udev->kernel_name, mode);
        retval = mknod(file, mode, devt);
+       selinux_resetfscreatecon();
        if (retval != 0) {
                dbg("mknod(%s, %#o, %u, %u) failed with error '%s'",
                    file, mode, major(devt), minor(devt), strerror(errno));
@@ -200,6 +197,7 @@ static int create_node(struct udevice *udev, struct sysfs_class_device *class_de
 
        /* create symlink(s) if requested */
        foreach_strpart(udev->symlink, " ", pos, len) {
+               int retval;
                char linkname[NAME_SIZE];
                char linktarget[NAME_SIZE];
 
@@ -231,9 +229,11 @@ static int create_node(struct udevice *udev, struct sysfs_class_device *class_de
 
                dbg("symlink(%s, %s)", linktarget, filename);
                if (!udev->test_run) {
-                       selinux_setfscreatecon(filename, udev->kernel_name, S_IFLNK);
                        unlink(filename);
-                       if (symlink(linktarget, filename) != 0)
+                       selinux_setfscreatecon(filename, udev->kernel_name, S_IFLNK);
+                       retval = symlink(linktarget, filename);
+                       selinux_resetfscreatecon();
+                       if (retval != 0)
                                dbg("symlink(%s, %s) failed with error '%s'",
                                    linktarget, filename, strerror(errno));
                }
@@ -277,7 +277,7 @@ int udev_add_device(struct udevice *udev, struct sysfs_class_device *class_dev)
        char *pos;
        int retval = 0;
 
-       if (udev->type == 'b' || udev->type == 'c') {
+       if (udev->type == BLOCK || udev->type == CLASS) {
                udev->devt = get_devt(class_dev);
                if (!udev->devt) {
                        dbg("no dev-file found, do nothing");
@@ -292,7 +292,7 @@ int udev_add_device(struct udevice *udev, struct sysfs_class_device *class_dev)
 
        selinux_init();
 
-       if (udev->type == 'b' || udev->type == 'c') {
+       if (udev->type == BLOCK || udev->type == CLASS) {
                retval = create_node(udev, class_dev);
                if (retval != 0)
                        goto exit;
@@ -305,7 +305,7 @@ int udev_add_device(struct udevice *udev, struct sysfs_class_device *class_dev)
                snprintf(udev->devname, NAME_SIZE, "%s/%s", udev_root, udev->name);
                udev->devname[NAME_SIZE-1] = '\0';
 
-       } else if (udev->type == 'n') {
+       } else if (udev->type == NET) {
                /* look if we want to change the name of the netif */
                if (strcmp(udev->name, udev->kernel_name) != 0) {
                        retval = rename_net_if(udev);
@@ -330,7 +330,7 @@ int udev_add_device(struct udevice *udev, struct sysfs_class_device *class_dev)
        }
 
 exit:
-       selinux_restore();
+       selinux_exit();
 
        return retval;
 }