Skip to content

Commit

Permalink
Fix undefined behavior.
Browse files Browse the repository at this point in the history
Do not accept setjmp return value as variable.

Signed-off-by: Kazuki Hasegawa <[email protected]>
  • Loading branch information
nanasi880 authored and cyphar committed Apr 12, 2023
1 parent e42c219 commit 6053aea
Showing 1 changed file with 9 additions and 3 deletions.
12 changes: 9 additions & 3 deletions libcontainer/nsenter/nsexec.c
Original file line number Diff line number Diff line change
Expand Up @@ -980,8 +980,7 @@ void nsexec(void)
* -- Aleksa "what has my life come to?" Sarai
*/

current_stage = setjmp(env);
switch (current_stage) {
switch (setjmp(env)) {
/*
* Stage 0: We're in the parent. Our job is just to create a new child
* (stage 1: STAGE_CHILD) process and write its uid_map and
Expand All @@ -995,6 +994,7 @@ void nsexec(void)
bool stage1_complete, stage2_complete;

/* For debugging. */
current_stage = STAGE_PARENT;
prctl(PR_SET_NAME, (unsigned long)"runc:[0:PARENT]", 0, 0, 0);
write_log(DEBUG, "~> nsexec stage-0");

Expand Down Expand Up @@ -1152,6 +1152,9 @@ void nsexec(void)
pid_t stage2_pid = -1;
enum sync_t s;

/* For debugging. */
current_stage = STAGE_CHILD;

/* We're in a child and thus need to tell the parent if we die. */
syncfd = sync_child_pipe[0];
if (close(sync_child_pipe[1]) < 0)
Expand Down Expand Up @@ -1323,6 +1326,9 @@ void nsexec(void)
*/
enum sync_t s;

/* For debugging. */
current_stage = STAGE_INIT;

/* We're in a child and thus need to tell the parent if we die. */
syncfd = sync_grandchild_pipe[0];
if (close(sync_grandchild_pipe[1]) < 0)
Expand Down Expand Up @@ -1377,7 +1383,7 @@ void nsexec(void)
}
break;
default:
bail("unknown stage '%d' for jump value", current_stage);
bail("unexpected jump value");
}

/* Should never be reached. */
Expand Down

0 comments on commit 6053aea

Please sign in to comment.