You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
liburing/SOURCES/8aac320-examples-ucontext-c...

75 lines
2.3 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

examples/ucontext-cp.c: cope with variable SIGSTKSZ
BZ: 1980845
commit 8aac320ae8445c5434ab3be1761414a5247e5d42
Author: Stefan Hajnoczi <stefanha@redhat.com>
Date: Tue Apr 13 16:03:19 2021 +0100
examples/ucontext-cp.c: cope with variable SIGSTKSZ
The size of C arrays at file scope must be constant. The following
compiler error occurs with recent upstream glibc (2.33.9000):
CC ucontext-cp
ucontext-cp.c:31:23: error: variably modified stack_buf at file scope
31 | unsigned char stack_buf[SIGSTKSZ];
| ^~~~~~~~~
make[1]: *** [Makefile:26: ucontext-cp] Error 1
The following glibc commit changed SIGSTKSZ from a constant value to a
variable:
commit 6c57d320484988e87e446e2e60ce42816bf51d53
Author: H.J. Lu <hjl.tools@gmail.com>
Date: Mon Feb 1 11:00:38 2021 -0800
sysconf: Add _SC_MINSIGSTKSZ/_SC_SIGSTKSZ [BZ #20305]
...
+# define SIGSTKSZ sysconf (_SC_SIGSTKSZ)
Allocate the stack buffer explicitly to avoid declaring an array at file
scope.
Cc: H.J. Lu <hjl.tools@gmail.com>
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
diff --git a/examples/ucontext-cp.c b/examples/ucontext-cp.c
index 0b2a6b5..ea0c934 100644
--- a/examples/ucontext-cp.c
+++ b/examples/ucontext-cp.c
@@ -28,7 +28,7 @@
typedef struct {
struct io_uring *ring;
- unsigned char stack_buf[SIGSTKSZ];
+ unsigned char *stack_buf;
ucontext_t ctx_main, ctx_fnew;
} async_context;
@@ -115,8 +115,13 @@ static int setup_context(async_context *pctx, struct io_uring *ring)
perror("getcontext");
return -1;
}
- pctx->ctx_fnew.uc_stack.ss_sp = &pctx->stack_buf;
- pctx->ctx_fnew.uc_stack.ss_size = sizeof(pctx->stack_buf);
+ pctx->stack_buf = malloc(SIGSTKSZ);
+ if (!pctx->stack_buf) {
+ perror("malloc");
+ return -1;
+ }
+ pctx->ctx_fnew.uc_stack.ss_sp = pctx->stack_buf;
+ pctx->ctx_fnew.uc_stack.ss_size = SIGSTKSZ;
pctx->ctx_fnew.uc_link = &pctx->ctx_main;
return 0;
@@ -174,6 +179,7 @@ static void copy_file_wrapper(arguments_bundle *pbundle)
free(iov.iov_base);
close(pbundle->infd);
close(pbundle->outfd);
+ free(pbundle->pctx->stack_buf);
free(pbundle->pctx);
free(pbundle);