Changeset 2508 for neercs


Ignore:
Timestamp:
Jul 1, 2008, 1:26:46 AM (12 years ago)
Author:
Sam Hocevar
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.