Changeset 2508


Ignore:
Timestamp:
07/01/08 01:26:46 (5 years ago)
Author:
sam
Message:
  • Fix memcpy_from_target() and memcpy_to_target() alignment issues.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • neercs/trunk/src/grab.c

    r2507 r2508  
    112112} 
    113113 
    114 /* FIXME: this function and the following have alignment issues */ 
    115 static int memcpy_from_target(pid_t pid, void* dest, long src, size_t n) 
    116 { 
    117     long *d = (long*)dest; 
    118     unsigned int i; 
    119  
    120     for(i = 0; i < n / sizeof(long); i++) 
    121     { 
    122         d[i] = ptrace(PTRACE_PEEKTEXT, pid, src + i * sizeof(long), 0); 
     114static int memcpy_from_target(pid_t pid, char* dest, long src, size_t n) 
     115{ 
     116    while(n) 
     117    { 
     118        long data; 
     119        int align = sizeof(long) - 1; 
     120        size_t todo = sizeof(long) - (src & align); 
     121 
     122        if(n < todo) 
     123            todo = n; 
     124 
     125        data = ptrace(PTRACE_PEEKTEXT, pid, src - (src & align), 0); 
    123126        if(errno) 
    124127        { 
     
    126129            return -1; 
    127130        } 
    128     } 
     131        memcpy(dest, (char *)&data + (src & align), todo); 
     132 
     133        dest += todo; 
     134        src += todo; 
     135        n -= todo; 
     136    } 
     137 
    129138    return 0; 
    130139} 
    131140 
    132 static int memcpy_into_target(pid_t pid, long dest, void* src, size_t n) 
    133 { 
    134     long *s = (long*) src; 
    135     unsigned int i; 
    136  
    137     for(i = 0; i < n / sizeof(long); i++) 
    138     { 
    139         if(ptrace(PTRACE_POKETEXT, pid, dest + i * sizeof(long), s[i]) == -1) 
     141static int memcpy_into_target(pid_t pid, long dest, char* src, size_t n) 
     142{ 
     143    while(n) 
     144    { 
     145        long data; 
     146        int align = sizeof(long) - 1; 
     147        size_t todo = sizeof(long) - (dest & align); 
     148 
     149        if(n < todo) 
     150            todo = n; 
     151        if(todo != sizeof(long)) 
     152        { 
     153            data = ptrace(PTRACE_PEEKTEXT, pid, dest - (dest & align), 0); 
     154            if(errno) 
     155            { 
     156                perror("ptrace_peektext"); 
     157                return -1; 
     158            } 
     159        } 
     160 
     161        memcpy((char *)&data + (dest & align), src, todo); 
     162        ptrace(PTRACE_POKETEXT, pid, dest - (dest & align), data); 
     163        if(errno) 
    140164        { 
    141165            perror("ptrace_poketext"); 
    142166            return -1; 
    143167        } 
    144     } 
     168 
     169        src += todo; 
     170        dest += todo; 
     171        n -= todo; 
     172    } 
     173 
    145174    return 0; 
    146175} 
     
    247276static int do_open(pid_t pid, char *path, int mode) 
    248277{ 
    249     char path_data[4096], backup_data[4096]; 
     278    char backup_data[4096]; 
    250279    struct user_regs_struct regs; 
    251     long target_data; 
    252     size_t size = (strlen(path) + sizeof(long)) & ~(sizeof(long) - 1L); 
     280    size_t size = strlen(path) + 1; 
    253281    int ret; 
    254282 
     
    259287    } 
    260288 
    261     target_data = (regs.RSP - size) & ~(sizeof(long) - 1L); 
    262  
    263289    /* Backup the data that we will use */ 
    264     if(memcpy_from_target(pid, backup_data, target_data, size) < 0) 
     290    if(memcpy_from_target(pid, backup_data, regs.RSP, size) < 0) 
    265291        return -1; 
    266292 
    267293    /* +4 (or 8) because it's truncated on a multiple of 4 (or 8) 
    268294     * and we need 1 */ 
    269     sprintf(path_data, "%s", path); 
    270     memcpy_into_target(pid, target_data, path_data, size); 
    271  
    272     ret = do_syscall(pid, SYS_open, target_data, O_RDWR, 0755); 
     295    sprintf(path, "%s", path); 
     296    memcpy_into_target(pid, regs.RSP, path, size); 
     297 
     298    ret = do_syscall(pid, SYS_open, regs.RSP, O_RDWR, 0755); 
    273299 
    274300    /* Restore the datas */ 
    275     memcpy_into_target(pid, target_data, backup_data, size); 
     301    memcpy_into_target(pid, regs.RSP, backup_data, size); 
    276302 
    277303    if(ret < 0) 
Note: See TracChangeset for help on using the changeset viewer.