[OpenAFS] Re: "unable to authenticate to AFS" error- linux distribution, specific?

Joseph Kiniry kiniry@acm.org
Mon, 22 Nov 2004 18:44:10 +0000


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 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.
>>
> You were right.
> 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