Branch data Line data Source code
1 : : /* GLIB - Library of useful routines for C programming
2 : : * Copyright (C) 2011 Red Hat, Inc.
3 : : *
4 : : * SPDX-License-Identifier: LGPL-2.1-or-later
5 : : *
6 : : * This library is free software; you can redistribute it and/or
7 : : * modify it under the terms of the GNU Lesser General Public
8 : : * License as published by the Free Software Foundation; either
9 : : * version 2.1 of the License, or (at your option) any later version.
10 : : *
11 : : * This library is distributed in the hope that it will be useful,
12 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 : : * Lesser General Public License for more details.
15 : : *
16 : : * You should have received a copy of the GNU Lesser General Public
17 : : * License along with this library; if not, see <http://www.gnu.org/licenses/>.
18 : : *
19 : : * Author: Colin Walters <walters@verbum.org>
20 : : */
21 : :
22 : : #include "config.h"
23 : :
24 : : #include "glib-private.h"
25 : : #include "glib-init.h"
26 : : #include "gutilsprivate.h"
27 : : #include "gdatasetprivate.h"
28 : :
29 : : #ifdef USE_INVALID_PARAMETER_HANDLER
30 : : #include <crtdbg.h>
31 : : #endif
32 : :
33 : : /**
34 : : * glib__private__:
35 : : * @arg: Do not use this argument
36 : : *
37 : : * Do not call this function; it is used to share private
38 : : * API between glib, gobject, and gio.
39 : : */
40 : : const GLibPrivateVTable *
41 : 87028 : glib__private__ (void)
42 : : {
43 : : static const GLibPrivateVTable table = {
44 : : g_wakeup_new,
45 : : g_wakeup_free,
46 : : g_wakeup_get_pollfd,
47 : : g_wakeup_signal,
48 : : g_wakeup_acknowledge,
49 : :
50 : : g_get_worker_context,
51 : :
52 : : g_check_setuid,
53 : : g_main_context_new_with_next_id,
54 : :
55 : : g_dir_open_with_errno,
56 : : g_dir_new_from_dirp,
57 : :
58 : : glib_init,
59 : :
60 : : #ifdef G_OS_WIN32
61 : : g_win32_stat_utf8,
62 : : g_win32_lstat_utf8,
63 : : g_win32_readlink_utf8,
64 : : g_win32_fstat,
65 : : g_win32_find_helper_executable_path,
66 : : g_win32_reopen_noninherited,
67 : : g_win32_handle_is_socket,
68 : : #endif
69 : :
70 : : g_win32_push_empty_invalid_parameter_handler,
71 : : g_win32_pop_invalid_parameter_handler,
72 : :
73 : : g_find_program_for_path,
74 : :
75 : : g_uri_get_default_scheme_port,
76 : :
77 : : g_set_prgname_once,
78 : :
79 : : g_datalist_id_update_atomic,
80 : : };
81 : :
82 : 87028 : return &table;
83 : : }
84 : :
85 : : #ifdef USE_INVALID_PARAMETER_HANDLER
86 : : /*
87 : : * This is the (empty) invalid parameter handler
88 : : * that is used for Visual C++ 2005 (and later) builds
89 : : * so that we can use this instead of the system automatically
90 : : * aborting the process, when calling _get_osfhandle(), isatty()
91 : : * and _commit() (via g_fsync()) and so on with an invalid file
92 : : * descriptor.
93 : : *
94 : : * This is necessary so that the gspawn helper and the test programs
95 : : * will continue to run as expected, since we are purposely or
96 : : * forced to use invalid FDs.
97 : : *
98 : : * Please see https://learn.microsoft.com/en-us/cpp/c-runtime-library/parameter-validation?view=msvc-170
99 : : * for an explanation on this.
100 : : */
101 : : static void
102 : : empty_invalid_parameter_handler (const wchar_t *expression,
103 : : const wchar_t *function,
104 : : const wchar_t *file,
105 : : unsigned int line,
106 : : uintptr_t pReserved)
107 : : {
108 : : }
109 : :
110 : : /* fallback to _set_invalid_parameter_handler() if we don't have _set_thread_local_invalid_parameter_handler() */
111 : : #ifndef HAVE__SET_THREAD_LOCAL_INVALID_PARAMETER_HANDLER
112 : : # define _set_thread_local_invalid_parameter_handler _set_invalid_parameter_handler
113 : : #endif
114 : :
115 : : #endif
116 : : /*
117 : : * g_win32_push_empty_invalid_parameter_handler:
118 : : * @handler: a possibly uninitialized GWin32InvalidParameterHandler
119 : : */
120 : : void
121 : 15 : g_win32_push_empty_invalid_parameter_handler (GWin32InvalidParameterHandler *handler)
122 : : {
123 : : #ifdef USE_INVALID_PARAMETER_HANDLER
124 : : /* use the empty invalid parameter handler to override the default invalid parameter_handler */
125 : : handler->pushed_handler = empty_invalid_parameter_handler;
126 : : handler->old_handler = _set_thread_local_invalid_parameter_handler (handler->pushed_handler);
127 : :
128 : : /* Disable the message box for assertions. */
129 : : handler->pushed_report_mode = 0;
130 : : handler->prev_report_mode = _CrtSetReportMode(_CRT_ASSERT, handler->pushed_report_mode);
131 : : #endif
132 : 15 : }
133 : :
134 : : /*
135 : : * g_win32_pop_invalid_parameter_handler:
136 : : * @handler: a GWin32InvalidParameterHandler processed with
137 : : * g_win32_push_empty_invalid_parameter_handler()
138 : : */
139 : : void
140 : 15 : g_win32_pop_invalid_parameter_handler (GWin32InvalidParameterHandler *handler)
141 : : {
142 : : #ifdef USE_INVALID_PARAMETER_HANDLER
143 : : G_GNUC_UNUSED _invalid_parameter_handler popped_handler;
144 : : G_GNUC_UNUSED int popped_report_mode;
145 : :
146 : : /* Restore previous/default invalid parameter handler, check the value returned matches the one we previously pushed */
147 : : popped_handler = _set_thread_local_invalid_parameter_handler (handler->old_handler);
148 : : g_return_if_fail (handler->pushed_handler == popped_handler);
149 : :
150 : : /* Restore the message box for assertions, check the value returned matches the one we previously pushed */
151 : : popped_report_mode = _CrtSetReportMode(_CRT_ASSERT, handler->prev_report_mode);
152 : : g_return_if_fail (handler->pushed_report_mode == popped_report_mode);
153 : : #endif
154 : 15 : }
|