diff options
-rw-r--r-- | gdb/ChangeLog | 6 | ||||
-rw-r--r-- | gdb/remote-fileio.c | 55 |
2 files changed, 36 insertions, 25 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index ef7d2b9..f19a243 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2006-07-18 Nathan Sidwell <nathan@codesourcery.com> + + * remote-fileio.c (remote_fileio_func_rename): Reorder to process + input buffer before reading memory. + (remote_fileio_func_stat): Likewise. + 2006-07-18 Daniel Jacobowitz <dan@codesourcery.com> * blockframe.c (find_pc_partial_function): Use the minimal symbol diff --git a/gdb/remote-fileio.c b/gdb/remote-fileio.c index 6089926..96c4d95 100644 --- a/gdb/remote-fileio.c +++ b/gdb/remote-fileio.c @@ -929,36 +929,39 @@ remote_fileio_func_lseek (char *buf) static void remote_fileio_func_rename (char *buf) { - CORE_ADDR ptrval; - int length, retlength; + CORE_ADDR old_ptr, new_ptr; + int old_len, new_len, retlength; char *oldpath, *newpath; int ret, of, nf; struct stat ost, nst; /* 1. Parameter: Ptr to oldpath / length incl. trailing zero */ - if (remote_fileio_extract_ptr_w_len (&buf, &ptrval, &length)) + if (remote_fileio_extract_ptr_w_len (&buf, &old_ptr, &old_len)) { remote_fileio_ioerror (); return; } - /* Request oldpath using 'm' packet */ - oldpath = alloca (length); - retlength = remote_read_bytes (ptrval, (gdb_byte *) oldpath, length); - if (retlength != length) + + /* 2. Parameter: Ptr to newpath / length incl. trailing zero */ + if (remote_fileio_extract_ptr_w_len (&buf, &new_ptr, &new_len)) { remote_fileio_ioerror (); return; } - /* 2. Parameter: Ptr to newpath / length incl. trailing zero */ - if (remote_fileio_extract_ptr_w_len (&buf, &ptrval, &length)) + + /* Request oldpath using 'm' packet */ + oldpath = alloca (old_len); + retlength = remote_read_bytes (old_ptr, (gdb_byte *) oldpath, old_len); + if (retlength != old_len) { remote_fileio_ioerror (); return; } + /* Request newpath using 'm' packet */ - newpath = alloca (length); - retlength = remote_read_bytes (ptrval, (gdb_byte *) newpath, length); - if (retlength != length) + newpath = alloca (new_len); + retlength = remote_read_bytes (new_ptr, (gdb_byte *) newpath, new_len); + if (retlength != new_len) { remote_fileio_ioerror (); return; @@ -1061,35 +1064,36 @@ remote_fileio_func_unlink (char *buf) static void remote_fileio_func_stat (char *buf) { - CORE_ADDR ptrval; - int ret, length, retlength; + CORE_ADDR statptr, nameptr; + int ret, namelength, retlength; char *pathname; LONGEST lnum; struct stat st; struct fio_stat fst; /* 1. Parameter: Ptr to pathname / length incl. trailing zero */ - if (remote_fileio_extract_ptr_w_len (&buf, &ptrval, &length)) + if (remote_fileio_extract_ptr_w_len (&buf, &nameptr, &namelength)) { remote_fileio_ioerror (); return; } - /* Request pathname using 'm' packet */ - pathname = alloca (length); - retlength = remote_read_bytes (ptrval, (gdb_byte *) pathname, length); - if (retlength != length) + + /* 2. Parameter: Ptr to struct stat */ + if (remote_fileio_extract_long (&buf, &lnum)) { remote_fileio_ioerror (); return; } - - /* 2. Parameter: Ptr to struct stat */ - if (remote_fileio_extract_long (&buf, &lnum)) + statptr = (CORE_ADDR) lnum; + + /* Request pathname using 'm' packet */ + pathname = alloca (namelength); + retlength = remote_read_bytes (nameptr, (gdb_byte *) pathname, namelength); + if (retlength != namelength) { remote_fileio_ioerror (); return; } - ptrval = (CORE_ADDR) lnum; remote_fio_no_longjmp = 1; ret = stat (pathname, &st); @@ -1105,12 +1109,13 @@ remote_fileio_func_stat (char *buf) remote_fileio_reply (-1, FILEIO_EACCES); return; } - if (ptrval) + if (statptr) { remote_fileio_to_fio_stat (&st, &fst); remote_fileio_to_fio_uint (0, fst.fst_dev); - retlength = remote_fileio_write_bytes (ptrval, (gdb_byte *) &fst, sizeof fst); + retlength = remote_fileio_write_bytes (statptr, + (gdb_byte *) &fst, sizeof fst); if (retlength != sizeof fst) { remote_fileio_return_errno (-1); |