version 1.256, 2018/07/04 19:20:25 |
version 1.257, 2018/08/23 01:55:38 |
Line 3455 key_checkspidup(const struct secasindex |
|
Line 3455 key_checkspidup(const struct secasindex |
|
{ |
{ |
struct secashead *sah; |
struct secashead *sah; |
struct secasvar *sav; |
struct secasvar *sav; |
int s; |
|
|
|
/* check address family */ |
/* check address family */ |
if (saidx->src.sa.sa_family != saidx->dst.sa.sa_family) { |
if (saidx->src.sa.sa_family != saidx->dst.sa.sa_family) { |
Line 3466 key_checkspidup(const struct secasindex |
|
Line 3465 key_checkspidup(const struct secasindex |
|
} |
} |
|
|
/* check all SAD */ |
/* check all SAD */ |
s = pserialize_read_enter(); |
/* key_ismyaddr may sleep, so use mutex, not pserialize, here. */ |
SAHLIST_READER_FOREACH(sah) { |
mutex_enter(&key_sad.lock); |
|
SAHLIST_WRITER_FOREACH(sah) { |
if (!key_ismyaddr((struct sockaddr *)&sah->saidx.dst)) |
if (!key_ismyaddr((struct sockaddr *)&sah->saidx.dst)) |
continue; |
continue; |
sav = key_getsavbyspi(sah, spi); |
sav = key_getsavbyspi(sah, spi); |
if (sav != NULL) { |
if (sav != NULL) { |
pserialize_read_exit(s); |
|
KEY_SA_UNREF(&sav); |
KEY_SA_UNREF(&sav); |
|
mutex_exit(&key_sad.lock); |
return true; |
return true; |
} |
} |
} |
} |
pserialize_read_exit(s); |
mutex_exit(&key_sad.lock); |
|
|
return false; |
return false; |
} |
} |