Example #1
0
int tracer_copy_out( struct tracer *t, const void *data, const void *uaddr, int length )
{
    int result;
    static int has_fast_write=1;
    UPTRINT_T iuaddr = (UPTRINT_T)uaddr;

    if(length==0) return 0;

#if !defined(CCTOOLS_CPU_I386)
    if(!tracer_is_64bit(t)) iuaddr &= 0xffffffff;
#endif

    if(has_fast_write) {
        result = full_pwrite64(t->memory_file,data,length,iuaddr);
        if( result!=length ) {
            has_fast_write = 0;
            debug(D_SYSCALL,"writing to /proc/X/mem failed, falling back to slow ptrace write");
        } else {
            return result;
        }
    }

    result = tracer_copy_out_slow(t,data,(void*)iuaddr,length);

    return result;
}
Example #2
0
ssize_t tracer_copy_out( struct tracer *t, const void *data, const void *uaddr, size_t length, int flags )
{
	if(length==0) return 0;

#if !defined(CCTOOLS_CPU_I386)
	if(!tracer_is_64bit(t)) {
		uaddr = VOID_MATH(uaddr, & 0xffffffff);
	}
#endif

	ssize_t rc = copy_out_fast(t,data,uaddr,length,flags);
	if (rc == -1 && errno == ENOSYS && !(flags & TRACER_O_FAST))
		rc = tracer_copy_out_slow(t,data,uaddr,length,flags);
	assert(!(flags & TRACER_O_ATOMIC) || (rc == -1 || (size_t)rc == length));
	return rc;
}