|
@@ -45,6 +45,7 @@
|
|
#include <net/cipso_ipv4.h>
|
|
#include <net/cipso_ipv4.h>
|
|
#include <asm/atomic.h>
|
|
#include <asm/atomic.h>
|
|
#include <asm/bug.h>
|
|
#include <asm/bug.h>
|
|
|
|
+#include <asm/unaligned.h>
|
|
|
|
|
|
struct cipso_v4_domhsh_entry {
|
|
struct cipso_v4_domhsh_entry {
|
|
char *domain;
|
|
char *domain;
|
|
@@ -1000,7 +1001,7 @@ static int cipso_v4_map_cat_enum_valid(const struct cipso_v4_doi *doi_def,
|
|
return -EFAULT;
|
|
return -EFAULT;
|
|
|
|
|
|
for (iter = 0; iter < enumcat_len; iter += 2) {
|
|
for (iter = 0; iter < enumcat_len; iter += 2) {
|
|
- cat = ntohs(*((__be16 *)&enumcat[iter]));
|
|
|
|
|
|
+ cat = ntohs(get_unaligned((__be16 *)&enumcat[iter]));
|
|
if (cat <= cat_prev)
|
|
if (cat <= cat_prev)
|
|
return -EFAULT;
|
|
return -EFAULT;
|
|
cat_prev = cat;
|
|
cat_prev = cat;
|
|
@@ -1068,8 +1069,8 @@ static int cipso_v4_map_cat_enum_ntoh(const struct cipso_v4_doi *doi_def,
|
|
|
|
|
|
for (iter = 0; iter < net_cat_len; iter += 2) {
|
|
for (iter = 0; iter < net_cat_len; iter += 2) {
|
|
ret_val = netlbl_secattr_catmap_setbit(secattr->mls_cat,
|
|
ret_val = netlbl_secattr_catmap_setbit(secattr->mls_cat,
|
|
- ntohs(*((__be16 *)&net_cat[iter])),
|
|
|
|
- GFP_ATOMIC);
|
|
|
|
|
|
+ ntohs(get_unaligned((__be16 *)&net_cat[iter])),
|
|
|
|
+ GFP_ATOMIC);
|
|
if (ret_val != 0)
|
|
if (ret_val != 0)
|
|
return ret_val;
|
|
return ret_val;
|
|
}
|
|
}
|
|
@@ -1102,9 +1103,10 @@ static int cipso_v4_map_cat_rng_valid(const struct cipso_v4_doi *doi_def,
|
|
return -EFAULT;
|
|
return -EFAULT;
|
|
|
|
|
|
for (iter = 0; iter < rngcat_len; iter += 4) {
|
|
for (iter = 0; iter < rngcat_len; iter += 4) {
|
|
- cat_high = ntohs(*((__be16 *)&rngcat[iter]));
|
|
|
|
|
|
+ cat_high = ntohs(get_unaligned((__be16 *)&rngcat[iter]));
|
|
if ((iter + 4) <= rngcat_len)
|
|
if ((iter + 4) <= rngcat_len)
|
|
- cat_low = ntohs(*((__be16 *)&rngcat[iter + 2]));
|
|
|
|
|
|
+ cat_low = ntohs(
|
|
|
|
+ get_unaligned((__be16 *)&rngcat[iter + 2]));
|
|
else
|
|
else
|
|
cat_low = 0;
|
|
cat_low = 0;
|
|
|
|
|
|
@@ -1201,9 +1203,10 @@ static int cipso_v4_map_cat_rng_ntoh(const struct cipso_v4_doi *doi_def,
|
|
u16 cat_high;
|
|
u16 cat_high;
|
|
|
|
|
|
for (net_iter = 0; net_iter < net_cat_len; net_iter += 4) {
|
|
for (net_iter = 0; net_iter < net_cat_len; net_iter += 4) {
|
|
- cat_high = ntohs(*((__be16 *)&net_cat[net_iter]));
|
|
|
|
|
|
+ cat_high = ntohs(get_unaligned((__be16 *)&net_cat[net_iter]));
|
|
if ((net_iter + 4) <= net_cat_len)
|
|
if ((net_iter + 4) <= net_cat_len)
|
|
- cat_low = ntohs(*((__be16 *)&net_cat[net_iter + 2]));
|
|
|
|
|
|
+ cat_low = ntohs(
|
|
|
|
+ get_unaligned((__be16 *)&net_cat[net_iter + 2]));
|
|
else
|
|
else
|
|
cat_low = 0;
|
|
cat_low = 0;
|
|
|
|
|
|
@@ -1565,7 +1568,7 @@ int cipso_v4_validate(unsigned char **option)
|
|
}
|
|
}
|
|
|
|
|
|
rcu_read_lock();
|
|
rcu_read_lock();
|
|
- doi_def = cipso_v4_doi_search(ntohl(*((__be32 *)&opt[2])));
|
|
|
|
|
|
+ doi_def = cipso_v4_doi_search(ntohl(get_unaligned((__be32 *)&opt[2])));
|
|
if (doi_def == NULL) {
|
|
if (doi_def == NULL) {
|
|
err_offset = 2;
|
|
err_offset = 2;
|
|
goto validate_return_locked;
|
|
goto validate_return_locked;
|
|
@@ -1709,22 +1712,22 @@ void cipso_v4_error(struct sk_buff *skb, int error, u32 gateway)
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
- * cipso_v4_socket_setattr - Add a CIPSO option to a socket
|
|
|
|
- * @sock: the socket
|
|
|
|
|
|
+ * cipso_v4_sock_setattr - Add a CIPSO option to a socket
|
|
|
|
+ * @sk: the socket
|
|
* @doi_def: the CIPSO DOI to use
|
|
* @doi_def: the CIPSO DOI to use
|
|
* @secattr: the specific security attributes of the socket
|
|
* @secattr: the specific security attributes of the socket
|
|
*
|
|
*
|
|
* Description:
|
|
* Description:
|
|
* Set the CIPSO option on the given socket using the DOI definition and
|
|
* Set the CIPSO option on the given socket using the DOI definition and
|
|
* security attributes passed to the function. This function requires
|
|
* security attributes passed to the function. This function requires
|
|
- * exclusive access to @sock->sk, which means it either needs to be in the
|
|
|
|
- * process of being created or locked via lock_sock(sock->sk). Returns zero on
|
|
|
|
- * success and negative values on failure.
|
|
|
|
|
|
+ * exclusive access to @sk, which means it either needs to be in the
|
|
|
|
+ * process of being created or locked. Returns zero on success and negative
|
|
|
|
+ * values on failure.
|
|
*
|
|
*
|
|
*/
|
|
*/
|
|
-int cipso_v4_socket_setattr(const struct socket *sock,
|
|
|
|
- const struct cipso_v4_doi *doi_def,
|
|
|
|
- const struct netlbl_lsm_secattr *secattr)
|
|
|
|
|
|
+int cipso_v4_sock_setattr(struct sock *sk,
|
|
|
|
+ const struct cipso_v4_doi *doi_def,
|
|
|
|
+ const struct netlbl_lsm_secattr *secattr)
|
|
{
|
|
{
|
|
int ret_val = -EPERM;
|
|
int ret_val = -EPERM;
|
|
u32 iter;
|
|
u32 iter;
|
|
@@ -1732,7 +1735,6 @@ int cipso_v4_socket_setattr(const struct socket *sock,
|
|
u32 buf_len = 0;
|
|
u32 buf_len = 0;
|
|
u32 opt_len;
|
|
u32 opt_len;
|
|
struct ip_options *opt = NULL;
|
|
struct ip_options *opt = NULL;
|
|
- struct sock *sk;
|
|
|
|
struct inet_sock *sk_inet;
|
|
struct inet_sock *sk_inet;
|
|
struct inet_connection_sock *sk_conn;
|
|
struct inet_connection_sock *sk_conn;
|
|
|
|
|
|
@@ -1740,7 +1742,6 @@ int cipso_v4_socket_setattr(const struct socket *sock,
|
|
* defined yet but it is not a problem as the only users of these
|
|
* defined yet but it is not a problem as the only users of these
|
|
* "lite" PF_INET sockets are functions which do an accept() call
|
|
* "lite" PF_INET sockets are functions which do an accept() call
|
|
* afterwards so we will label the socket as part of the accept(). */
|
|
* afterwards so we will label the socket as part of the accept(). */
|
|
- sk = sock->sk;
|
|
|
|
if (sk == NULL)
|
|
if (sk == NULL)
|
|
return 0;
|
|
return 0;
|
|
|
|
|
|
@@ -1858,7 +1859,7 @@ int cipso_v4_sock_getattr(struct sock *sk, struct netlbl_lsm_secattr *secattr)
|
|
if (ret_val == 0)
|
|
if (ret_val == 0)
|
|
return ret_val;
|
|
return ret_val;
|
|
|
|
|
|
- doi = ntohl(*(__be32 *)&cipso_ptr[2]);
|
|
|
|
|
|
+ doi = ntohl(get_unaligned((__be32 *)&cipso_ptr[2]));
|
|
rcu_read_lock();
|
|
rcu_read_lock();
|
|
doi_def = cipso_v4_doi_search(doi);
|
|
doi_def = cipso_v4_doi_search(doi);
|
|
if (doi_def == NULL) {
|
|
if (doi_def == NULL) {
|
|
@@ -1891,29 +1892,6 @@ int cipso_v4_sock_getattr(struct sock *sk, struct netlbl_lsm_secattr *secattr)
|
|
return ret_val;
|
|
return ret_val;
|
|
}
|
|
}
|
|
|
|
|
|
-/**
|
|
|
|
- * cipso_v4_socket_getattr - Get the security attributes from a socket
|
|
|
|
- * @sock: the socket
|
|
|
|
- * @secattr: the security attributes
|
|
|
|
- *
|
|
|
|
- * Description:
|
|
|
|
- * Query @sock to see if there is a CIPSO option attached to the socket and if
|
|
|
|
- * there is return the CIPSO security attributes in @secattr. Returns zero on
|
|
|
|
- * success and negative values on failure.
|
|
|
|
- *
|
|
|
|
- */
|
|
|
|
-int cipso_v4_socket_getattr(const struct socket *sock,
|
|
|
|
- struct netlbl_lsm_secattr *secattr)
|
|
|
|
-{
|
|
|
|
- int ret_val;
|
|
|
|
-
|
|
|
|
- lock_sock(sock->sk);
|
|
|
|
- ret_val = cipso_v4_sock_getattr(sock->sk, secattr);
|
|
|
|
- release_sock(sock->sk);
|
|
|
|
-
|
|
|
|
- return ret_val;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
/**
|
|
/**
|
|
* cipso_v4_skbuff_getattr - Get the security attributes from the CIPSO option
|
|
* cipso_v4_skbuff_getattr - Get the security attributes from the CIPSO option
|
|
* @skb: the packet
|
|
* @skb: the packet
|
|
@@ -1936,7 +1914,7 @@ int cipso_v4_skbuff_getattr(const struct sk_buff *skb,
|
|
if (cipso_v4_cache_check(cipso_ptr, cipso_ptr[1], secattr) == 0)
|
|
if (cipso_v4_cache_check(cipso_ptr, cipso_ptr[1], secattr) == 0)
|
|
return 0;
|
|
return 0;
|
|
|
|
|
|
- doi = ntohl(*(__be32 *)&cipso_ptr[2]);
|
|
|
|
|
|
+ doi = ntohl(get_unaligned((__be32 *)&cipso_ptr[2]));
|
|
rcu_read_lock();
|
|
rcu_read_lock();
|
|
doi_def = cipso_v4_doi_search(doi);
|
|
doi_def = cipso_v4_doi_search(doi);
|
|
if (doi_def == NULL)
|
|
if (doi_def == NULL)
|