https://bugzilla.samba.org/show_bug.cgi?id=8308

--- Comment #4 from John <[email protected]> 2014-04-09 03:05:08 UTC ---

from rsync.h:
    union file_extras {
        int32 num;
        uint32 unum;
    };
    #define REQ_EXTRA(f,ndx) ((union file_extras*)(f) - (ndx))
    #define F_DEPTH(f) REQ_EXTRA(f, 1)->num


from generator.c:
    struct file_struct *file = cur_flist->sorted[j];
    rprintf(FINFO, "Sizeof pointer to file struct = [%d]\n", sizeof (file) );
    f_name(file, fbuf);
    if (!(file->flags & FLAG_CONTENT_DIR)) {
    change_local_filter_dir(fbuf, strlen(fbuf), F_DEPTH(file));

When the program runs we see this from the code i added to generator.c:
    Sizeof pointer to file struct =[8]

So... my C is pretty rusty... and it is difficult to make any sense of this
code, but this looks like madness to me... you're using crazy macros to do
32bit pointer arithmetic on a 64-bit pointer.

ie when you run F_DEPTH(file), you're subtracting ndx, in this case 1, from the
file pointer, but you're doing so with a macro that casts the the pointer to
union file_extras* which is a 32bit pointer, not a 64bit one. so you're going
to end up subtracting 4 bytes from the pointer where you needed to subtract 8.

Madness!

-- 
Configure bugmail: https://bugzilla.samba.org/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the QA contact for the bug.
-- 
Please use reply-all for most replies to avoid omitting the mailing list.
To unsubscribe or change options: https://lists.samba.org/mailman/listinfo/rsync
Before posting, read: http://www.catb.org/~esr/faqs/smart-questions.html

Reply via email to