Beispiel #1
0
int tracer_copy_in( struct tracer *t, void *data, const void *uaddr, int length )
{
    int result;
    static int fast_read_success = 0;
    static int fast_read_failure = 0;
    static int fast_read_attempts = 100;

    UPTRINT_T iuaddr = (UPTRINT_T)uaddr;

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

    if(fast_read_success>0 || fast_read_failure<fast_read_attempts) {
        result = full_pread64(t->memory_file,data,length,iuaddr);
        if(result>0) {
            fast_read_success++;
            return result;
        } else {
            fast_read_failure++;
            // fall through to slow method, print message on the last attempt.
            if(fast_read_success==0 && fast_read_failure>=fast_read_attempts) {
                debug(D_SYSCALL,"reading from /proc/X/mem failed, falling back to slow ptrace read");
            }
        }
    }

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

    return result;
}
Beispiel #2
0
int tracer_copy_in( struct tracer *t, void *data, const void *uaddr, int length )
{
	int result;
	static int has_fast_read = 1;

	UPTRINT_T iuaddr = (UPTRINT_T)uaddr;

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

	if(has_fast_read) {
		result = full_pread64(t->memory_file,data,length,iuaddr);
		if( result<=0 && errno==EINVAL ) {
			has_fast_read = 0;
			debug(D_SYSCALL,"reading from /proc/X/mem failed, falling back to slow ptrace read");
		} else {
			return result;
		}
	}

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

	return result;
}
Beispiel #3
0
static INT64_T chirp_fs_local_pread(int fd, void *buffer, INT64_T length, INT64_T offset)
{
	INT64_T result;
	result = full_pread64(fd, buffer, length, offset);
	if(result < 0 && errno == ESPIPE) {
		/* if this is a pipe, return whatever amount is available */
		result = read(fd, buffer, length);
	}
	return result;
}
Beispiel #4
0
static INT64_T chirp_fs_local_pread(int fd, void *buffer, INT64_T length, INT64_T offset)
{
	PREAMBLE("pread(%d, %p, %zu, %" PRId64 ")", fd, buffer, (size_t)length, offset);
	SETUP_FILE
	rc = full_pread64(lfd, buffer, length, offset);
	if(rc < 0 && errno == ESPIPE) {
		/* if this is a pipe, return whatever amount is available */
		rc = read(lfd, buffer, length);
	}
	PROLOGUE
}