I noticed particularly ugly ifdef forest in sys_mmap64 and decided
to simplify it (see the commit below).

While looking at simplified version, I noticed that we seem to use
tcp->u_arg[i] while we have to use u_arg[i].

It definitely looks like a bug to me.

However, I failed to make test program which invokes mmap64
(need to try on x86-64), thus I hesitated to fix the bug.
I only added a comment about it.

Dmitry, can you take a look? Maybe I'm confused...
-- 
vda

commit 4286e4bfc127faa3d0443d1d876b955ce7449ab1
Author: Denys Vlasenko <[email protected]>
Date:   Fri Aug 19 16:11:07 2011 +0200

    Untangle ifdef forest in sys_mmap64. No code changes
    
    After careful analysis, it looks like !LINUX and ALPHA
    pass all seven parameters in registers; and in all other cases
    parameters are on stack (pointed to by tcp->u_arg[0]).
    In light of this, reorganize ifdefs, making them simpler,
    without changing any logic.
    After this, it's apparent we use tcp->u_arg[4,5,6] and possibly
    [7] without checking that it's valid to do so.
    So far, just add a comment about this.
    
    * mem.c (sys_mmap64): Rewrite ifdefs in a much simpler way.
    Add comments about apparent bugs.
    
    Signed-off-by: Denys Vlasenko <[email protected]>

diff --git a/mem.c b/mem.c
index f0ccfc7..de9b6bb 100644
--- a/mem.c
+++ b/mem.c
@@ -334,25 +334,15 @@ sys_mmap(struct tcb *tcp)
 int
 sys_mmap64(struct tcb *tcp)
 {
-#ifdef linux
-#ifdef ALPHA
-       long *u_arg = tcp->u_arg;
-#else /* !ALPHA */
-       long u_arg[7];
-#endif /* !ALPHA */
-#else /* !linux */
-       long *u_arg = tcp->u_arg;
-#endif /* !linux */
-
        if (entering(tcp)) {
-#ifdef linux
-#ifndef ALPHA
+#if !defined(LINUX) || defined(ALPHA)
+               long *u_arg = tcp->u_arg;
+#else
+               long u_arg[7];
                if (umoven(tcp, tcp->u_arg[0], sizeof u_arg,
                                (char *) u_arg) == -1)
                        return 0;
-#endif /* ALPHA */
-#endif /* linux */
-
+#endif
                /* addr */
                tprintf("%#lx, ", u_arg[0]);
                /* len */
@@ -369,13 +359,16 @@ sys_mmap64(struct tcb *tcp)
 #endif
                /* fd */
                tprintf(", ");
+       /* BUG?! should be u_arg[4] (without tcp->)? */
                printfd(tcp, tcp->u_arg[4]);
                /* offset */
+       /* BUG?! on non-ALPHA linux, offset will be not in tcp->u_arg,
+        * but in local u_arg, but printllval prints tcp->u_arg! */
                printllval(tcp, ", %#llx", 5);
        }
        return RVAL_HEX;
 }
-#endif
+#endif /* _LFS64_LARGEFILE || HAVE_LONG_LONG_OFF_T */
 
 
 int


------------------------------------------------------------------------------
Get a FREE DOWNLOAD! and learn more about uberSVN rich system, 
user administration capabilities and model configuration. Take 
the hassle out of deploying and managing Subversion and the 
tools developers use with it. http://p.sf.net/sfu/wandisco-d2d-2
_______________________________________________
Strace-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/strace-devel

Reply via email to