Bug Summary

File:root/firefox-clang/dom/media/webrtc/transport/third_party/nICEr/src/stun/stun_server_ctx.c
Warning:line 352, column 10
Although the value stored to 'r' is used in the enclosing expression, the value is never actually read from 'r'

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -cc1 -triple x86_64-pc-linux-gnu -analyze -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name Unified_c_third_party_nICEr1.c -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -analyzer-config-compatibility-mode=true -mrelocation-model pic -pic-level 2 -fhalf-no-semantic-interposition -mframe-pointer=all -relaxed-aliasing -ffp-contract=off -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -fdebug-compilation-dir=/root/firefox-clang/obj-x86_64-pc-linux-gnu/dom/media/webrtc/transport/third_party/nICEr/nicer_nicer -fcoverage-compilation-dir=/root/firefox-clang/obj-x86_64-pc-linux-gnu/dom/media/webrtc/transport/third_party/nICEr/nicer_nicer -resource-dir /usr/lib/llvm-21/lib/clang/21 -include /root/firefox-clang/config/gcc_hidden.h -include /root/firefox-clang/obj-x86_64-pc-linux-gnu/mozilla-config.h -I /root/firefox-clang/obj-x86_64-pc-linux-gnu/dist/system_wrappers -U _FORTIFY_SOURCE -D _FORTIFY_SOURCE=2 -D _GLIBCXX_ASSERTIONS -D DEBUG=1 -D _FILE_OFFSET_BITS=64 -D CHROMIUM_BUILD -D USE_LIBJPEG_TURBO=1 -D USE_NSS=1 -D ENABLE_ONE_CLICK_SIGNIN -D GTK_DISABLE_SINGLE_INCLUDES=1 -D _ISOC99_SOURCE=1 -D ENABLE_REMOTING=1 -D ENABLE_WEBRTC=1 -D ENABLE_CONFIGURATION_POLICY -D ENABLE_INPUT_SPEECH -D ENABLE_NOTIFICATIONS -D ENABLE_GPU=1 -D ENABLE_EGLIMAGE=1 -D USE_SKIA=1 -D ENABLE_TASK_MANAGER=1 -D ENABLE_WEB_INTENTS=1 -D ENABLE_EXTENSIONS=1 -D ENABLE_PLUGIN_INSTALLATION=1 -D ENABLE_PROTECTOR_SERVICE=1 -D ENABLE_SESSION_SERVICE=1 -D ENABLE_THEMES=1 -D ENABLE_BACKGROUND=1 -D ENABLE_AUTOMATION=1 -D ENABLE_PRINTING=1 -D ENABLE_CAPTIVE_PORTAL_DETECTION=1 -D SANITY_CHECKS -D USE_TURN -D USE_ICE -D USE_RFC_3489_BACKWARDS_COMPATIBLE -D USE_STUND_0_96 -D USE_STUN_PEDANTIC -D NR_SOCKET_IS_VOID_PTR -D restrict= -D R_PLATFORM_INT_TYPES=<stdint.h> -D R_DEFINED_INT2=int16_t -D R_DEFINED_UINT2=uint16_t -D R_DEFINED_INT4=int32_t -D R_DEFINED_UINT4=uint32_t -D R_DEFINED_INT8=int64_t -D R_DEFINED_UINT8=uint64_t -D LINUX -D HAVE_LIBM=1 -D HAVE_STRDUP=1 -D HAVE_STRLCPY=1 -D HAVE_SYS_TIME_H=1 -D HAVE_VFPRINTF=1 -D NEW_STDIORETSIGTYPE=void -D TIME_WITH_SYS_TIME_H=1 -D __UNUSED__=__attribute__((unused)) -D DYNAMIC_ANNOTATIONS_ENABLED=1 -D WTF_USE_DYNAMIC_ANNOTATIONS=1 -D _DEBUG -D MOZ_HAS_MOZGLUE -D MOZILLA_INTERNAL_API -D IMPL_LIBXUL -D MOZ_SUPPORT_LEAKCHECKING -D STATIC_EXPORTABLE_JS_API -I /root/firefox-clang/dom/media/webrtc/transport/third_party/nICEr -I /root/firefox-clang/obj-x86_64-pc-linux-gnu/dom/media/webrtc/transport/third_party/nICEr/nicer_nicer -I /root/firefox-clang/dom/media/webrtc/transport/third_party/nrappkit/src/event -I /root/firefox-clang/dom/media/webrtc/transport/third_party/nrappkit/src/log -I /root/firefox-clang/dom/media/webrtc/transport/third_party/nrappkit/src/plugin -I /root/firefox-clang/dom/media/webrtc/transport/third_party/nrappkit/src/registry -I /root/firefox-clang/dom/media/webrtc/transport/third_party/nrappkit/src/share -I /root/firefox-clang/dom/media/webrtc/transport/third_party/nrappkit/src/stats -I /root/firefox-clang/dom/media/webrtc/transport/third_party/nrappkit/src/util -I /root/firefox-clang/dom/media/webrtc/transport/third_party/nrappkit/src/util/libekr -I /root/firefox-clang/dom/media/webrtc/transport/third_party/nrappkit/src/port/generic/include -I /root/firefox-clang/dom/media/webrtc/transport/third_party/nICEr/src/crypto -I /root/firefox-clang/dom/media/webrtc/transport/third_party/nICEr/src/ice -I /root/firefox-clang/dom/media/webrtc/transport/third_party/nICEr/src/net -I /root/firefox-clang/dom/media/webrtc/transport/third_party/nICEr/src/stun -I /root/firefox-clang/dom/media/webrtc/transport/third_party/nICEr/src/util -I /root/firefox-clang/dom/media/webrtc/transport/third_party/nrappkit/src/port/linux/include -I /root/firefox-clang/obj-x86_64-pc-linux-gnu/ipc/ipdl/_ipdlheaders -I /root/firefox-clang/ipc/chromium/src -I /root/firefox-clang/obj-x86_64-pc-linux-gnu/dist/include -D MOZILLA_CLIENT -internal-isystem /usr/lib/llvm-21/lib/clang/21/include -internal-isystem /usr/local/include -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/14/../../../../x86_64-linux-gnu/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -O2 -Wno-error=tautological-type-limit-compare -Wno-range-loop-analysis -Wno-error=deprecated-declarations -Wno-error=array-bounds -Wno-error=free-nonheap-object -Wno-error=atomic-alignment -Wno-error=deprecated-builtins -Wno-psabi -Wno-error=builtin-macro-redefined -Wno-unknown-warning-option -Wno-parentheses -Wno-strict-prototypes -Wno-format -Wno-format-security -ferror-limit 19 -fstrict-flex-arrays=1 -stack-protector 2 -fstack-clash-protection -ftrivial-auto-var-init=pattern -fgnuc-version=4.2.1 -fskip-odr-check-in-gmf -vectorize-loops -vectorize-slp -analyzer-checker optin.performance.Padding -analyzer-output=html -analyzer-config stable-report-filename=true -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /tmp/scan-build-2025-06-27-100320-3286336-1 -x c Unified_c_third_party_nICEr1.c
1/*
2Copyright (c) 2007, Adobe Systems, Incorporated
3All rights reserved.
4
5Redistribution and use in source and binary forms, with or without
6modification, are permitted provided that the following conditions are
7met:
8
9* Redistributions of source code must retain the above copyright
10 notice, this list of conditions and the following disclaimer.
11
12* Redistributions in binary form must reproduce the above copyright
13 notice, this list of conditions and the following disclaimer in the
14 documentation and/or other materials provided with the distribution.
15
16* Neither the name of Adobe Systems, Network Resonance nor the names of its
17 contributors may be used to endorse or promote products derived from
18 this software without specific prior written permission.
19
20THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31*/
32
33#include <string.h>
34#include <assert.h>
35
36#include "nr_api.h"
37#include "stun.h"
38
39static int nr_stun_server_destroy_client(nr_stun_server_client *clnt);
40static int nr_stun_server_send_response(nr_stun_server_ctx *ctx, nr_socket *sock, nr_transport_addr *peer_addr, nr_stun_message *res, nr_stun_server_client *clnt);
41static int nr_stun_server_process_request_auth_checks(nr_stun_server_ctx *ctx, nr_stun_message *req, int auth_rule, nr_stun_message *res);
42
43
44int nr_stun_server_ctx_create(char *label, nr_stun_server_ctx **ctxp)
45 {
46 int r,_status;
47 nr_stun_server_ctx *ctx=0;
48
49 if ((r=nr_stun_startup()))
50 ABORT(r)do { int _r=r; if(!_r) _r=-1; ; _status=_r; goto abort;} while
(0)
;
51
52 if(!(ctx=RCALLOC(sizeof(nr_stun_server_ctx))r_calloc(0,1,sizeof(nr_stun_server_ctx))))
53 ABORT(R_NO_MEMORY)do { int _r=1; if(!_r) _r=-1; ; _status=_r; goto abort;} while
(0)
;
54
55 if(!(ctx->label=r_strdup(label)))
56 ABORT(R_NO_MEMORY)do { int _r=1; if(!_r) _r=-1; ; _status=_r; goto abort;} while
(0)
;
57
58 STAILQ_INIT(&ctx->clients)do { (((&ctx->clients))->stqh_first) = ((void*)0); (
&ctx->clients)->stqh_last = &(((&ctx->clients
))->stqh_first); } while (0)
;
59
60 *ctxp=ctx;
61
62 _status=0;
63 abort:
64 return(_status);
65 }
66
67int nr_stun_server_ctx_destroy(nr_stun_server_ctx **ctxp)
68 {
69 nr_stun_server_ctx *ctx;
70 nr_stun_server_client *clnt1,*clnt2;
71
72 if(!ctxp || !*ctxp)
73 return(0);
74
75 ctx=*ctxp;
76
77 STAILQ_FOREACH_SAFE(clnt1, &ctx->clients, entry, clnt2)for ((clnt1) = (((&ctx->clients))->stqh_first); (clnt1
) && ((clnt2) = (((clnt1))->entry.stqe_next), 1); (
clnt1) = (clnt2))
{
78 nr_stun_server_destroy_client(clnt1);
79 }
80
81 nr_stun_server_destroy_client(ctx->default_client);
82
83 RFREE(ctx->label)if(ctx->label) r_free(ctx->label);
84 RFREE(ctx)if(ctx) r_free(ctx);
85
86 return(0);
87 }
88
89static int nr_stun_server_client_create(nr_stun_server_ctx *ctx, char *client_label, char *user, Data *pass, nr_stun_server_cb cb, void *cb_arg, nr_stun_server_client **clntp)
90 {
91 nr_stun_server_client *clnt=0;
92 int r,_status;
93
94 if(!(clnt=RCALLOC(sizeof(nr_stun_server_client))r_calloc(0,1,sizeof(nr_stun_server_client))))
95 ABORT(R_NO_MEMORY)do { int _r=1; if(!_r) _r=-1; ; _status=_r; goto abort;} while
(0)
;
96
97 if(!(clnt->label=r_strdup(client_label)))
98 ABORT(R_NO_MEMORY)do { int _r=1; if(!_r) _r=-1; ; _status=_r; goto abort;} while
(0)
;
99
100 if(!(clnt->username=r_strdup(user)))
101 ABORT(R_NO_MEMORY)do { int _r=1; if(!_r) _r=-1; ; _status=_r; goto abort;} while
(0)
;
102
103 if(r=r_data_copy(&clnt->password,pass))
104 ABORT(r)do { int _r=r; if(!_r) _r=-1; ; _status=_r; goto abort;} while
(0)
;
105
106 r_log(NR_LOG_STUN,LOG_DEBUG7,"STUN-SERVER(%s)/CLIENT(%s): Adding client for %s",ctx->label, client_label, user);
107 clnt->stun_server_cb=cb;
108 clnt->cb_arg=cb_arg;
109
110 *clntp = clnt;
111 _status=0;
112 abort:
113 if(_status){
114 nr_stun_server_destroy_client(clnt);
115 }
116 return(_status);
117 }
118
119int nr_stun_server_add_client(nr_stun_server_ctx *ctx, char *client_label, char *user, Data *pass, nr_stun_server_cb cb, void *cb_arg)
120 {
121 int r,_status;
122 nr_stun_server_client *clnt;
123
124 if (r=nr_stun_server_client_create(ctx, client_label, user, pass, cb, cb_arg, &clnt))
125 ABORT(r)do { int _r=r; if(!_r) _r=-1; ; _status=_r; goto abort;} while
(0)
;
126
127 STAILQ_INSERT_TAIL(&ctx->clients,clnt,entry)do { (((clnt))->entry.stqe_next) = ((void*)0); *(&ctx->
clients)->stqh_last = (clnt); (&ctx->clients)->stqh_last
= &(((clnt))->entry.stqe_next); } while (0)
;
128
129 _status=0;
130 abort:
131 return(_status);
132 }
133
134int nr_stun_server_add_default_client(nr_stun_server_ctx *ctx, char *ufrag, Data *pass, nr_stun_server_cb cb, void *cb_arg)
135 {
136 int r,_status;
137 nr_stun_server_client *clnt;
138
139 assert(!ctx->default_client)((void) sizeof ((!ctx->default_client) ? 1 : 0), __extension__
({ if (!ctx->default_client) ; else __assert_fail ("!ctx->default_client"
, "/root/firefox-clang/dom/media/webrtc/transport/third_party/nICEr/src/stun/stun_server_ctx.c"
, 139, __extension__ __PRETTY_FUNCTION__); }))
;
140 if (ctx->default_client)
141 ABORT(R_INTERNAL)do { int _r=3; if(!_r) _r=-1; ; _status=_r; goto abort;} while
(0)
;
142
143 if (r=nr_stun_server_client_create(ctx, "default_client", ufrag, pass, cb, cb_arg, &clnt))
144 ABORT(r)do { int _r=r; if(!_r) _r=-1; ; _status=_r; goto abort;} while
(0)
;
145
146 ctx->default_client = clnt;
147
148 _status=0;
149 abort:
150 return(_status);
151 }
152
153int nr_stun_server_remove_client(nr_stun_server_ctx *ctx, void *cb_arg)
154 {
155 nr_stun_server_client *clnt1,*clnt2;
156 int found = 0;
157
158 STAILQ_FOREACH_SAFE(clnt1, &ctx->clients, entry, clnt2)for ((clnt1) = (((&ctx->clients))->stqh_first); (clnt1
) && ((clnt2) = (((clnt1))->entry.stqe_next), 1); (
clnt1) = (clnt2))
{
159 if(clnt1->cb_arg == cb_arg) {
160 STAILQ_REMOVE(&ctx->clients, clnt1, nr_stun_server_client_, entry)do { if ((((&ctx->clients))->stqh_first) == (clnt1)
) { do { if ((((((&ctx->clients)))->stqh_first) = (
(((((&ctx->clients)))->stqh_first))->entry.stqe_next
)) == ((void*)0)) ((&ctx->clients))->stqh_last = &
((((&ctx->clients)))->stqh_first); } while (0); } else
{ struct nr_stun_server_client_ *curelm = (((&ctx->clients
))->stqh_first); while (((curelm)->entry.stqe_next) != (
clnt1)) curelm = ((curelm)->entry.stqe_next); if ((((curelm
)->entry.stqe_next) = ((((curelm)->entry.stqe_next))->
entry.stqe_next)) == ((void*)0)) (&ctx->clients)->stqh_last
= &(((curelm))->entry.stqe_next); } } while (0)
;
161 nr_stun_server_destroy_client(clnt1);
162 found++;
163 }
164 }
165
166 if (!found)
167 ERETURN(R_NOT_FOUND)do {int _r=2; if(!_r) _r=-1; ; return(_r);} while(0);
168
169 return 0;
170 }
171
172static int nr_stun_server_get_password(void *arg, nr_stun_message *msg, Data **password)
173 {
174 int _status;
175 nr_stun_server_ctx *ctx = (nr_stun_server_ctx*)arg;
176 nr_stun_server_client *clnt = 0;
177 nr_stun_message_attribute *username_attribute;
178
179 if ((nr_stun_get_message_client(ctx, msg, &clnt))) {
180 if (! nr_stun_message_has_attribute(msg, NR_STUN_ATTR_USERNAME0x0006, &username_attribute)) {
181 r_log(NR_LOG_STUN,LOG_WARNING4,"STUN-SERVER(%s): Missing Username",ctx->label);
182 ABORT(R_NOT_FOUND)do { int _r=2; if(!_r) _r=-1; ; _status=_r; goto abort;} while
(0)
;
183 }
184
185 /* Although this is an exceptional condition, we'll already have seen a
186 * NOTICE-level log message about the unknown user, so additional log
187 * messages at any level higher than DEBUG are unnecessary. */
188
189 r_log(NR_LOG_STUN,LOG_DEBUG7,"STUN-SERVER(%s): Unable to find password for unknown user: %s",ctx->label,username_attribute->u.username);
190 ABORT(R_NOT_FOUND)do { int _r=2; if(!_r) _r=-1; ; _status=_r; goto abort;} while
(0)
;
191 }
192
193 *password = &clnt->password;
194
195 _status=0;
196 abort:
197 return(_status);
198 }
199
200int nr_stun_server_process_request_auth_checks(nr_stun_server_ctx *ctx, nr_stun_message *req, int auth_rule, nr_stun_message *res)
201 {
202 int r,_status;
203
204 if (nr_stun_message_has_attribute(req, NR_STUN_ATTR_MESSAGE_INTEGRITY0x0008, 0)
205 || !(auth_rule & NR_STUN_AUTH_RULE_OPTIONAL(1<<0))) {
206 /* favor long term credentials over short term, if both are supported */
207
208 if (auth_rule & NR_STUN_AUTH_RULE_LONG_TERM(1<<9)) {
209 if ((r=nr_stun_receive_request_long_term_auth(req, ctx, res)))
210 ABORT(r)do { int _r=r; if(!_r) _r=-1; ; _status=_r; goto abort;} while
(0)
;
211 }
212 else if (auth_rule & NR_STUN_AUTH_RULE_SHORT_TERM(1<<8)) {
213 if ((r=nr_stun_receive_request_or_indication_short_term_auth(req, res)))
214 ABORT(r)do { int _r=r; if(!_r) _r=-1; ; _status=_r; goto abort;} while
(0)
;
215 }
216 }
217
218 _status=0;
219 abort:
220 return(_status);
221 }
222
223int nr_stun_server_process_request(nr_stun_server_ctx *ctx, nr_socket *sock, char *msg, int len, nr_transport_addr *peer_addr, int auth_rule)
224 {
225 int r,_status;
226 char string[256];
227 nr_stun_message *req = 0;
228 nr_stun_message *res = 0;
229 nr_stun_server_client *clnt = 0;
230 nr_stun_server_request info;
231 int error;
232 int dont_free = 0;
233 nr_transport_addr my_addr;
234
235 if ((r=nr_socket_getaddr(sock, &my_addr))) {
236 ABORT(r)do { int _r=r; if(!_r) _r=-1; ; _status=_r; goto abort;} while
(0)
;
237 }
238
239 r_log(NR_LOG_STUN,LOG_DEBUG7,"STUN-SERVER(%s): Received(my_addr=%s,peer_addr=%s)",ctx->label,my_addr.as_string,peer_addr->as_string);
240
241 snprintf(string, sizeof(string)-1, "STUN-SERVER(%s): Received ", ctx->label);
242 r_dump(NR_LOG_STUN, LOG_DEBUG7, string, (char*)msg, len);
243
244 memset(&info,0,sizeof(info));
245
246 if ((r=nr_stun_message_create2(&req, (UCHAR*)msg, len)))
247 ABORT(r)do { int _r=r; if(!_r) _r=-1; ; _status=_r; goto abort;} while
(0)
;
248
249 if ((r=nr_stun_message_create(&res)))
250 ABORT(r)do { int _r=r; if(!_r) _r=-1; ; _status=_r; goto abort;} while
(0)
;
251
252 if ((r=nr_stun_decode_message(req, nr_stun_server_get_password, ctx))) {
253 /* RFC5389 S 7.3 says "If any errors are detected, the message is
254 * silently discarded." */
255#ifndef USE_STUN_PEDANTIC1
256 /* ... but that seems like a bad idea, at least return a 400 so
257 * that the server isn't a black hole to the client */
258 nr_stun_form_error_response(req, res, 400, "Bad Request - Failed to decode request");
259 ABORT(R_ALREADY)do { int _r=4; if(!_r) _r=-1; ; _status=_r; goto abort;} while
(0)
;
260#endif /* USE_STUN_PEDANTIC */
261 ABORT(R_REJECTED)do { int _r=11; if(!_r) _r=-1; ; _status=_r; goto abort;} while
(0)
;
262 }
263
264 if ((r=nr_stun_receive_message(0, req))) {
265 /* RFC5389 S 7.3 says "If any errors are detected, the message is
266 * silently discarded." */
267#ifndef USE_STUN_PEDANTIC1
268 /* ... but that seems like a bad idea, at least return a 400 so
269 * that the server isn't a black hole to the client */
270 nr_stun_form_error_response(req, res, 400, "Bad Request - Section 7.3 check failed");
271 ABORT(R_ALREADY)do { int _r=4; if(!_r) _r=-1; ; _status=_r; goto abort;} while
(0)
;
272#endif /* USE_STUN_PEDANTIC */
273 ABORT(R_REJECTED)do { int _r=11; if(!_r) _r=-1; ; _status=_r; goto abort;} while
(0)
;
274 }
275
276 if (NR_STUN_GET_TYPE_CLASS(req->header.type)((((req->header.type) >> 7) & 0x002) | (((req->
header.type) >> 4) & 0x001))
!= NR_CLASS_REQUEST0x0
277 && NR_STUN_GET_TYPE_CLASS(req->header.type)((((req->header.type) >> 7) & 0x002) | (((req->
header.type) >> 4) & 0x001))
!= NR_CLASS_INDICATION0x1) {
278 r_log(NR_LOG_STUN,LOG_WARNING4,"STUN-SERVER(%s): Illegal message type: %04x",ctx->label,req->header.type);
279 /* RFC5389 S 7.3 says "If any errors are detected, the message is
280 * silently discarded." */
281#ifndef USE_STUN_PEDANTIC1
282 /* ... but that seems like a bad idea, at least return a 400 so
283 * that the server isn't a black hole to the client */
284 nr_stun_form_error_response(req, res, 400, "Bad Request - Unsupported message type");
285 ABORT(R_ALREADY)do { int _r=4; if(!_r) _r=-1; ; _status=_r; goto abort;} while
(0)
;
286#endif /* USE_STUN_PEDANTIC */
287 ABORT(R_REJECTED)do { int _r=11; if(!_r) _r=-1; ; _status=_r; goto abort;} while
(0)
;
288 }
289
290 /* "The STUN agent then does any checks that are required by a
291 * authentication mechanism that the usage has specified" */
292 if ((r=nr_stun_server_process_request_auth_checks(ctx, req, auth_rule, res)))
293 ABORT(r)do { int _r=r; if(!_r) _r=-1; ; _status=_r; goto abort;} while
(0)
;
294
295 if (NR_STUN_GET_TYPE_CLASS(req->header.type)((((req->header.type) >> 7) & 0x002) | (((req->
header.type) >> 4) & 0x001))
== NR_CLASS_INDICATION0x1) {
296 if ((r=nr_stun_process_indication(req)))
297 ABORT(r)do { int _r=r; if(!_r) _r=-1; ; _status=_r; goto abort;} while
(0)
;
298 }
299 else {
300 if ((r=nr_stun_process_request(req, res)))
301 ABORT(r)do { int _r=r; if(!_r) _r=-1; ; _status=_r; goto abort;} while
(0)
;
302 }
303
304 assert(res->header.type == 0)((void) sizeof ((res->header.type == 0) ? 1 : 0), __extension__
({ if (res->header.type == 0) ; else __assert_fail ("res->header.type == 0"
, "/root/firefox-clang/dom/media/webrtc/transport/third_party/nICEr/src/stun/stun_server_ctx.c"
, 304, __extension__ __PRETTY_FUNCTION__); }))
;
305
306 clnt = 0;
307 if (NR_STUN_GET_TYPE_CLASS(req->header.type)((((req->header.type) >> 7) & 0x002) | (((req->
header.type) >> 4) & 0x001))
== NR_CLASS_REQUEST0x0) {
308 if ((nr_stun_get_message_client(ctx, req, &clnt))) {
309 if ((r=nr_stun_form_success_response(req, peer_addr, 0, res)))
310 ABORT(r)do { int _r=r; if(!_r) _r=-1; ; _status=_r; goto abort;} while
(0)
;
311 }
312 else {
313 if ((r=nr_stun_form_success_response(req, peer_addr, &clnt->password, res)))
314 ABORT(r)do { int _r=r; if(!_r) _r=-1; ; _status=_r; goto abort;} while
(0)
;
315 }
316 }
317
318 if(clnt && clnt->stun_server_cb){
319 r_log(NR_LOG_STUN,LOG_DEBUG7,"Entering STUN server callback");
320
321 /* Set up the info */
322 if(r=nr_transport_addr_copy(&info.src_addr,peer_addr))
323 ABORT(r)do { int _r=r; if(!_r) _r=-1; ; _status=_r; goto abort;} while
(0)
;
324
325 info.request = req;
326 info.response = res;
327
328 error = 0;
329 dont_free = 0;
330 if (clnt->stun_server_cb(clnt->cb_arg,ctx,sock,&info,&dont_free,&error)) {
331 if (error == 0)
332 error = 500;
333
334 nr_stun_form_error_response(req, res, error, "ICE Failure");
335 ABORT(R_ALREADY)do { int _r=4; if(!_r) _r=-1; ; _status=_r; goto abort;} while
(0)
;
336 }
337 }
338
339 _status=0;
340 abort:
341 if (!res)
342 goto skip_response;
343
344 if (NR_STUN_GET_TYPE_CLASS(req->header.type)((((req->header.type) >> 7) & 0x002) | (((req->
header.type) >> 4) & 0x001))
== NR_CLASS_INDICATION0x1)
345 goto skip_response;
346
347 /* Now respond */
348
349 if (_status != 0 && ! nr_stun_message_has_attribute(res, NR_STUN_ATTR_ERROR_CODE0x0009, 0))
350 nr_stun_form_error_response(req, res, 500, "Failed to specify error");
351
352 if ((r=nr_stun_server_send_response(ctx, sock, peer_addr, res, clnt))) {
Although the value stored to 'r' is used in the enclosing expression, the value is never actually read from 'r'
353 r_log(NR_LOG_STUN,LOG_ERR3,"STUN-SERVER(label=%s): Failed sending response (my_addr=%s,peer_addr=%s)",ctx->label,my_addr.as_string,peer_addr->as_string);
354 _status = R_FAILED10;
355 }
356
357#if 0
358 /* EKR: suppressed these checks because if you have an error when
359 you are sending an error, things go wonky */
360#ifdef SANITY_CHECKS1
361 if (_status == R_ALREADY4) {
362 assert(NR_STUN_GET_TYPE_CLASS(res->header.type) == NR_CLASS_ERROR_RESPONSE)((void) sizeof ((((((res->header.type) >> 7) & 0x002
) | (((res->header.type) >> 4) & 0x001)) == 0x3)
? 1 : 0), __extension__ ({ if (((((res->header.type) >>
7) & 0x002) | (((res->header.type) >> 4) & 0x001
)) == 0x3) ; else __assert_fail ("NR_STUN_GET_TYPE_CLASS(res->header.type) == NR_CLASS_ERROR_RESPONSE"
, "/root/firefox-clang/dom/media/webrtc/transport/third_party/nICEr/src/stun/stun_server_ctx.c"
, 362, __extension__ __PRETTY_FUNCTION__); }))
;
363 assert(nr_stun_message_has_attribute(res, NR_STUN_ATTR_ERROR_CODE, 0))((void) sizeof ((nr_stun_message_has_attribute(res, 0x0009, 0
)) ? 1 : 0), __extension__ ({ if (nr_stun_message_has_attribute
(res, 0x0009, 0)) ; else __assert_fail ("nr_stun_message_has_attribute(res, NR_STUN_ATTR_ERROR_CODE, 0)"
, "/root/firefox-clang/dom/media/webrtc/transport/third_party/nICEr/src/stun/stun_server_ctx.c"
, 363, __extension__ __PRETTY_FUNCTION__); }))
;
364 }
365 else {
366 assert(NR_STUN_GET_TYPE_CLASS(res->header.type) == NR_CLASS_RESPONSE)((void) sizeof ((((((res->header.type) >> 7) & 0x002
) | (((res->header.type) >> 4) & 0x001)) == 0x2)
? 1 : 0), __extension__ ({ if (((((res->header.type) >>
7) & 0x002) | (((res->header.type) >> 4) & 0x001
)) == 0x2) ; else __assert_fail ("NR_STUN_GET_TYPE_CLASS(res->header.type) == NR_CLASS_RESPONSE"
, "/root/firefox-clang/dom/media/webrtc/transport/third_party/nICEr/src/stun/stun_server_ctx.c"
, 366, __extension__ __PRETTY_FUNCTION__); }))
;
367 assert(!nr_stun_message_has_attribute(res, NR_STUN_ATTR_ERROR_CODE, 0))((void) sizeof ((!nr_stun_message_has_attribute(res, 0x0009, 0
)) ? 1 : 0), __extension__ ({ if (!nr_stun_message_has_attribute
(res, 0x0009, 0)) ; else __assert_fail ("!nr_stun_message_has_attribute(res, NR_STUN_ATTR_ERROR_CODE, 0)"
, "/root/firefox-clang/dom/media/webrtc/transport/third_party/nICEr/src/stun/stun_server_ctx.c"
, 367, __extension__ __PRETTY_FUNCTION__); }))
;
368 }
369#endif /* SANITY_CHECKS */
370#endif
371
372 if (0) {
373 skip_response:
374 _status = 0;
375 }
376
377 if (!dont_free) {
378 nr_stun_message_destroy(&res);
379 nr_stun_message_destroy(&req);
380 }
381
382 return(_status);
383 }
384
385static int nr_stun_server_send_response(nr_stun_server_ctx *ctx, nr_socket *sock, nr_transport_addr *peer_addr, nr_stun_message *res, nr_stun_server_client *clnt)
386 {
387 int r,_status;
388 char string[256];
389 nr_transport_addr my_addr;
390
391 if ((r=nr_socket_getaddr(sock, &my_addr))) {
392 ABORT(r)do { int _r=r; if(!_r) _r=-1; ; _status=_r; goto abort;} while
(0)
;
393 }
394
395 r_log(NR_LOG_STUN,LOG_DEBUG7,"STUN-SERVER(label=%s): Sending(my_addr=%s,peer_addr=%s)",ctx->label,my_addr.as_string,peer_addr->as_string);
396
397 if ((r=nr_stun_encode_message(res))) {
398 /* should never happen */
399 r_log(NR_LOG_STUN,LOG_ERR3,"STUN-SERVER(label=%s): Unable to encode message", ctx->label);
400 }
401 else {
402 snprintf(string, sizeof(string)-1, "STUN(%s): Sending to %s ", ctx->label, peer_addr->as_string);
403 r_dump(NR_LOG_STUN, LOG_DEBUG7, string, (char*)res->buffer, res->length);
404
405 if(r=nr_socket_sendto(sock,res->buffer,res->length,0,peer_addr))
406 ABORT(r)do { int _r=r; if(!_r) _r=-1; ; _status=_r; goto abort;} while
(0)
;
407 }
408
409 _status=0;
410 abort:
411 return(_status);
412 }
413
414static int nr_stun_server_destroy_client(nr_stun_server_client *clnt)
415 {
416 if (!clnt)
417 return 0;
418
419 RFREE(clnt->label)if(clnt->label) r_free(clnt->label);
420 RFREE(clnt->username)if(clnt->username) r_free(clnt->username);
421 r_data_zfree(&clnt->password);
422
423 RFREE(clnt)if(clnt) r_free(clnt);
424 return(0);
425 }
426
427int nr_stun_get_message_client(nr_stun_server_ctx *ctx, nr_stun_message *req, nr_stun_server_client **out)
428 {
429 int _status;
430 nr_stun_message_attribute *attr;
431 nr_stun_server_client *clnt=0;
432
433 if (! nr_stun_message_has_attribute(req, NR_STUN_ATTR_USERNAME0x0006, &attr)) {
434 r_log(NR_LOG_STUN,LOG_WARNING4,"STUN-SERVER(%s): Missing Username",ctx->label);
435 ABORT(R_NOT_FOUND)do { int _r=2; if(!_r) _r=-1; ; _status=_r; goto abort;} while
(0)
;
436 }
437
438 STAILQ_FOREACH(clnt, &ctx->clients, entry)for((clnt) = (((&ctx->clients))->stqh_first); (clnt
); (clnt) = (((clnt))->entry.stqe_next))
{
439 if (!strncmp(clnt->username, attr->u.username,
440 sizeof(attr->u.username)))
441 break;
442 }
443
444 if (!clnt && ctx->default_client) {
445 /* If we can't find a specific client see if this matches the default,
446 which means that the username starts with our ufrag.
447 */
448 char *colon = strchr(attr->u.username, ':');
449 if (colon && !strncmp(ctx->default_client->username,
450 attr->u.username,
451 colon - attr->u.username)) {
452 clnt = ctx->default_client;
453 r_log(NR_LOG_STUN,LOG_NOTICE5,"STUN-SERVER(%s): Falling back to default client, username=: %s",ctx->label,attr->u.username);
454 }
455 }
456
457 if (!clnt) {
458 r_log(NR_LOG_STUN,LOG_WARNING4,"STUN-SERVER(%s): Request from unknown user: %s",ctx->label,attr->u.username);
459 ABORT(R_NOT_FOUND)do { int _r=2; if(!_r) _r=-1; ; _status=_r; goto abort;} while
(0)
;
460 }
461
462 *out = clnt;
463
464 _status=0;
465 abort:
466 return(_status);
467 }
468