Skip to content

Commit

Permalink
nfc: nci: constify several pointers to u8, sk_buff and other structs
Browse files Browse the repository at this point in the history
Several functions receive pointers to u8, sk_buff or other structs but
do not modify the contents so make them const.  This allows doing the
same for local variables and in total makes the code a little bit safer.

This makes const also data passed as "unsigned long opt" argument to
nci_request() function.  Usual flow for such functions is:
1. Receive "u8 *" and store it (the pointer) in a structure
   allocated on stack (e.g. struct nci_set_config_param),
2. Call nci_request() or __nci_request() passing a callback function an
   the pointer to the structure via an "unsigned long opt",
3. nci_request() calls the callback which dereferences "unsigned long
   opt" in a read-only way.

This converts all above paths to use proper pointer to const data, so
entire flow is safer.

Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
  • Loading branch information
krzk authored and kuba-moo committed Jul 30, 2021
1 parent f2479c0 commit ddecf55
Show file tree
Hide file tree
Showing 7 changed files with 118 additions and 103 deletions.
14 changes: 8 additions & 6 deletions include/net/nfc/nci_core.h
Original file line number Diff line number Diff line change
Expand Up @@ -278,23 +278,25 @@ int nci_request(struct nci_dev *ndev,
void (*req)(struct nci_dev *ndev,
unsigned long opt),
unsigned long opt, __u32 timeout);
int nci_prop_cmd(struct nci_dev *ndev, __u8 oid, size_t len, __u8 *payload);
int nci_core_cmd(struct nci_dev *ndev, __u16 opcode, size_t len, __u8 *payload);
int nci_prop_cmd(struct nci_dev *ndev, __u8 oid, size_t len,
const __u8 *payload);
int nci_core_cmd(struct nci_dev *ndev, __u16 opcode, size_t len,
const __u8 *payload);
int nci_core_reset(struct nci_dev *ndev);
int nci_core_init(struct nci_dev *ndev);

int nci_recv_frame(struct nci_dev *ndev, struct sk_buff *skb);
int nci_send_frame(struct nci_dev *ndev, struct sk_buff *skb);
int nci_set_config(struct nci_dev *ndev, __u8 id, size_t len, __u8 *val);
int nci_set_config(struct nci_dev *ndev, __u8 id, size_t len, const __u8 *val);

int nci_nfcee_discover(struct nci_dev *ndev, u8 action);
int nci_nfcee_mode_set(struct nci_dev *ndev, u8 nfcee_id, u8 nfcee_mode);
int nci_core_conn_create(struct nci_dev *ndev, u8 destination_type,
u8 number_destination_params,
size_t params_len,
struct core_conn_create_dest_spec_params *params);
const struct core_conn_create_dest_spec_params *params);
int nci_core_conn_close(struct nci_dev *ndev, u8 conn_id);
int nci_nfcc_loopback(struct nci_dev *ndev, void *data, size_t data_len,
int nci_nfcc_loopback(struct nci_dev *ndev, const void *data, size_t data_len,
struct sk_buff **resp);

struct nci_hci_dev *nci_hci_allocate(struct nci_dev *ndev);
Expand Down Expand Up @@ -378,7 +380,7 @@ void nci_req_complete(struct nci_dev *ndev, int result);
struct nci_conn_info *nci_get_conn_info_by_conn_id(struct nci_dev *ndev,
int conn_id);
int nci_get_conn_info_by_dest_type_params(struct nci_dev *ndev, u8 dest_type,
struct dest_spec_params *params);
const struct dest_spec_params *params);

/* ----- NCI status code ----- */
int nci_to_errno(__u8 code);
Expand Down
40 changes: 21 additions & 19 deletions net/nfc/nci/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -53,9 +53,9 @@ struct nci_conn_info *nci_get_conn_info_by_conn_id(struct nci_dev *ndev,
}

int nci_get_conn_info_by_dest_type_params(struct nci_dev *ndev, u8 dest_type,
struct dest_spec_params *params)
const struct dest_spec_params *params)
{
struct nci_conn_info *conn_info;
const struct nci_conn_info *conn_info;

list_for_each_entry(conn_info, &ndev->conn_info_list, list) {
if (conn_info->dest_type == dest_type) {
Expand Down Expand Up @@ -210,14 +210,15 @@ static void nci_init_complete_req(struct nci_dev *ndev, unsigned long opt)
}

struct nci_set_config_param {
__u8 id;
size_t len;
__u8 *val;
__u8 id;
size_t len;
const __u8 *val;
};

static void nci_set_config_req(struct nci_dev *ndev, unsigned long opt)
{
struct nci_set_config_param *param = (struct nci_set_config_param *)opt;
const struct nci_set_config_param *param =
(struct nci_set_config_param *)opt;
struct nci_core_set_config_cmd cmd;

BUG_ON(param->len > NCI_MAX_PARAM_LEN);
Expand All @@ -237,7 +238,7 @@ struct nci_rf_discover_param {

static void nci_rf_discover_req(struct nci_dev *ndev, unsigned long opt)
{
struct nci_rf_discover_param *param =
const struct nci_rf_discover_param *param =
(struct nci_rf_discover_param *)opt;
struct nci_rf_disc_cmd cmd;

Expand Down Expand Up @@ -303,7 +304,7 @@ struct nci_rf_discover_select_param {

static void nci_rf_discover_select_req(struct nci_dev *ndev, unsigned long opt)
{
struct nci_rf_discover_select_param *param =
const struct nci_rf_discover_select_param *param =
(struct nci_rf_discover_select_param *)opt;
struct nci_rf_discover_select_cmd cmd;

Expand Down Expand Up @@ -341,18 +342,18 @@ static void nci_rf_deactivate_req(struct nci_dev *ndev, unsigned long opt)
struct nci_cmd_param {
__u16 opcode;
size_t len;
__u8 *payload;
const __u8 *payload;
};

static void nci_generic_req(struct nci_dev *ndev, unsigned long opt)
{
struct nci_cmd_param *param =
const struct nci_cmd_param *param =
(struct nci_cmd_param *)opt;

nci_send_cmd(ndev, param->opcode, param->len, param->payload);
}

int nci_prop_cmd(struct nci_dev *ndev, __u8 oid, size_t len, __u8 *payload)
int nci_prop_cmd(struct nci_dev *ndev, __u8 oid, size_t len, const __u8 *payload)
{
struct nci_cmd_param param;

Expand All @@ -365,7 +366,8 @@ int nci_prop_cmd(struct nci_dev *ndev, __u8 oid, size_t len, __u8 *payload)
}
EXPORT_SYMBOL(nci_prop_cmd);

int nci_core_cmd(struct nci_dev *ndev, __u16 opcode, size_t len, __u8 *payload)
int nci_core_cmd(struct nci_dev *ndev, __u16 opcode, size_t len,
const __u8 *payload)
{
struct nci_cmd_param param;

Expand Down Expand Up @@ -399,7 +401,7 @@ struct nci_loopback_data {

static void nci_send_data_req(struct nci_dev *ndev, unsigned long opt)
{
struct nci_loopback_data *data = (struct nci_loopback_data *)opt;
const struct nci_loopback_data *data = (struct nci_loopback_data *)opt;

nci_send_data(ndev, data->conn_id, data->data);
}
Expand All @@ -420,7 +422,7 @@ static void nci_nfcc_loopback_cb(void *context, struct sk_buff *skb, int err)
nci_req_complete(ndev, NCI_STATUS_OK);
}

int nci_nfcc_loopback(struct nci_dev *ndev, void *data, size_t data_len,
int nci_nfcc_loopback(struct nci_dev *ndev, const void *data, size_t data_len,
struct sk_buff **resp)
{
int r;
Expand Down Expand Up @@ -624,7 +626,7 @@ static int nci_dev_down(struct nfc_dev *nfc_dev)
return nci_close_device(ndev);
}

int nci_set_config(struct nci_dev *ndev, __u8 id, size_t len, __u8 *val)
int nci_set_config(struct nci_dev *ndev, __u8 id, size_t len, const __u8 *val)
{
struct nci_set_config_param param;

Expand Down Expand Up @@ -659,7 +661,7 @@ EXPORT_SYMBOL(nci_nfcee_discover);

static void nci_nfcee_mode_set_req(struct nci_dev *ndev, unsigned long opt)
{
struct nci_nfcee_mode_set_cmd *cmd =
const struct nci_nfcee_mode_set_cmd *cmd =
(struct nci_nfcee_mode_set_cmd *)opt;

nci_send_cmd(ndev, NCI_OP_NFCEE_MODE_SET_CMD,
Expand All @@ -681,7 +683,7 @@ EXPORT_SYMBOL(nci_nfcee_mode_set);

static void nci_core_conn_create_req(struct nci_dev *ndev, unsigned long opt)
{
struct core_conn_create_data *data =
const struct core_conn_create_data *data =
(struct core_conn_create_data *)opt;

nci_send_cmd(ndev, NCI_OP_CORE_CONN_CREATE_CMD, data->length, data->cmd);
Expand All @@ -690,7 +692,7 @@ static void nci_core_conn_create_req(struct nci_dev *ndev, unsigned long opt)
int nci_core_conn_create(struct nci_dev *ndev, u8 destination_type,
u8 number_destination_params,
size_t params_len,
struct core_conn_create_dest_spec_params *params)
const struct core_conn_create_dest_spec_params *params)
{
int r;
struct nci_core_conn_create_cmd *cmd;
Expand Down Expand Up @@ -863,7 +865,7 @@ static int nci_activate_target(struct nfc_dev *nfc_dev,
{
struct nci_dev *ndev = nfc_get_drvdata(nfc_dev);
struct nci_rf_discover_select_param param;
struct nfc_target *nci_target = NULL;
const struct nfc_target *nci_target = NULL;
int i;
int rc = 0;

Expand Down
12 changes: 6 additions & 6 deletions net/nfc/nci/data.c
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
void nci_data_exchange_complete(struct nci_dev *ndev, struct sk_buff *skb,
__u8 conn_id, int err)
{
struct nci_conn_info *conn_info;
const struct nci_conn_info *conn_info;
data_exchange_cb_t cb;
void *cb_context;

Expand Down Expand Up @@ -80,7 +80,7 @@ static inline void nci_push_data_hdr(struct nci_dev *ndev,

int nci_conn_max_data_pkt_payload_size(struct nci_dev *ndev, __u8 conn_id)
{
struct nci_conn_info *conn_info;
const struct nci_conn_info *conn_info;

conn_info = nci_get_conn_info_by_conn_id(ndev, conn_id);
if (!conn_info)
Expand All @@ -93,9 +93,9 @@ EXPORT_SYMBOL(nci_conn_max_data_pkt_payload_size);
static int nci_queue_tx_data_frags(struct nci_dev *ndev,
__u8 conn_id,
struct sk_buff *skb) {
struct nci_conn_info *conn_info;
const struct nci_conn_info *conn_info;
int total_len = skb->len;
unsigned char *data = skb->data;
const unsigned char *data = skb->data;
unsigned long flags;
struct sk_buff_head frags_q;
struct sk_buff *skb_frag;
Expand Down Expand Up @@ -166,7 +166,7 @@ static int nci_queue_tx_data_frags(struct nci_dev *ndev,
/* Send NCI data */
int nci_send_data(struct nci_dev *ndev, __u8 conn_id, struct sk_buff *skb)
{
struct nci_conn_info *conn_info;
const struct nci_conn_info *conn_info;
int rc = 0;

pr_debug("conn_id 0x%x, plen %d\n", conn_id, skb->len);
Expand Down Expand Up @@ -269,7 +269,7 @@ void nci_rx_data_packet(struct nci_dev *ndev, struct sk_buff *skb)
__u8 pbf = nci_pbf(skb->data);
__u8 status = 0;
__u8 conn_id = nci_conn_id(skb->data);
struct nci_conn_info *conn_info;
const struct nci_conn_info *conn_info;

pr_debug("len %d\n", skb->len);

Expand Down
24 changes: 12 additions & 12 deletions net/nfc/nci/hci.c
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@ static int nci_hci_send_data(struct nci_dev *ndev, u8 pipe,
const u8 data_type, const u8 *data,
size_t data_len)
{
struct nci_conn_info *conn_info;
const struct nci_conn_info *conn_info;
struct sk_buff *skb;
int len, i, r;
u8 cb = pipe;
Expand Down Expand Up @@ -197,7 +197,7 @@ static int nci_hci_send_data(struct nci_dev *ndev, u8 pipe,

static void nci_hci_send_data_req(struct nci_dev *ndev, unsigned long opt)
{
struct nci_data *data = (struct nci_data *)opt;
const struct nci_data *data = (struct nci_data *)opt;

nci_hci_send_data(ndev, data->pipe, data->cmd,
data->data, data->data_len);
Expand All @@ -221,8 +221,8 @@ int nci_hci_send_cmd(struct nci_dev *ndev, u8 gate, u8 cmd,
const u8 *param, size_t param_len,
struct sk_buff **skb)
{
struct nci_hcp_message *message;
struct nci_conn_info *conn_info;
const struct nci_hcp_message *message;
const struct nci_conn_info *conn_info;
struct nci_data data;
int r;
u8 pipe = ndev->hci_dev->gate2pipe[gate];
Expand Down Expand Up @@ -406,7 +406,7 @@ static void nci_hci_msg_rx_work(struct work_struct *work)
struct nci_hci_dev *hdev =
container_of(work, struct nci_hci_dev, msg_rx_work);
struct sk_buff *skb;
struct nci_hcp_message *message;
const struct nci_hcp_message *message;
u8 pipe, type, instruction;

while ((skb = skb_dequeue(&hdev->msg_rx_queue)) != NULL) {
Expand Down Expand Up @@ -498,7 +498,7 @@ void nci_hci_data_received_cb(void *context,
int nci_hci_open_pipe(struct nci_dev *ndev, u8 pipe)
{
struct nci_data data;
struct nci_conn_info *conn_info;
const struct nci_conn_info *conn_info;

conn_info = ndev->hci_dev->conn_info;
if (!conn_info)
Expand All @@ -523,7 +523,7 @@ static u8 nci_hci_create_pipe(struct nci_dev *ndev, u8 dest_host,
u8 pipe;
struct sk_buff *skb;
struct nci_hci_create_pipe_params params;
struct nci_hci_create_pipe_resp *resp;
const struct nci_hci_create_pipe_resp *resp;

pr_debug("gate=%d\n", dest_gate);

Expand Down Expand Up @@ -557,8 +557,8 @@ static int nci_hci_delete_pipe(struct nci_dev *ndev, u8 pipe)
int nci_hci_set_param(struct nci_dev *ndev, u8 gate, u8 idx,
const u8 *param, size_t param_len)
{
struct nci_hcp_message *message;
struct nci_conn_info *conn_info;
const struct nci_hcp_message *message;
const struct nci_conn_info *conn_info;
struct nci_data data;
int r;
u8 *tmp;
Expand Down Expand Up @@ -605,8 +605,8 @@ EXPORT_SYMBOL(nci_hci_set_param);
int nci_hci_get_param(struct nci_dev *ndev, u8 gate, u8 idx,
struct sk_buff **skb)
{
struct nci_hcp_message *message;
struct nci_conn_info *conn_info;
const struct nci_hcp_message *message;
const struct nci_conn_info *conn_info;
struct nci_data data;
int r;
u8 pipe = ndev->hci_dev->gate2pipe[gate];
Expand Down Expand Up @@ -697,7 +697,7 @@ EXPORT_SYMBOL(nci_hci_connect_gate);

static int nci_hci_dev_connect_gates(struct nci_dev *ndev,
u8 gate_count,
struct nci_hci_gate *gates)
const struct nci_hci_gate *gates)
{
int r;

Expand Down
Loading

0 comments on commit ddecf55

Please sign in to comment.