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