}
/*
- * Set up a security descriptor
+ * Set up a security descriptor. Note that cell_name can be NULL (for instance
+ * if -noauth was passed).
*/
static struct kafs_security_handle *af_rxrpc_new_security(
struct kafs_transport_handle *transport,
enum kafs_connection_auth_level level)
{
struct kafs_security_handle *security;
- size_t namelen = strlen(cell_name);
+ size_t namelen;
+
+ namelen = cell_name ? strlen(cell_name) : 0;
security = calloc(1, sizeof(*security) + namelen + 1);
if (!security)
break;
case kafs_connection_local_auth:
fprintf(stderr, "Local auth not supported by AF_RXRPC transport\n");
- errno = -EINVAL;
- free(security);
- return NULL;
+ goto inval;
case kafs_connection_clear:
+ if (!cell_name)
+ goto inval;
security->min_sec_level = RXRPC_SECURITY_PLAIN;
break;
case kafs_connection_integrity_only:
+ if (!cell_name)
+ goto inval;
security->min_sec_level = RXRPC_SECURITY_AUTH;
break;
case kafs_connection_encrypt:
+ if (!cell_name)
+ goto inval;
security->min_sec_level = RXRPC_SECURITY_ENCRYPT;
break;
}
- memcpy(security->cell_name, cell_name, namelen + 1);
+
+ if (cell_name)
+ memcpy(security->cell_name, cell_name, namelen + 1);
usage_get(&security->transport->usage);
return security;
+
+inval:
+ errno = -EINVAL;
+ free(security);
+ return NULL;
}
/*
errno = EINVAL;
return NULL;
}
-
+
conn = calloc(1, sizeof(*conn));
if (!conn)
return NULL;
conn->peer.transport_type = SOCK_DGRAM;
conn->peer.transport_len = salen;
memcpy(&conn->peer.transport, sa, salen);
-
+
/* Open up a socket for talking to the AF_RXRPC module */
conn->fd = socket(AF_RXRPC, SOCK_DGRAM, PF_INET);
if (conn->fd < 0)
goto error_conn;
}
- if (security) {
+ if (security->level != kafs_connection_no_auth) {
ret = setsockopt(conn->fd, SOL_RXRPC, RXRPC_MIN_SECURITY_LEVEL,
&security->min_sec_level,
sizeof(security->min_sec_level));
debug("Detected EOR\n");
call->known_to_kernel = 0;
}
-
+
for (cmsg = CMSG_FIRSTHDR(&msg); cmsg; cmsg = CMSG_NXTHDR(&msg, cmsg)) {
unsigned char *p;
int n;
int ret;
debug("-->poll()\n");
-
+
fds[0].fd = conn->fd;
fds[0].events = POLLIN;
fds[0].revents = 0;