Hello,
tried have a look at this crash.
The hkl-5.0.0.2449/Documentation/figures/.libs/sirius executable makes
use of makecontext/swapcontext to execute function trajectory_gen_generator__.
But it looks like the argument given to makecontext got truncated to 32 bits.
So I looked for HAVE_POINTER_SAFE_MAKECONTEXT that is currently defined as 0.
hkl-5.0.0.2449/hkl/ccan/ccan_config.h
That file looks like generated by configurator executable.
hkl-5.0.0.2449/hkl/ccan/configurator.c
./configurator gcc > ccan_config.h.tmp && mv ccan_config.h.tmp
ccan_config.h
Extracted the test for HAVE_POINTER_SAFE_MAKECONTEXT into test.c.
But unfortunately that one is also crashing and therefore configurator defines
to 0.
[Sa Aug 4 02:11:49 2018] configurator.ou[17970]: segfault at 55c8595ccff8 ip
00007f8b36e50fc0 sp 000055c8595cd000 error 7 in ld-2.27.so[7f8b36e42000+1e000]
[Sa Aug 4 02:12:27 2018] sirius[20492]: segfault at 38093728 ip
00005649371a701f sp 0000564938092f40 error 4 in sirius[56493717c000+2c000]
$ gcc -g -O0 test.c -o test
$ gdb -q --args ./test
Reading symbols from ./test...done.
(gdb) run
Starting program: /home/benutzer/hkl/try1/test
Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7fe4fc0 in _dl_name_match_p (name=0x555555554421 "libc.so.6",
map=map@entry=0x7ffff7ffe170) at dl-misc.c:283
283 dl-misc.c: Datei oder Verzeichnis nicht gefunden.
(gdb) bt
#0 0x00007ffff7fe4fc0 in _dl_name_match_p (name=0x555555554421 "libc.so.6",
map=map@entry=0x7ffff7ffe170) at dl-misc.c:283
#1 0x00007ffff7fde64e in do_lookup_x
(undef_name=undef_name@entry=0x555555554442 "setcontext",
new_hash=new_hash@entry=3641973206, old_hash=old_hash@entry=0x555555558140
<stack+160>, ref=0x555555554390,
result=result@entry=0x555555558150 <stack+176>, scope=<optimized out>,
i=<optimized out>, version=0x7ffff7fbe560, flags=1, skip=<optimized out>,
type_class=1, undef_map=0x7ffff7ffe170) at dl-lookup.c:541
#2 0x00007ffff7fdf217 in _dl_lookup_symbol_x (undef_name=0x555555554442
"setcontext", undef_map=0x7ffff7ffe170, ref=ref@entry=0x5555555581e8
<stack+328>, symbol_scope=0x7ffff7ffe4c8, version=0x7ffff7fbe560,
type_class=type_class@entry=1, flags=1, skip_map=<optimized out>) at
dl-lookup.c:813
#3 0x00007ffff7fe38c3 in _dl_fixup (l=<optimized out>, reloc_arg=<optimized
out>) at ../elf/dl-runtime.c:112
#4 0x00007ffff7fea3c3 in _dl_runtime_resolve_fxsave () at
../sysdeps/x86_64/dl-trampoline.h:125
#5 0x00005555555551b5 in fn (p=0x555555558080 <worked>, q=0xffffaaaaaaaa7f7f)
at test.c:11
#6 0x00007ffff7e4c600 in ?? () from /lib/x86_64-linux-gnu/libc.so.6
#7 0x0000000000000000 in ?? ()
(gdb) list test.c:1,+23
1 #include <stddef.h>
2 #include <ucontext.h>
3 static int worked = 0;
4 static char stack[1024];
5 static ucontext_t a, b;
6 static void fn(void *p, void *q) {
7 void *cp = &worked;
8 void *cq = (void *)(~((ptrdiff_t)cp));
9 if ((p == cp) && (q == cq))
10 worked = 1;
11 setcontext(&b);
12 }
13 int main(void) {
14 void *ap = &worked;
15 void *aq = (void *)(~((ptrdiff_t)ap));
16 getcontext(&a);
17 a.uc_stack.ss_sp = stack;
18 a.uc_stack.ss_size = sizeof(stack);
19 makecontext(&a, (void (*)(void))fn, 2, ap, aq);
20 swapcontext(&b, &a);
21 return worked ? 0 : 1;
22 }
23
This test is crashing also at a stretch amd64 VM, but is
working in a jessie amd64 VM.
By using swapcontext instead of setcontext (like in attached
patch) the test succeeds, HAVE_POINTER_SAFE_MAKECONTEXT get defined
to 1, and the package could be built successfully, at least in my
buster amd64 VM.
Kind regards,
Bernhard
export LD_LIBRARY_PATH=/home/benutzer/hkl/try1/hkl-5.0.0.2449/hkl/.libs
benutzer@debian:~/hkl/try1/hkl-5.0.0.2449/Documentation/figures$ gdb --q --args
.libs/sirius
directory /home/benutzer/hkl/try1/hkl-5.0.0.2449/hkl
directory /home/benutzer/hkl/try1/hkl-5.0.0.2449/hkl/api2
directory /home/benutzer/hkl/try1/hkl-5.0.0.2449/hkl/ccan/coroutine
directory /home/benutzer/hkl/try1/hkl-5.0.0.2449/hkl/ccan/generator
set height 0
set width 0
set pagination off
b main
run
b coroutine.c:226
record
cont
(gdb) bt
#0 0x0000555555592c97 in coroutine_init_ (cs=cs@entry=0x5555555c5fd0,
fn=fn@entry=0x555555594000 <trajectory_gen_generator__>,
arg=arg@entry=0x5555555c6730, stack=stack@entry=0x5555555c5fb8) at
coroutine/coroutine.c:210
#1 0x0000555555592d93 in generator_new_ (fn=0x555555594000
<trajectory_gen_generator__>, retsize=<optimized out>) at
generator/generator.c:41
#2 0x0000555555594585 in trajectory_gen (tconfig=...) at hkl2.c:246
#3 0x0000555555594639 in Trajectory_solve (tconfig=..., gconfig=...,
sconfig=..., move=1) at hkl2.c:288
#4 0x00005555555697cc in main () at sirius.c:161
(gdb) list coroutine.c:193,+20
193 #if HAVE_UCONTEXT
194 void coroutine_init_(struct coroutine_state *cs,
195 void (*fn)(void *), void *arg,
196 struct coroutine_stack *stack)
197 {
198 getcontext (&cs->uc);
199
200 coroutine_uc_stack(&cs->uc.uc_stack, stack);
201
202 if (HAVE_POINTER_SAFE_MAKECONTEXT) {
203 makecontext(&cs->uc, (void *)fn, 1, arg);
204 } else {
205 ptrdiff_t si = ptr2int(arg);
206 ptrdiff_t mask = (1UL << (sizeof(int) * 8)) - 1;
207 int lo = si & mask;
208 int hi = si >> (sizeof(int) * 8);
209
210 makecontext(&cs->uc, (void *)fn, 2, lo, hi);
211 }
212
213 }
(gdb) print fn
$1 = (void (*)(void *)) 0x555555594000 <trajectory_gen_generator__>
(gdb) print/x arg
$3 = 0x5555555c6730
(gdb) print/x hi
$4 = 0x5555
(gdb) print/x lo
$5 = 0x555c6730
(gdb) bt
#0 0x0000555555592cf0 in coroutine_switch (from=from@entry=0x5555555c6378,
to=to@entry=0x5555555c5fd0) at coroutine/coroutine.c:226
#1 0x000055555559478e in generator_next_ (ret_=0x5555555c6730) at
../../hkl/ccan/generator/generator.h:191
#2 0x000055555559478e in Trajectory_solve (tconfig=..., gconfig=...,
sconfig=..., move=1) at hkl2.c:298
#3 0x00005555555697cc in main () at sirius.c:161
(gdb) list coroutine.c:220,+8
220
221 void coroutine_switch(struct coroutine_state *from,
222 const struct coroutine_state *to)
223 {
224 int rc;
225
226 rc = swapcontext(&from->uc, &to->uc);
227 assert(rc == 0);
228 }
Program received signal SIGSEGV, Segmentation fault.
trajectory_gen_generator__ (ret=0x555c6730) at hkl2.c:246
246 generator_def(trajectory_gen, struct Engine, struct Trajectory, tconfig)
(gdb) bt full
#0 0x000055555559401f in generator_argp_ (ret=0x555c6730) at
../../hkl/ccan/generator/generator.h:44
gen = 0x555c5fd0
args = <optimized out>
#1 0x000055555559401f in trajectory_gen_generator__ (ret=0x555c6730) at
hkl2.c:246
gen = 0x555c5fd0
args = <optimized out>
#2 0x00007ffff7268600 in __start_context () at /lib/x86_64-linux-gnu/libc.so.6
#3 0x0000000000000000 in ()
(gdb) list hkl2.c:246
246 generator_def(trajectory_gen, struct Engine, struct Trajectory, tconfig)
247 {
(gdb) list generator.h:145
145 #define generator_def(name_, rtype_, ...) \
146 generator_def_(name_, rtype_, , __VA_ARGS__)
(gdb) list generator.h:119
119 #define generator_def_(name_, rtype_, storage_, ...)
\
...
122 static void name_##_generator__(void *ret)
\
123 {
\
124 struct generator_ *gen;
\
125 UNNEEDED generator_argstruct_(__VA_ARGS__) *args;
\
126 gen = generator_state_(ret);
\
127 args = generator_argp_(ret);
\
128 name_##_generator_(ret
generator_args_unpack_(__VA_ARGS__)); \
129 gen->complete = true;
\
130 coroutine_jump(&gen->caller);
\
131 assert(0);
\
132 }
\
...
Description: make-test-for-pointer-safe-makecontext-succeed
Bug-Debian: https://bugs.debian.org/889878
Forwarded: no
Last-Update: 2018-08-03
--- hkl-5.0.0.2449.orig/hkl/ccan/configurator.c
+++ hkl-5.0.0.2449/hkl/ccan/configurator.c
@@ -382,7 +382,7 @@ static struct test tests[] = {
" void *cq = (void *)(~((ptrdiff_t)cp));\n"
" if ((p == cp) && (q == cq))\n"
" worked = 1;\n"
- " setcontext(&b);\n"
+ " swapcontext(&a, &b);\n"
"}\n"
"int main(void) {\n"
" void *ap = &worked;\n"