]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
libmount: make errno usable after mnt_context_set_target_ns()
authorKarel Zak <kzak@redhat.com>
Mon, 11 Jun 2018 14:06:17 +0000 (16:06 +0200)
committerKarel Zak <kzak@redhat.com>
Mon, 11 Jun 2018 14:06:17 +0000 (16:06 +0200)
Signed-off-by: Karel Zak <kzak@redhat.com>
libmount/src/context.c
sys-utils/mount.c
sys-utils/umount.c

index da315a1d26d1025ec66ebbe4e1c60a8a310dc44f..fdaa233c17fa12540f819acbc8d017eb6a718003 100644 (file)
@@ -2617,9 +2617,9 @@ static void close_ns(struct libmnt_ns *ns)
  */
 int mnt_context_set_target_ns(struct libmnt_context *cxt, const char *path)
 {
-       int rc = 0;
-
+       int errsv = 0;
        int tmp;
+
        if (!cxt)
                return -EINVAL;
 
@@ -2632,6 +2632,8 @@ int mnt_context_set_target_ns(struct libmnt_context *cxt, const char *path)
                return 0;
        }
 
+       errno = 0;
+
        /* open original namespace */
        if (cxt->ns_orig.fd == -1) {
                cxt->ns_orig.fd = open("/proc/self/ns/mnt", O_RDONLY | O_CLOEXEC);
@@ -2649,7 +2651,7 @@ int mnt_context_set_target_ns(struct libmnt_context *cxt, const char *path)
        DBG(CXT, ul_debugobj(cxt, "Trying whether namespace is valid"));
        if (setns(tmp, CLONE_NEWNS)
            || setns(cxt->ns_orig.fd, CLONE_NEWNS)) {
-               rc = -errno;
+               errsv = errno;
                DBG(CXT, ul_debugobj(cxt, "setns(2) failed [errno=%d %m]", errno));
                goto err;
        }
@@ -2662,7 +2664,8 @@ int mnt_context_set_target_ns(struct libmnt_context *cxt, const char *path)
        return 0;
 err:
        close(tmp);
-       return rc;
+       errno = errsv;
+       return -errno;
 }
 
 /**
index a4523d731d3fbd3833ad499cf5e7dbf454581dc9..3811379b4cb02dd3ab79dbfcfcdc3c305cb96956 100644 (file)
@@ -692,14 +692,9 @@ int main(int argc, char **argv)
                        append_option(cxt, "rbind");
                        break;
                case 'N':
-               {
-                       int tmp;
-                       if ((tmp = mnt_context_set_target_ns(cxt, optarg))) {
-                               errno = -tmp;
+                       if (mnt_context_set_target_ns(cxt, optarg))
                                err(MNT_EX_SYSERR, _("failed to set target namespace"));
-                       }
                        break;
-               }
                case MOUNT_OPT_SHARED:
                        append_option(cxt, "shared");
                        propa = 1;
index 3fc1ae647c575a25a32146a71bf4832edd3e08dd..629c65df8e10c8cccaa777924213d43d06ad606a 100644 (file)
@@ -511,13 +511,9 @@ int main(int argc, char **argv)
                        print_version();
                        break;
                case 'N':
-               {
-                       int tmp;
-                       if ((tmp = mnt_context_set_target_ns(cxt, optarg))) {
-                               errno = -tmp;
+                       if (mnt_context_set_target_ns(cxt, optarg))
                                err(MNT_EX_SYSERR, _("failed to set target namespace"));
-                       }
-                       break;
+                       break;
                }
                default:
                        errtryhelp(MNT_EX_USAGE);