Skip to content

Commit

Permalink
examples/ucontext-cp.c: cope with variable SIGSTKSZ
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
stefanhaRH authored and axboe committed Apr 13, 2021
1 parent d3eb6af commit 8aac320
Showing 1 changed file with 9 additions and 3 deletions.
12 changes: 9 additions & 3 deletions examples/ucontext-cp.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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);

Expand Down

0 comments on commit 8aac320

Please sign in to comment.