Skip to content

Commit

Permalink
merge #3790 into main
Browse files Browse the repository at this point in the history
Kazuki Hasegawa (1):
  Fix undefined behavior. Do not accept setjmp return value as variable.

LGTMs: AkihiroSuda cyphar
Closes #3790
  • Loading branch information
cyphar committed Apr 12, 2023
2 parents e42c219 + 6053aea commit 1198389
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 1198389

Please sign in to comment.