Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
L
lxc
Project
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Chen Yisong
lxc
Commits
71558435
Unverified
Commit
71558435
authored
Dec 22, 2017
by
Serge Hallyn
Committed by
GitHub
Dec 22, 2017
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #2057 from brauner/2017-12-22/bugfixes
start: simplify cgroup namespace preservation
parents
15090139
8bf3abfb
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
24 additions
and
34 deletions
+24
-34
start.c
src/lxc/start.c
+24
-34
No files found.
src/lxc/start.c
View file @
71558435
...
@@ -868,7 +868,7 @@ void lxc_abort(const char *name, struct lxc_handler *handler)
...
@@ -868,7 +868,7 @@ void lxc_abort(const char *name, struct lxc_handler *handler)
static
int
do_start
(
void
*
data
)
static
int
do_start
(
void
*
data
)
{
{
int
fd
,
ret
;
int
ret
;
struct
lxc_list
*
iterator
;
struct
lxc_list
*
iterator
;
char
path
[
PATH_MAX
];
char
path
[
PATH_MAX
];
struct
lxc_handler
*
handler
=
data
;
struct
lxc_handler
*
handler
=
data
;
...
@@ -930,14 +930,22 @@ static int do_start(void *data)
...
@@ -930,14 +930,22 @@ static int do_start(void *data)
* privilege over our namespace.
* privilege over our namespace.
*/
*/
if
(
!
lxc_list_empty
(
&
handler
->
conf
->
id_map
))
{
if
(
!
lxc_list_empty
(
&
handler
->
conf
->
id_map
))
{
if
(
lxc_switch_uid_gid
(
0
,
0
)
<
0
)
ret
=
lxc_switch_uid_gid
(
0
,
0
);
if
(
ret
<
0
)
goto
out_warn_father
;
goto
out_warn_father
;
/* Drop groups only after we switched to a valid gid in the new
/* Drop groups only after we switched to a valid gid in the new
* user namespace.
* user namespace.
*/
*/
if
(
lxc_setgroups
(
0
,
NULL
)
<
0
)
ret
=
lxc_setgroups
(
0
,
NULL
);
if
(
ret
<
0
)
goto
out_warn_father
;
goto
out_warn_father
;
if
(
!
handler
->
am_root
)
{
ret
=
prctl
(
PR_SET_DUMPABLE
,
1
,
0
,
0
,
0
);
if
(
ret
<
0
)
goto
out_warn_father
;
}
}
}
if
(
access
(
handler
->
lxcpath
,
X_OK
))
{
if
(
access
(
handler
->
lxcpath
,
X_OK
))
{
...
@@ -1006,30 +1014,12 @@ static int do_start(void *data)
...
@@ -1006,30 +1014,12 @@ static int do_start(void *data)
/* Setup the container, ip, names, utsname, ... */
/* Setup the container, ip, names, utsname, ... */
ret
=
lxc_setup
(
handler
);
ret
=
lxc_setup
(
handler
);
close
(
handler
->
data_sock
[
1
]);
close
(
handler
->
data_sock
[
1
]);
close
(
handler
->
data_sock
[
0
]);
if
(
ret
<
0
)
{
if
(
ret
<
0
)
{
ERROR
(
"Failed to setup container
\"
%s
\"
."
,
handler
->
name
);
ERROR
(
"Failed to setup container
\"
%s
\"
."
,
handler
->
name
);
close
(
handler
->
data_sock
[
0
]);
goto
out_warn_father
;
goto
out_warn_father
;
}
}
if
(
handler
->
clone_flags
&
CLONE_NEWCGROUP
)
{
fd
=
lxc_preserve_ns
(
lxc_raw_getpid
(),
"cgroup"
);
if
(
fd
<
0
)
{
ERROR
(
"%s - Failed to preserve cgroup namespace"
,
strerror
(
errno
));
close
(
handler
->
data_sock
[
0
]);
goto
out_warn_father
;
}
ret
=
lxc_abstract_unix_send_fds
(
handler
->
data_sock
[
0
],
&
fd
,
1
,
NULL
,
0
);
close
(
fd
);
if
(
ret
<
0
)
{
ERROR
(
"%s - Failed to preserve cgroup namespace"
,
strerror
(
errno
));
close
(
handler
->
data_sock
[
0
]);
goto
out_warn_father
;
}
}
close
(
handler
->
data_sock
[
0
]);
/* Set the label to change to when we exec(2) the container's init. */
/* Set the label to change to when we exec(2) the container's init. */
if
(
lsm_process_label_set
(
NULL
,
handler
->
conf
,
1
,
1
)
<
0
)
if
(
lsm_process_label_set
(
NULL
,
handler
->
conf
,
1
,
1
)
<
0
)
goto
out_warn_father
;
goto
out_warn_father
;
...
@@ -1434,7 +1424,7 @@ static int lxc_spawn(struct lxc_handler *handler)
...
@@ -1434,7 +1424,7 @@ static int lxc_spawn(struct lxc_handler *handler)
if
(
handler
->
on_clone_flags
&
ns_info
[
i
].
clone_flag
)
if
(
handler
->
on_clone_flags
&
ns_info
[
i
].
clone_flag
)
INFO
(
"Cloned %s"
,
ns_info
[
i
].
flag_name
);
INFO
(
"Cloned %s"
,
ns_info
[
i
].
flag_name
);
if
(
!
preserve_ns
(
handler
->
nsfd
,
handler
->
clone_flags
&
~
CLONE_NEWNET
,
handler
->
pid
))
{
if
(
!
preserve_ns
(
handler
->
nsfd
,
handler
->
on_clone_flags
,
handler
->
pid
))
{
ERROR
(
"Failed to preserve cloned namespaces for lxc.hook.stop"
);
ERROR
(
"Failed to preserve cloned namespaces for lxc.hook.stop"
);
goto
out_delete_net
;
goto
out_delete_net
;
}
}
...
@@ -1539,6 +1529,17 @@ static int lxc_spawn(struct lxc_handler *handler)
...
@@ -1539,6 +1529,17 @@ static int lxc_spawn(struct lxc_handler *handler)
cgroup_disconnect
();
cgroup_disconnect
();
cgroups_connected
=
false
;
cgroups_connected
=
false
;
if
(
handler
->
clone_flags
&
CLONE_NEWCGROUP
)
{
/* Now we're ready to preserve the cgroup namespace */
ret
=
lxc_preserve_ns
(
handler
->
pid
,
"cgroup"
);
if
(
ret
<
0
)
{
ERROR
(
"%s - Failed to preserve cgroup namespace"
,
strerror
(
errno
));
goto
out_delete_net
;
}
handler
->
nsfd
[
LXC_NS_CGROUP
]
=
ret
;
DEBUG
(
"Preserved cgroup namespace via fd %d"
,
ret
);
}
snprintf
(
pidstr
,
20
,
"%d"
,
handler
->
pid
);
snprintf
(
pidstr
,
20
,
"%d"
,
handler
->
pid
);
if
(
setenv
(
"LXC_PID"
,
pidstr
,
1
))
if
(
setenv
(
"LXC_PID"
,
pidstr
,
1
))
SYSERROR
(
"Failed to set environment variable: LXC_PID=%s."
,
pidstr
);
SYSERROR
(
"Failed to set environment variable: LXC_PID=%s."
,
pidstr
);
...
@@ -1577,17 +1578,6 @@ static int lxc_spawn(struct lxc_handler *handler)
...
@@ -1577,17 +1578,6 @@ static int lxc_spawn(struct lxc_handler *handler)
goto
out_delete_net
;
goto
out_delete_net
;
}
}
if
(
handler
->
clone_flags
&
CLONE_NEWCGROUP
)
{
ret
=
lxc_abstract_unix_recv_fds
(
handler
->
data_sock
[
1
],
&
handler
->
nsfd
[
LXC_NS_CGROUP
],
1
,
NULL
,
0
);
if
(
ret
<
0
)
{
ERROR
(
"%s - Failed to preserve cgroup namespace"
,
strerror
(
errno
));
goto
out_delete_net
;
}
DEBUG
(
"Preserved cgroup namespace via fd %d"
,
handler
->
nsfd
[
LXC_NS_CGROUP
]);
}
if
(
handler
->
ops
->
post_start
(
handler
,
handler
->
data
))
if
(
handler
->
ops
->
post_start
(
handler
,
handler
->
data
))
goto
out_abort
;
goto
out_abort
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment