Hi all,
After applying Christof's suggested patches OpenAFS 1.3.74 builds for me, and klog works, but all attempts at examining my cell's root volume (e.g., fs examine /afs/) result in hangs, segmentation faults, or other bizarre behavior.
Joe
On 19 Nov, 2004, at 11:08, Christof Hanke wrote:
Douglas E. Engert wrote:
It could also mean that the stack was being overlayed, and moving thisYou were right.
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