It may still be a problem with the stack, just moved to a different location.
That ptch did not fix the problem that ubik_CallIter is being called with
the wrong number of parameters. So can you try this instead? I believe
it changes all the calls to use the correct number of parameters i.e. 19.



Joseph Kiniry wrote:

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


_______________________________________________
OpenAFS-info mailing list
[EMAIL PROTECTED]
https://lists.openafs.org/mailman/listinfo/openafs-info




--

 Douglas E. Engert  <[EMAIL PROTECTED]>
 Argonne National Laboratory
 9700 South Cass Avenue
 Argonne, Illinois  60439
 (630) 252-5444
--- ./kauth/,admin_tools.c      Wed Aug 25 02:03:39 2004
+++ ./kauth/admin_tools.c       Mon Nov 22 13:03:47 2004
@@ -514,6 +514,7 @@
        code =
            ubik_CallIter(KAM_LockStatus, conn, UPUBIKONLY, &count, name,
                          instance, &tempwhen, /*spares */ 0, 0, 0,
+                         0, 0, 0, 0, 0, 0, 0, 0,
                          0);
        if (code) {
            if (seriouserror(code))
--- ./kauth/,authclient.c       Wed Aug 25 02:09:38 2004
+++ ./kauth/authclient.c        Mon Nov 22 13:05:54 2004
@@ -476,7 +476,7 @@
            lcode = code;
            code =
                ubik_CallIter(aproc, aclient, aflags, &count, p1, p2, p3, p4,
-                             p5, p6, p7, p8);
+                             p5, p6, p7, p8, 0, 0, 0, 0, 0, 0, 0);
        } while ((code == UNOQUORUM) || (code == UNOTSYNC)
                 || (code == KALOCKED) || (code == -1));
 
--- ./libadmin/kas/,afs_kasAdmin.c      Sun Dec  7 16:49:30 2003
+++ ./libadmin/kas/afs_kasAdmin.c       Mon Nov 22 13:08:38 2004
@@ -718,6 +718,7 @@
        tst =
            ubik_CallIter(KAM_LockStatus, kaserver->servers, UPUBIKONLY,
                          &count, who->principal, who->instance, &locked, 0,
+                         0, 0, 0, 0, 0, 0, 0, 0,
                          0, 0, 0);
        if (tst == 0) {
            if (locked) {

Reply via email to