From 633cb8bee31b0ce075adbe8a143f88f533605552 Mon Sep 17 00:00:00 2001 From: Christian Brauner Date: Sat, 4 May 2019 13:35:51 +0200 Subject: [PATCH] compiler: add __returns_twice attribute The returns_twice attribute tells the compiler that a function may return more than one time. The compiler will ensure that all registers are dead before calling such a function and will emit a warning about the variables that may be clobbered after the second return from the function. Examples of such functions are setjmp and vfork. The longjmp-like counterpart of such function, if any, might need to be marked with the noreturn attribute. Signed-off-by: Christian Brauner --- src/lxc/compiler.h | 4 ++++ src/lxc/raw_syscalls.c | 3 ++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/lxc/compiler.h b/src/lxc/compiler.h index 65457cb31..9b0de394a 100644 --- a/src/lxc/compiler.h +++ b/src/lxc/compiler.h @@ -59,6 +59,10 @@ # define __hot __attribute__((hot)) #endif +#ifndef __returns_twice +#define __returns_twice __attribute__((returns_twice)) +#endif + #define __cgfsng_ops #endif /* __LXC_COMPILER_H */ diff --git a/src/lxc/raw_syscalls.c b/src/lxc/raw_syscalls.c index a4db30691..2e1557587 100644 --- a/src/lxc/raw_syscalls.c +++ b/src/lxc/raw_syscalls.c @@ -9,6 +9,7 @@ #include #include +#include "compiler.h" #include "config.h" #include "macro.h" #include "raw_syscalls.h" @@ -32,7 +33,7 @@ int lxc_raw_execveat(int dirfd, const char *pathname, char *const argv[], * The nice thing about this is that we get fork() behavior. That is * lxc_raw_clone() returns 0 in the child and the child pid in the parent. */ -pid_t lxc_raw_clone(unsigned long flags) +__returns_twice pid_t lxc_raw_clone(unsigned long flags) { /* * These flags don't interest at all so we don't jump through any hoops -- 2.47.2