afs: Fix the non-encryption of calls
Some AFS servers refuse to accept unencrypted traffic, so can't be accessed with kAFS. Set the AF_RXRPC security level to encrypt client calls to deal with this. Note that incoming service calls are set by the remote client and so aren't affected by this. This requires an AF_RXRPC patch to pass the value set by setsockopt to calls begun by the kernel. Signed-off-by: David Howells <dhowells@redhat.com>
This commit is contained in:
Родитель
428edade4e
Коммит
4776cab43f
|
@ -41,6 +41,7 @@ int afs_open_socket(struct afs_net *net)
|
||||||
{
|
{
|
||||||
struct sockaddr_rxrpc srx;
|
struct sockaddr_rxrpc srx;
|
||||||
struct socket *socket;
|
struct socket *socket;
|
||||||
|
unsigned int min_level;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
_enter("");
|
_enter("");
|
||||||
|
@ -60,6 +61,12 @@ int afs_open_socket(struct afs_net *net)
|
||||||
srx.transport.sin6.sin6_family = AF_INET6;
|
srx.transport.sin6.sin6_family = AF_INET6;
|
||||||
srx.transport.sin6.sin6_port = htons(AFS_CM_PORT);
|
srx.transport.sin6.sin6_port = htons(AFS_CM_PORT);
|
||||||
|
|
||||||
|
min_level = RXRPC_SECURITY_ENCRYPT;
|
||||||
|
ret = kernel_setsockopt(socket, SOL_RXRPC, RXRPC_MIN_SECURITY_LEVEL,
|
||||||
|
(void *)&min_level, sizeof(min_level));
|
||||||
|
if (ret < 0)
|
||||||
|
goto error_2;
|
||||||
|
|
||||||
ret = kernel_bind(socket, (struct sockaddr *) &srx, sizeof(srx));
|
ret = kernel_bind(socket, (struct sockaddr *) &srx, sizeof(srx));
|
||||||
if (ret == -EADDRINUSE) {
|
if (ret == -EADDRINUSE) {
|
||||||
srx.transport.sin6.sin6_port = 0;
|
srx.transport.sin6.sin6_port = 0;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче