CVE-2022-2127: winbindd: Fix WINBINDD_PAM_AUTH_CRAP length checks
[samba.git] / source3 / winbindd / winbindd_traceid.c
1 /*
2     Authors:
3         Pavel Březina <pbrezina@redhat.com>
4
5     Copyright (C) 2021 Red Hat
6
7     This program is free software; you can redistribute it and/or modify
8     it under the terms of the GNU General Public License as published by
9     the Free Software Foundation; either version 3 of the License, or
10     (at your option) any later version.
11
12     This program is distributed in the hope that it will be useful,
13     but WITHOUT ANY WARRANTY; without even the implied warranty of
14     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15     GNU General Public License for more details.
16
17     You should have received a copy of the GNU General Public License
18     along with this program.  If not, see <http://www.gnu.org/licenses/>.
19 */
20
21 #include "lib/util/debug.h"
22 #include "winbindd_traceid.h"
23 #include "tevent.h"
24
25 static void debug_traceid_trace_fde(struct tevent_fd *fde,
26                                    enum tevent_event_trace_point point,
27                                    void *private_data)
28 {
29     switch (point) {
30     case TEVENT_EVENT_TRACE_ATTACH:
31         /* Assign the current traceid id when the event is created. */
32         tevent_fd_set_tag(fde, debug_traceid_get());
33         break;
34     case TEVENT_EVENT_TRACE_BEFORE_HANDLER:
35         /* Set the traceid id when a handler is being called. */
36         debug_traceid_set(tevent_fd_get_tag(fde));
37         break;
38     default:
39         /* Do nothing. */
40         break;
41     }
42 }
43
44 static void debug_traceid_trace_signal(struct tevent_signal *se,
45                                       enum tevent_event_trace_point point,
46                                       void *private_data)
47 {
48     switch (point) {
49     case TEVENT_EVENT_TRACE_ATTACH:
50         /* Assign the current traceid id when the event is created. */
51         tevent_signal_set_tag(se, debug_traceid_get());
52         break;
53     case TEVENT_EVENT_TRACE_BEFORE_HANDLER:
54         /* Set the traceid id when a handler is being called. */
55         debug_traceid_set(tevent_signal_get_tag(se));
56         break;
57     default:
58         /* Do nothing. */
59         break;
60     }
61 }
62
63 static void debug_traceid_trace_timer(struct tevent_timer *timer,
64                                      enum tevent_event_trace_point point,
65                                      void *private_data)
66 {
67     switch (point) {
68     case TEVENT_EVENT_TRACE_ATTACH:
69         /* Assign the current traceid id when the event is created. */
70         tevent_timer_set_tag(timer, debug_traceid_get());
71         break;
72     case TEVENT_EVENT_TRACE_BEFORE_HANDLER:
73         /* Set the traceid id when a handler is being called. */
74         debug_traceid_set(tevent_timer_get_tag(timer));
75         break;
76     default:
77         /* Do nothing. */
78         break;
79     }
80 }
81
82 static void debug_traceid_trace_immediate(struct tevent_immediate *im,
83                                          enum tevent_event_trace_point point,
84                                          void *private_data)
85 {
86     switch (point) {
87     case TEVENT_EVENT_TRACE_ATTACH:
88         /* Assign the current traceid id when the event is created. */
89         tevent_immediate_set_tag(im, debug_traceid_get());
90         break;
91     case TEVENT_EVENT_TRACE_BEFORE_HANDLER:
92         /* Set the traceid id when a handler is being called. */
93         debug_traceid_set(tevent_immediate_get_tag(im));
94         break;
95     default:
96         /* Do nothing. */
97         break;
98     }
99 }
100
101 static void debug_traceid_trace_queue(struct tevent_queue_entry *qe,
102                                          enum tevent_event_trace_point point,
103                                          void *private_data)
104 {
105     switch (point) {
106     case TEVENT_EVENT_TRACE_ATTACH:
107         /* Assign the current traceid id when the event is created. */
108         tevent_queue_entry_set_tag(qe, debug_traceid_get());
109         break;
110     case TEVENT_EVENT_TRACE_BEFORE_HANDLER:
111         /* Set the traceid id when a handler is being called. */
112         debug_traceid_set(tevent_queue_entry_get_tag(qe));
113         break;
114     default:
115         /* Do nothing. */
116         break;
117     }
118 }
119
120 static void debug_traceid_trace_loop(enum tevent_trace_point point,
121                                     void *private_data)
122 {
123     switch (point) {
124     case TEVENT_TRACE_AFTER_LOOP_ONCE:
125         /* Reset traceid id when we got back to the loop. An event handler
126          * that set traceid id was fired. This tracepoint represents a place
127          * after the event handler was finished, we need to restore traceid
128          * id to 1 (out of request). 0 means not initialized.
129          */
130         debug_traceid_set(1);
131         break;
132     default:
133         /* Do nothing. */
134         break;
135     }
136 }
137
138 void winbind_debug_traceid_setup(struct tevent_context *ev)
139 {
140     tevent_set_trace_callback(ev, debug_traceid_trace_loop, NULL);
141     tevent_set_trace_fd_callback(ev, debug_traceid_trace_fde, NULL);
142     tevent_set_trace_signal_callback(ev, debug_traceid_trace_signal, NULL);
143     tevent_set_trace_timer_callback(ev, debug_traceid_trace_timer, NULL);
144     tevent_set_trace_immediate_callback(ev, debug_traceid_trace_immediate, NULL);
145     tevent_set_trace_queue_callback(ev, debug_traceid_trace_queue, NULL);
146     debug_traceid_set(1);
147 }