Douglas E. Engert wrote:
You were right.It could also mean that the stack was being overlayed, and moving this variabe to static means something else on the stack is being overlayed.
Two other things to try:
Compile without optimizatrion.
Use the debugger s to set a watch point on the ans_label before calling
the ka_Authenticate. Hopefully the debugger will catch the location where
it ws being modified.
The gdb found it was modified in ubik/ubikclient.c: ubik_CallIter()
This function takes 20 parameters :
afs_int32
ubik_CallIter(aproc, aclient, aflags, apos, p1, p2, p3, p4, p5, p6, p7, p8,
p9, p10, p11, p12, p13, p14, p15, p16)
In kauth/authclient.c:kawrap_ubik_Call() it is called with only 12 parameters :
477 : code = ubik_CallIter(aproc, aclient, aflags, &count, p1, p2, p3, p4,
478 : p5, p6, p7, p8);
Which is not uncommon, a wee grep showed up all sorts of numbers of paramters with wich ubik_CallIter() is called.
The real trick is now in ubik_CallIter() itself :
changing
777: code = CallIter(aproc, aclient, aflags, apos, p1, p2, p3, p4, p5, p6, p7,
p8, p9, p10, p11, p12, p13, p14, p15, p16,NEED_LOCK);
to
777 :code = CallIter(aproc, aclient, aflags, apos, NEED_LOCK, p1, p2, p3, p4, p5, p6, p7,
778: p8, p9, p10, p11, p12, p13, p14, p15, p16);
and all following seems to fix the problem.
Here the patch :
# diff ubikclient.c ubikclient_new.c
584,585c584,585
< CallIter(aproc, aclient, aflags, apos, p1, p2, p3, p4, p5, p6, p7, p8, p9,
< p10, p11, p12, p13, p14, p15, p16, needlock)
---
> CallIter(aproc, aclient, aflags, apos, needlock,p1, p2, p3, p4, p5, p6, p7, p8, p9,
> p10, p11, p12, p13, p14, p15, p16)
718,720c718,720
< CallIter(aproc, aclient, aflags, &count, p1, p2, p3, p4, p5,
< p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16,
< NO_LOCK);
---
> CallIter(aproc, aclient, aflags, &count, NO_LOCK,p1, p2, p3, p4, p5,
> p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16
> );
776,777c776,777
< return CallIter(aproc, aclient, aflags, apos, p1, p2, p3, p4, p5, p6, p7,
< p8, p9, p10, p11, p12, p13, p14, p15, p16, NEED_LOCK);
---
> return CallIter(aproc, aclient, aflags, apos, NEED_LOCK, p1, p2, p3, p4, p5,
> p6,p7,p8, p9, p10, p11, p12, p13, p14, p15, p16);
Apparently, you cannot use a variable after the "optional ones", otherwise you corrupt the stack (?).
Then there is the question :
Wouldn't it be cleaner to call the function with the exact (real) number of parameters ?
I guess it would imply some performance penalties, but would they matter?
-Christof Hanke _______________________________________________ OpenAFS-info mailing list [EMAIL PROTECTED] https://lists.openafs.org/mailman/listinfo/openafs-info