@@ -47,6 +47,12 @@ struct sip_ccert {
47
47
};
48
48
49
49
50
+ struct ccert_data {
51
+ uint32_t hsup ;
52
+ struct sip_ccert * ccert ;
53
+ };
54
+
55
+
50
56
struct sip_transport {
51
57
struct le le ;
52
58
struct sa laddr ;
@@ -191,6 +197,33 @@ static const struct sip_transport *transp_find(struct sip *sip,
191
197
}
192
198
193
199
200
+ static struct le * transp_apply_all (struct sip * sip , enum sip_transp tp , int af ,
201
+ list_apply_h ah , void * arg )
202
+ {
203
+ struct le * le ;
204
+
205
+ if (!ah )
206
+ return NULL ;
207
+
208
+ for (le = sip -> transpl .head ; le ; le = le -> next ) {
209
+
210
+ const struct sip_transport * transp = le -> data ;
211
+ const struct sa * laddr = & transp -> laddr ;
212
+
213
+ if (transp -> tp != tp )
214
+ continue ;
215
+
216
+ if (af != AF_UNSPEC && sa_af (laddr ) != af )
217
+ continue ;
218
+
219
+ if (ah (le , arg ))
220
+ return le ;
221
+ }
222
+
223
+ return NULL ;
224
+ }
225
+
226
+
194
227
static struct sip_conn * conn_find (struct sip * sip , const struct sa * paddr ,
195
228
bool secure )
196
229
{
@@ -1401,6 +1434,27 @@ int sip_transp_add_websock(struct sip *sip, enum sip_transp tp,
1401
1434
}
1402
1435
1403
1436
1437
+ static bool add_ccert (struct le * le , void * arg )
1438
+ {
1439
+ const struct sip_transport * transp = le -> data ;
1440
+ struct ccert_data * cc = arg ;
1441
+
1442
+ if (!cc -> ccert -> he .list )
1443
+ hash_append (transp -> ht_ccert , cc -> hsup , & cc -> ccert -> he ,
1444
+ cc -> ccert );
1445
+ else {
1446
+ struct sip_ccert * ccert = mem_zalloc (sizeof (* ccert ), NULL );
1447
+ if (!ccert )
1448
+ return false;
1449
+
1450
+ ccert -> file = cc -> ccert -> file ;
1451
+ hash_append (transp -> ht_ccert , cc -> hsup , & ccert -> he , ccert );
1452
+ }
1453
+
1454
+ return false;
1455
+ }
1456
+
1457
+
1404
1458
/**
1405
1459
* Add a client certificate to the TLS transport object
1406
1460
* Client certificates are saved as hash-table.
@@ -1416,10 +1470,9 @@ int sip_transp_add_ccert(struct sip *sip, const struct uri *uri,
1416
1470
const char * cert )
1417
1471
{
1418
1472
int err = 0 ;
1419
- const struct sip_transport * transp = NULL ;
1420
1473
struct sip_ccert * ccert = NULL ;
1474
+ struct ccert_data cc_data ;
1421
1475
struct mbuf * sup = NULL ;
1422
- uint32_t hsup = 0 ;
1423
1476
1424
1477
if (!sip || !uri || !cert )
1425
1478
return EINVAL ;
@@ -1435,30 +1488,20 @@ int sip_transp_add_ccert(struct sip *sip, const struct uri *uri,
1435
1488
1436
1489
mbuf_set_pos (sup , 0 );
1437
1490
1438
- hsup = hash_joaat (mbuf_buf (sup ), mbuf_get_left (sup ));
1439
- transp = transp_find (sip , SIP_TRANSP_TLS , AF_INET , NULL );
1440
- if (transp ) {
1441
- ccert = mem_zalloc (sizeof (* ccert ), NULL );
1442
- if (!ccert ) {
1443
- err = ENOMEM ;
1444
- goto out ;
1445
- }
1446
-
1447
- pl_set_str (& ccert -> file , cert );
1448
- hash_append (transp -> ht_ccert , hsup , & ccert -> he , ccert );
1491
+ ccert = mem_zalloc (sizeof (* ccert ), NULL );
1492
+ if (!ccert ) {
1493
+ err = ENOMEM ;
1494
+ goto out ;
1449
1495
}
1496
+ pl_set_str (& ccert -> file , cert );
1450
1497
1451
- transp = transp_find (sip , SIP_TRANSP_TLS , AF_INET6 , NULL );
1452
- if (transp ) {
1453
- ccert = mem_zalloc (sizeof (* ccert ), NULL );
1454
- if (!ccert ) {
1455
- err = ENOMEM ;
1456
- goto out ;
1457
- }
1498
+ cc_data .hsup = hash_joaat (mbuf_buf (sup ), mbuf_get_left (sup ));
1499
+ cc_data .ccert = ccert ;
1458
1500
1459
- pl_set_str (& ccert -> file , cert );
1460
- hash_append (transp -> ht_ccert , hsup , & ccert -> he , ccert );
1461
- }
1501
+ (void )transp_apply_all (sip , SIP_TRANSP_TLS , AF_INET , add_ccert ,
1502
+ & cc_data );
1503
+ (void )transp_apply_all (sip , SIP_TRANSP_TLS , AF_INET6 , add_ccert ,
1504
+ & cc_data );
1462
1505
1463
1506
out :
1464
1507
mem_deref (sup );
0 commit comments