mirror of
https://sourceware.org/git/glibc.git
synced 2024-12-28 13:31:13 +00:00
34a5a1460e
The GNU Coding Standards specify that line breaks in expressions should go before an operator, not after one. This patch fixes various code to do this. It only changes code that appears to be mostly following GNU style anyway, not files and directories with substantially different formatting. It is not exhaustive even for files using GNU style (for example, changes to sysdeps files are deferred for subsequent cleanups). Some files changed are shared with gnulib, but most are specific to glibc. Changes were made manually, with places to change found by grep (so some cases, e.g. where the operator was followed by a comment at end of line, are particularly liable to have been missed by grep, but I did include cases where the operator was followed by backslash-newline). This patch generally does not attempt to address other coding style issues in the expressions changed (for example, missing spaces before '(', or lack of parentheses to ensure indentation of continuation lines properly reflects operator precedence). Tested for x86_64, and with build-many-glibcs.py. * benchtests/bench-memmem.c (simple_memmem): Break lines before rather than after operators. * benchtests/bench-skeleton.c (TIMESPEC_AFTER): Likewise. * crypt/md5.c (md5_finish_ctx): Likewise. * crypt/sha256.c (__sha256_finish_ctx): Likewise. * crypt/sha512.c (__sha512_finish_ctx): Likewise. * elf/cache.c (load_aux_cache): Likewise. * elf/dl-load.c (open_verify): Likewise. * elf/get-dynamic-info.h (elf_get_dynamic_info): Likewise. * elf/readelflib.c (process_elf_file): Likewise. * elf/rtld.c (dl_main): Likewise. * elf/sprof.c (generate_call_graph): Likewise. * hurd/ctty-input.c (_hurd_ctty_input): Likewise. * hurd/ctty-output.c (_hurd_ctty_output): Likewise. * hurd/dtable.c (reauth_dtable): Likewise. * hurd/getdport.c (__getdport): Likewise. * hurd/hurd/signal.h (_hurd_interrupted_rpc_timeout): Likewise. * hurd/hurd/sigpreempt.h (HURD_PREEMPT_SIGNAL_P): Likewise. * hurd/hurdfault.c (_hurdsig_fault_catch_exception_raise): Likewise. * hurd/hurdioctl.c (fioctl): Likewise. * hurd/hurdselect.c (_hurd_select): Likewise. * hurd/hurdsig.c (_hurdsig_abort_rpcs): Likewise. (STOPSIGS): Likewise. * hurd/hurdstartup.c (_hurd_startup): Likewise. * hurd/intr-msg.c (_hurd_intr_rpc_mach_msg): Likewise. * hurd/lookup-retry.c (__hurd_file_name_lookup_retry): Likewise. * hurd/msgportdemux.c (msgport_server): Likewise. * hurd/setauth.c (_hurd_setauth): Likewise. * include/features.h (__GLIBC_USE_DEPRECATED_SCANF): Likewise. * libio/libioP.h [IO_DEBUG] (CHECK_FILE): Likewise. * locale/programs/ld-ctype.c (set_class_defaults): Likewise. * localedata/tests-mbwc/tst_swscanf.c (tst_swscanf): Likewise. * login/tst-utmp.c (do_check): Likewise. (simulate_login): Likewise. * mach/lowlevellock.h (lll_lock): Likewise. (lll_trylock): Likewise. * math/test-fenv.c (ALL_EXC): Likewise. * math/test-fenvinline.c (ALL_EXC): Likewise. * misc/sys/cdefs.h (__attribute_deprecated_msg__): Likewise. * nis/nis_call.c (__do_niscall3): Likewise. * nis/nis_callback.c (cb_prog_1): Likewise. * nis/nis_defaults.c (searchaccess): Likewise. * nis/nis_findserv.c (__nis_findfastest_with_timeout): Likewise. * nis/nis_ismember.c (internal_ismember): Likewise. * nis/nis_local_names.c (nis_local_principal): Likewise. * nis/nss_nis/nis-rpc.c (_nss_nis_getrpcbyname_r): Likewise. * nis/nss_nisplus/nisplus-netgrp.c (_nss_nisplus_getnetgrent_r): Likewise. * nis/ypclnt.c (yp_match): Likewise. (yp_first): Likewise. (yp_next): Likewise. (yp_master): Likewise. (yp_order): Likewise. * nscd/hstcache.c (cache_addhst): Likewise. * nscd/initgrcache.c (addinitgroupsX): Likewise. * nss/nss_compat/compat-pwd.c (copy_pwd_changes): Likewise. (internal_getpwuid_r): Likewise. * nss/nss_compat/compat-spwd.c (copy_spwd_changes): Likewise. * posix/glob.h (__GLOB_FLAGS): Likewise. * posix/regcomp.c (peek_token): Likewise. (peek_token_bracket): Likewise. (parse_expression): Likewise. * posix/regexec.c (sift_states_iter_mb): Likewise. (check_node_accept_bytes): Likewise. * posix/tst-spawn3.c (do_test): Likewise. * posix/wordexp-test.c (testit): Likewise. * posix/wordexp.c (parse_tilde): Likewise. (exec_comm): Likewise. * posix/wordexp.h (__WRDE_FLAGS): Likewise. * resource/vtimes.c (TIMEVAL_TO_VTIMES): Likewise. * setjmp/sigjmp.c (__sigjmp_save): Likewise. * stdio-common/printf_fp.c (__printf_fp_l): Likewise. * stdio-common/tst-fileno.c (do_test): Likewise. * stdio-common/vfprintf-internal.c (vfprintf): Likewise. * stdlib/strfmon_l.c (__vstrfmon_l_internal): Likewise. * stdlib/strtod_l.c (round_and_return): Likewise. (____STRTOF_INTERNAL): Likewise. * stdlib/tst-strfrom.h (TEST_STRFROM): Likewise. * string/strcspn.c (STRCSPN): Likewise. * string/test-memmem.c (simple_memmem): Likewise. * termios/tcsetattr.c (tcsetattr): Likewise. * time/alt_digit.c (_nl_parse_alt_digit): Likewise. * time/asctime.c (asctime_internal): Likewise. * time/strptime_l.c (__strptime_internal): Likewise. * time/sys/time.h (timercmp): Likewise. * time/tzfile.c (__tzfile_compute): Likewise.
239 lines
7.2 KiB
C
239 lines
7.2 KiB
C
/* Handle faults in the signal thread.
|
|
Copyright (C) 1994-2019 Free Software Foundation, Inc.
|
|
This file is part of the GNU C Library.
|
|
|
|
The GNU C Library is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU Lesser General Public
|
|
License as published by the Free Software Foundation; either
|
|
version 2.1 of the License, or (at your option) any later version.
|
|
|
|
The GNU C Library is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Lesser General Public License for more details.
|
|
|
|
You should have received a copy of the GNU Lesser General Public
|
|
License along with the GNU C Library; if not, see
|
|
<http://www.gnu.org/licenses/>. */
|
|
|
|
#include <hurd.h>
|
|
#include <hurd/signal.h>
|
|
#include "hurdfault.h"
|
|
#include <errno.h>
|
|
#include <string.h>
|
|
#include <setjmp.h>
|
|
#include <stdio.h>
|
|
#include <thread_state.h>
|
|
#include "faultexc_server.h" /* mig-generated header for our exc server. */
|
|
#include <assert.h>
|
|
|
|
jmp_buf _hurdsig_fault_env;
|
|
struct hurd_signal_preemptor _hurdsig_fault_preemptor = {0};
|
|
|
|
/* XXX temporary to deal with spelling fix */
|
|
weak_alias (_hurdsig_fault_preemptor, _hurdsig_fault_preempter)
|
|
|
|
static mach_port_t forward_sigexc;
|
|
|
|
kern_return_t
|
|
_hurdsig_fault_catch_exception_raise (mach_port_t port,
|
|
thread_t thread,
|
|
task_t task,
|
|
#ifdef EXC_MASK_ALL /* New interface flavor. */
|
|
exception_type_t exception,
|
|
exception_data_t code,
|
|
mach_msg_type_number_t codeCnt
|
|
#else /* Vanilla Mach 3.0 interface. */
|
|
integer_t exception,
|
|
integer_t code, integer_t subcode
|
|
#endif
|
|
)
|
|
{
|
|
int signo;
|
|
struct hurd_signal_detail d;
|
|
|
|
if (port != forward_sigexc
|
|
|| thread != _hurd_msgport_thread || task != __mach_task_self ())
|
|
return EPERM; /* Strange bogosity. */
|
|
|
|
d.exc = exception;
|
|
#ifdef EXC_MASK_ALL
|
|
assert (codeCnt >= 2);
|
|
d.exc_code = code[0];
|
|
d.exc_subcode = code[1];
|
|
#else
|
|
d.exc_code = code;
|
|
d.exc_subcode = subcode;
|
|
#endif
|
|
|
|
/* Call the machine-dependent function to translate the Mach exception
|
|
codes into a signal number and subcode. */
|
|
_hurd_exception2signal (&d, &signo);
|
|
|
|
return HURD_PREEMPT_SIGNAL_P (&_hurdsig_fault_preemptor, signo, d.code)
|
|
? 0 : EGREGIOUS;
|
|
}
|
|
|
|
#ifdef EXC_MASK_ALL
|
|
/* XXX New interface flavor has additional RPCs that we could be using
|
|
instead. These RPCs roll a thread_get_state/thread_set_state into
|
|
the message, so the signal thread ought to use these to save some calls.
|
|
*/
|
|
kern_return_t
|
|
_hurdsig_fault_catch_exception_raise_state
|
|
(mach_port_t port,
|
|
exception_type_t exception,
|
|
exception_data_t code,
|
|
mach_msg_type_number_t codeCnt,
|
|
int *flavor,
|
|
thread_state_t old_state,
|
|
mach_msg_type_number_t old_stateCnt,
|
|
thread_state_t new_state,
|
|
mach_msg_type_number_t *new_stateCnt)
|
|
{
|
|
abort ();
|
|
return KERN_FAILURE;
|
|
}
|
|
|
|
kern_return_t
|
|
_hurdsig_fault_catch_exception_raise_state_identity
|
|
(mach_port_t exception_port,
|
|
thread_t thread,
|
|
task_t task,
|
|
exception_type_t exception,
|
|
exception_data_t code,
|
|
mach_msg_type_number_t codeCnt,
|
|
int *flavor,
|
|
thread_state_t old_state,
|
|
mach_msg_type_number_t old_stateCnt,
|
|
thread_state_t new_state,
|
|
mach_msg_type_number_t *new_stateCnt)
|
|
{
|
|
abort ();
|
|
return KERN_FAILURE;
|
|
}
|
|
#endif
|
|
|
|
|
|
#ifdef NDR_CHAR_ASCII /* OSF Mach flavors have different names. */
|
|
# define mig_reply_header_t mig_reply_error_t
|
|
#endif
|
|
|
|
static void
|
|
faulted (void)
|
|
{
|
|
struct
|
|
{
|
|
mach_msg_header_t head;
|
|
char buf[64];
|
|
} request;
|
|
mig_reply_header_t reply;
|
|
extern int _hurdsig_fault_exc_server (mach_msg_header_t *,
|
|
mach_msg_header_t *);
|
|
|
|
/* Wait for the exception_raise message forwarded by the proc server. */
|
|
|
|
if (__mach_msg (&request.head, MACH_RCV_MSG, 0,
|
|
sizeof request, forward_sigexc,
|
|
MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL)
|
|
!= MACH_MSG_SUCCESS)
|
|
__libc_fatal ("msg receive failed on signal thread exc\n");
|
|
|
|
/* Run the exc demuxer which should call the server function above.
|
|
That function returns 0 if the exception was expected. */
|
|
_hurdsig_fault_exc_server (&request.head, &reply.Head);
|
|
if (reply.Head.msgh_remote_port != MACH_PORT_NULL)
|
|
__mach_msg (&reply.Head, MACH_SEND_MSG, reply.Head.msgh_size,
|
|
0, MACH_PORT_NULL, MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL);
|
|
if (reply.RetCode == MIG_BAD_ID)
|
|
__mach_msg_destroy (&request.head);
|
|
|
|
if (reply.RetCode)
|
|
__libc_fatal ("BUG: unexpected fault in signal thread\n");
|
|
|
|
_hurdsig_fault_preemptor.signals = 0;
|
|
longjmp (_hurdsig_fault_env, 1);
|
|
}
|
|
|
|
static char faultstack[1024];
|
|
|
|
/* Send exceptions for the signal thread to the proc server.
|
|
It will forward the message on to our message port,
|
|
and then restore the thread's state to code which
|
|
does `longjmp (_hurd_sigthread_fault_env, 1)'. */
|
|
|
|
void
|
|
_hurdsig_fault_init (void)
|
|
{
|
|
error_t err;
|
|
struct machine_thread_state state;
|
|
mach_port_t sigexc;
|
|
|
|
/* Allocate a port to receive signal thread exceptions.
|
|
We will move this receive right to the proc server. */
|
|
err = __mach_port_allocate (__mach_task_self (),
|
|
MACH_PORT_RIGHT_RECEIVE, &sigexc);
|
|
assert_perror (err);
|
|
err = __mach_port_allocate (__mach_task_self (),
|
|
MACH_PORT_RIGHT_RECEIVE, &forward_sigexc);
|
|
assert_perror (err);
|
|
|
|
/* Allocate a port to receive the exception msgs forwarded
|
|
from the proc server. */
|
|
err = __mach_port_insert_right (__mach_task_self (), sigexc,
|
|
sigexc, MACH_MSG_TYPE_MAKE_SEND);
|
|
assert_perror (err);
|
|
|
|
/* Set the queue limit for this port to just one. The proc server will
|
|
notice if we ever get a second exception while one remains queued and
|
|
unreceived, and decide we are hopelessly buggy. */
|
|
#ifdef MACH_PORT_RECEIVE_STATUS_COUNT
|
|
{
|
|
const mach_port_limits_t lim = { mpl_qlimit: 1 };
|
|
assert (MACH_PORT_RECEIVE_STATUS_COUNT == sizeof lim / sizeof (natural_t));
|
|
err = __mach_port_set_attributes (__mach_task_self (), forward_sigexc,
|
|
MACH_PORT_RECEIVE_STATUS,
|
|
(mach_port_info_t) &lim,
|
|
MACH_PORT_RECEIVE_STATUS_COUNT);
|
|
}
|
|
#else
|
|
err = __mach_port_set_qlimit (__mach_task_self (), forward_sigexc, 1);
|
|
#endif
|
|
assert_perror (err);
|
|
|
|
/* This state will be restored when we fault.
|
|
It runs the function above. */
|
|
memset (&state, 0, sizeof state);
|
|
MACHINE_THREAD_STATE_FIX_NEW (&state);
|
|
MACHINE_THREAD_STATE_SET_PC (&state, faulted);
|
|
MACHINE_THREAD_STATE_SET_SP (&state, faultstack, sizeof faultstack);
|
|
|
|
err = __USEPORT
|
|
(PROC,
|
|
__proc_handle_exceptions (port,
|
|
sigexc,
|
|
forward_sigexc, MACH_MSG_TYPE_MAKE_SEND,
|
|
MACHINE_THREAD_STATE_FLAVOR,
|
|
(natural_t *) &state,
|
|
MACHINE_THREAD_STATE_COUNT));
|
|
assert_perror (err);
|
|
|
|
/* Direct signal thread exceptions to the proc server. */
|
|
#ifdef THREAD_EXCEPTION_PORT
|
|
err = __thread_set_special_port (_hurd_msgport_thread,
|
|
THREAD_EXCEPTION_PORT, sigexc);
|
|
#elif defined (EXC_MASK_ALL)
|
|
__thread_set_exception_ports (_hurd_msgport_thread,
|
|
EXC_MASK_ALL & ~(EXC_MASK_SYSCALL
|
|
| EXC_MASK_MACH_SYSCALL
|
|
| EXC_MASK_RPC_ALERT),
|
|
sigexc,
|
|
EXCEPTION_STATE_IDENTITY,
|
|
MACHINE_THREAD_STATE);
|
|
#else
|
|
# error thread_set_exception_ports?
|
|
#endif
|
|
__mach_port_deallocate (__mach_task_self (), sigexc);
|
|
assert_perror (err);
|
|
}
|