diff options
author | Christopher Faylor <me@cgf.cx> | 2005-07-03 02:40:30 +0000 |
---|---|---|
committer | Christopher Faylor <me@cgf.cx> | 2005-07-03 02:40:30 +0000 |
commit | 893ac8e03c21d246bbfc8d575a227d8c65cfae76 (patch) | |
tree | 4cee09d3d2a99f1eba1deeecb2c4e1b5710d1efc /winsup/cygwin/syscalls.cc | |
parent | 766bda71333f106a6ec5279477cd5bdf25672e14 (diff) | |
download | cygnal-893ac8e03c21d246bbfc8d575a227d8c65cfae76.tar.gz cygnal-893ac8e03c21d246bbfc8d575a227d8c65cfae76.tar.bz2 cygnal-893ac8e03c21d246bbfc8d575a227d8c65cfae76.zip |
Replace valid memory checks with new myfault class "exception handling", almost
everywhere. Leave some thread.cc stuff alone for now.
* cygtls.h: Kludge some definitions to avoid including a problematic windows
header.
(_cygtls::_myfault): New entry.
(_cygtls::_myfault_errno): Ditto.
(_cygtls::fault_guarded): New function.
(_cygtls::setup_fault): Ditto.
(_cygtls::return_from_fault): Ditto.
(_cygtls::clear_fault): Ditto.
(myfault): New class.
* exceptions.cc (handle_exceptions): Handle case of guarded fault in system
routine.
* gendef: Add another entry point for setjmp that the compiler doesn't know
about and won't complain about.
* gentls_offsets: Just include windows.h rather than kludging a HANDLE def.
* miscfuncs.cc (check_null_str): Delete.
(check_null_empty_str): Ditto.
(check_null_empty_str_errno): Ditto.
(check_null_str_errno): Ditto.
(__check_null_invalid_struct): Ditto.
(__check_null_invalid_struct_errno): Ditto.
(__check_invalid_read_ptr): Ditto.
(__check_invalid_read_ptr_errno): Ditto.
(dummytest): New function.
(check_iovec_for_read): Delete.
(chec_iovec): Rename from check_iovec_for_write. Take a read/write parameter.
* tlsoffsets.h: Regenerate.
* winsup.h: Remove check_* declarations.
(check_iovec_for_read): Delete declaration. Turn into a define instead.
(check_iovec_for_write): Ditto.
(check_iovec): New declaration.
* thread.h: Use ifdef guard name consistent with other header files.
Diffstat (limited to 'winsup/cygwin/syscalls.cc')
-rw-r--r-- | winsup/cygwin/syscalls.cc | 95 |
1 files changed, 61 insertions, 34 deletions
diff --git a/winsup/cygwin/syscalls.cc b/winsup/cygwin/syscalls.cc index 3f50a7b99..804965f36 100644 --- a/winsup/cygwin/syscalls.cc +++ b/winsup/cygwin/syscalls.cc @@ -550,7 +550,12 @@ open (const char *unix_path, int flags, ...) sig_dispatch_pending (); syscall_printf ("open (%s, %p)", unix_path, flags); - if (!check_null_empty_str_errno (unix_path)) + myfault efault; + if (efault.faulted (EFAULT)) + /* errno already set */; + else if (!*unix_path) + set_errno (ENOENT); + else { /* check for optional mode argument */ va_start (ap, flags); @@ -1008,7 +1013,8 @@ stat_worker (const char *name, struct __stat64 *buf, int nofollow) int res = -1; fhandler_base *fh = NULL; - if (check_null_invalid_struct_errno (buf)) + myfault efault; + if (efault.faulted (EFAULT)) goto error; if (!(fh = build_fh_name (name, NULL, nofollow ? PC_SYM_NOFOLLOW : PC_SYM_FOLLOW, @@ -1299,13 +1305,14 @@ system (const char *cmdstring) { pthread_testcancel (); - if (check_null_empty_str_errno (cmdstring)) + myfault efault; + if (efault.faulted (EFAULT)) return -1; int res; const char* command[4]; - if (cmdstring == (const char *) NULL) + if (cmdstring == NULL) return 1; command[0] = "sh"; @@ -1437,11 +1444,17 @@ fpathconf (int fd, int v) extern "C" long int pathconf (const char *file, int v) { + myfault efault; + if (efault.faulted (EFAULT)) + return -1; + if (!*file) + { + set_errno (ENOENT); + return -1; + } switch (v) { case _PC_PATH_MAX: - if (check_null_empty_str_errno (file)) - return -1; return PATH_MAX - strlen (file); case _PC_NAME_MAX: return PATH_MAX; @@ -1483,8 +1496,9 @@ extern "C" int ttyname_r (int fd, char *buf, size_t buflen) { int ret = 0; - if (__check_null_invalid_struct (buf, buflen)) - ret = EINVAL; + myfault efault; + if (efault.faulted ()) + ret = EFAULT; else { cygheap_fdget cfd (fd, true); @@ -1713,9 +1727,14 @@ statvfs (const char *fname, struct statvfs *sfs) int ret = -1; char root[CYG_MAX_PATH]; - if (check_null_empty_str_errno (fname) - || check_null_invalid_struct_errno (sfs)) + myfault efault; + if (efault.faulted (EFAULT)) return -1; + if (!*fname) + { + set_errno (ENOENT); + return -1; + } syscall_printf ("statfs %s", fname); @@ -1798,7 +1817,8 @@ fstatvfs (int fd, struct statvfs *sfs) extern "C" int statfs (const char *fname, struct statfs *sfs) { - if (check_null_invalid_struct_errno (sfs)) + myfault efault; + if (efault.faulted (EFAULT)) return -1; struct statvfs vfs; int ret = statvfs (fname, &vfs); @@ -1837,33 +1857,27 @@ setpgid (pid_t pid, pid_t pgid) pgid = pid; if (pgid < 0) - { - set_errno (EINVAL); - goto out; - } + set_errno (EINVAL); else { pinfo p (pid, PID_MAP_RW); if (!p) - { - set_errno (ESRCH); - goto out; - } + set_errno (ESRCH); + else if (p->pgid == pgid) + res = 0; /* A process may only change the process group of itself and its children */ - if (p == myself || p->ppid == myself->pid) + else if (p != myself && p->ppid != myself->pid) + set_errno (EPERM); + else { p->pgid = pgid; if (p->pid != p->pgid) p->set_has_pgid_children (0); res = 0; - } - else - { - set_errno (EPERM); - goto out; + // init_console_handler (FALSE); } } -out: + syscall_printf ("pid %d, pgid %d, res %d", pid, pgid, res); return res; } @@ -1924,8 +1938,14 @@ mknod_worker (const char *path, mode_t type, mode_t mode, _major_t major, extern "C" int mknod32 (const char *path, mode_t mode, __dev32_t dev) { - if (check_null_empty_str_errno (path)) + myfault efault; + if (efault.faulted (EFAULT)) return -1; + if (!*path) + { + set_errno (ENOENT); + return -1; + } if (strlen (path) >= CYG_MAX_PATH) return -1; @@ -2627,7 +2647,8 @@ endutent () extern "C" void utmpname (const char *file) { - if (check_null_empty_str (file)) + myfault efault; + if (efault.faulted () || !*file) { debug_printf ("Invalid file"); return; @@ -2678,7 +2699,8 @@ getutent () extern "C" struct utmp * getutid (struct utmp *id) { - if (check_null_invalid_struct_errno (id)) + myfault efault; + if (efault.faulted (EFAULT)) return NULL; if (utmp_fd < 0) { @@ -2716,7 +2738,8 @@ getutid (struct utmp *id) extern "C" struct utmp * getutline (struct utmp *line) { - if (check_null_invalid_struct_errno (line)) + myfault efault; + if (efault.faulted (EFAULT)) return NULL; if (utmp_fd < 0) { @@ -2738,7 +2761,8 @@ getutline (struct utmp *line) extern "C" struct utmp * pututline (struct utmp *ut) { - if (check_null_invalid_struct (ut)) + myfault efault; + if (efault.faulted (EFAULT)) return NULL; internal_setutent (true); if (utmp_fd < 0) @@ -2786,7 +2810,8 @@ getutxid (const struct utmpx *id) { static struct utmpx utx; - if (__check_invalid_read_ptr (id, sizeof *id)) + myfault efault; + if (efault.faulted (EFAULT)) return NULL; ((struct utmpx *)id)->ut_time = id->ut_tv.tv_sec; return copy_ut_to_utx (getutid ((struct utmp *) id), &utx); @@ -2797,7 +2822,8 @@ getutxline (const struct utmpx *line) { static struct utmpx utx; - if (__check_invalid_read_ptr (line, sizeof *line)) + myfault efault; + if (efault.faulted (EFAULT)) return NULL; ((struct utmpx *)line)->ut_time = line->ut_tv.tv_sec; return copy_ut_to_utx (getutline ((struct utmp *) line), &utx); @@ -2808,7 +2834,8 @@ pututxline (const struct utmpx *utmpx) { static struct utmpx utx; - if (__check_invalid_read_ptr (utmpx, sizeof *utmpx)) + myfault efault; + if (efault.faulted (EFAULT)) return NULL; ((struct utmpx *)utmpx)->ut_time = utmpx->ut_tv.tv_sec; return copy_ut_to_utx (pututline ((struct utmp *) utmpx), &utx); |