Skip to content
14 changes: 10 additions & 4 deletions crypto/asymmetric_keys/asymmetric_type.c
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
#include <crypto/public_key.h>
#include <linux/seq_file.h>
#include <linux/module.h>
#include <linux/overflow.h>
#include <linux/slab.h>
#include <linux/ctype.h>
#include <keys/system_keyring.h>
Expand Down Expand Up @@ -138,12 +139,17 @@ struct asymmetric_key_id *asymmetric_key_generate_id(const void *val_1,
size_t len_2)
{
struct asymmetric_key_id *kid;

kid = kmalloc(sizeof(struct asymmetric_key_id) + len_1 + len_2,
GFP_KERNEL);
size_t kid_sz;
size_t len;

if (check_add_overflow(len_1, len_2, &len))
return ERR_PTR(-EOVERFLOW);
if (check_add_overflow(sizeof(struct asymmetric_key_id), len, &kid_sz))
return ERR_PTR(-EOVERFLOW);
kid = kmalloc(kid_sz, GFP_KERNEL);
if (!kid)
return ERR_PTR(-ENOMEM);
kid->len = len_1 + len_2;
kid->len = len;
memcpy(kid->data, val_1, len_1);
memcpy(kid->data + len_1, val_2, len_2);
return kid;
Expand Down
3 changes: 3 additions & 0 deletions drivers/iommu/iommu-sva.c
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,9 @@ struct iommu_sva *iommu_sva_bind_device(struct device *dev, struct mm_struct *mm
if (!group)
return ERR_PTR(-ENODEV);

if (IS_ENABLED(CONFIG_X86))
return ERR_PTR(-EOPNOTSUPP);

mutex_lock(&iommu_sva_lock);

/* Allocate mm->pasid if necessary. */
Expand Down
5 changes: 4 additions & 1 deletion drivers/target/iscsi/iscsi_target_util.c
Original file line number Diff line number Diff line change
Expand Up @@ -857,8 +857,11 @@ void iscsit_dec_conn_usage_count(struct iscsit_conn *conn)
spin_lock_bh(&conn->conn_usage_lock);
conn->conn_usage_count--;

if (!conn->conn_usage_count && conn->conn_waiting_on_uc)
if (!conn->conn_usage_count && conn->conn_waiting_on_uc) {
spin_unlock_bh(&conn->conn_usage_lock);
complete(&conn->conn_waiting_on_uc_comp);
return;
}

spin_unlock_bh(&conn->conn_usage_lock);
}
Expand Down
2 changes: 2 additions & 0 deletions net/ceph/messenger_v2.c
Original file line number Diff line number Diff line change
Expand Up @@ -2412,7 +2412,9 @@ static int process_auth_done(struct ceph_connection *con, void *p, void *end)

ceph_decode_64_safe(&p, end, global_id, bad);
ceph_decode_32_safe(&p, end, con->v2.con_mode, bad);

ceph_decode_32_safe(&p, end, payload_len, bad);
ceph_decode_need(&p, end, payload_len, bad);

dout("%s con %p global_id %llu con_mode %d payload_len %d\n",
__func__, con, global_id, con->v2.con_mode, payload_len);
Expand Down
120 changes: 55 additions & 65 deletions net/ceph/osdmap.c
Original file line number Diff line number Diff line change
Expand Up @@ -806,138 +806,126 @@ static int decode_pool(void **p, void *end, struct ceph_pg_pool_info *pi)
ceph_decode_need(p, end, len, bad);
pool_end = *p + len;

ceph_decode_need(p, end, 4 + 4 + 4, bad);
pi->type = ceph_decode_8(p);
pi->size = ceph_decode_8(p);
pi->crush_ruleset = ceph_decode_8(p);
pi->object_hash = ceph_decode_8(p);

pi->pg_num = ceph_decode_32(p);
pi->pgp_num = ceph_decode_32(p);

*p += 4 + 4; /* skip lpg* */
*p += 4; /* skip last_change */
*p += 8 + 4; /* skip snap_seq, snap_epoch */
/* lpg*, last_change, snap_seq, snap_epoch */
ceph_decode_skip_n(p, end, 8 + 4 + 8 + 4, bad);

/* skip snaps */
num = ceph_decode_32(p);
ceph_decode_32_safe(p, end, num, bad);
while (num--) {
*p += 8; /* snapid key */
*p += 1 + 1; /* versions */
len = ceph_decode_32(p);
*p += len;
/* snapid key, pool snap (with versions) */
ceph_decode_skip_n(p, end, 8 + 2, bad);
ceph_decode_skip_string(p, end, bad);
}

/* skip removed_snaps */
num = ceph_decode_32(p);
*p += num * (8 + 8);
/* removed_snaps */
ceph_decode_skip_map(p, end, 64, 64, bad);

ceph_decode_need(p, end, 8 + 8 + 4, bad);
*p += 8; /* skip auid */
pi->flags = ceph_decode_64(p);
*p += 4; /* skip crash_replay_interval */

if (ev >= 7)
pi->min_size = ceph_decode_8(p);
ceph_decode_8_safe(p, end, pi->min_size, bad);
else
pi->min_size = pi->size - pi->size / 2;

if (ev >= 8)
*p += 8 + 8; /* skip quota_max_* */
/* quota_max_* */
ceph_decode_skip_n(p, end, 8 + 8, bad);

if (ev >= 9) {
/* skip tiers */
num = ceph_decode_32(p);
*p += num * 8;
/* tiers */
ceph_decode_skip_set(p, end, 64, bad);

ceph_decode_need(p, end, 8 + 1 + 8 + 8, bad);
*p += 8; /* skip tier_of */
*p += 1; /* skip cache_mode */

pi->read_tier = ceph_decode_64(p);
pi->write_tier = ceph_decode_64(p);
} else {
pi->read_tier = -1;
pi->write_tier = -1;
}

if (ev >= 10) {
/* skip properties */
num = ceph_decode_32(p);
while (num--) {
len = ceph_decode_32(p);
*p += len; /* key */
len = ceph_decode_32(p);
*p += len; /* val */
}
}
if (ev >= 10)
/* properties */
ceph_decode_skip_map(p, end, string, string, bad);

if (ev >= 11) {
/* skip hit_set_params */
*p += 1 + 1; /* versions */
len = ceph_decode_32(p);
*p += len;
/* hit_set_params (with versions) */
ceph_decode_skip_n(p, end, 2, bad);
ceph_decode_skip_string(p, end, bad);

*p += 4; /* skip hit_set_period */
*p += 4; /* skip hit_set_count */
/* hit_set_period, hit_set_count */
ceph_decode_skip_n(p, end, 4 + 4, bad);
}

if (ev >= 12)
*p += 4; /* skip stripe_width */
/* stripe_width */
ceph_decode_skip_32(p, end, bad);

if (ev >= 13) {
*p += 8; /* skip target_max_bytes */
*p += 8; /* skip target_max_objects */
*p += 4; /* skip cache_target_dirty_ratio_micro */
*p += 4; /* skip cache_target_full_ratio_micro */
*p += 4; /* skip cache_min_flush_age */
*p += 4; /* skip cache_min_evict_age */
}
if (ev >= 13)
/* target_max_*, cache_target_*, cache_min_* */
ceph_decode_skip_n(p, end, 16 + 8 + 8, bad);

if (ev >= 14) {
/* skip erasure_code_profile */
len = ceph_decode_32(p);
*p += len;
}
if (ev >= 14)
/* erasure_code_profile */
ceph_decode_skip_string(p, end, bad);

/*
* last_force_op_resend_preluminous, will be overridden if the
* map was encoded with RESEND_ON_SPLIT
*/
if (ev >= 15)
pi->last_force_request_resend = ceph_decode_32(p);
ceph_decode_32_safe(p, end, pi->last_force_request_resend, bad);
else
pi->last_force_request_resend = 0;

if (ev >= 16)
*p += 4; /* skip min_read_recency_for_promote */
/* min_read_recency_for_promote */
ceph_decode_skip_32(p, end, bad);

if (ev >= 17)
*p += 8; /* skip expected_num_objects */
/* expected_num_objects */
ceph_decode_skip_64(p, end, bad);

if (ev >= 19)
*p += 4; /* skip cache_target_dirty_high_ratio_micro */
/* cache_target_dirty_high_ratio_micro */
ceph_decode_skip_32(p, end, bad);

if (ev >= 20)
*p += 4; /* skip min_write_recency_for_promote */
/* min_write_recency_for_promote */
ceph_decode_skip_32(p, end, bad);

if (ev >= 21)
*p += 1; /* skip use_gmt_hitset */
/* use_gmt_hitset */
ceph_decode_skip_8(p, end, bad);

if (ev >= 22)
*p += 1; /* skip fast_read */
/* fast_read */
ceph_decode_skip_8(p, end, bad);

if (ev >= 23) {
*p += 4; /* skip hit_set_grade_decay_rate */
*p += 4; /* skip hit_set_search_last_n */
}
if (ev >= 23)
/* hit_set_grade_decay_rate, hit_set_search_last_n */
ceph_decode_skip_n(p, end, 4 + 4, bad);

if (ev >= 24) {
/* skip opts */
*p += 1 + 1; /* versions */
len = ceph_decode_32(p);
*p += len;
/* opts (with versions) */
ceph_decode_skip_n(p, end, 2, bad);
ceph_decode_skip_string(p, end, bad);
}

if (ev >= 25)
pi->last_force_request_resend = ceph_decode_32(p);
ceph_decode_32_safe(p, end, pi->last_force_request_resend, bad);

/* ignore the rest */

Expand Down Expand Up @@ -1987,11 +1975,13 @@ struct ceph_osdmap *osdmap_apply_incremental(void **p, void *end, bool msgr2,
sizeof(u64) + sizeof(u32), e_inval);
ceph_decode_copy(p, &fsid, sizeof(fsid));
epoch = ceph_decode_32(p);
BUG_ON(epoch != map->epoch+1);
ceph_decode_copy(p, &modified, sizeof(modified));
new_pool_max = ceph_decode_64(p);
new_flags = ceph_decode_32(p);

if (epoch != map->epoch + 1)
goto e_inval;

/* full map? */
ceph_decode_32_safe(p, end, len, e_inval);
if (len > 0) {
Expand Down
2 changes: 2 additions & 0 deletions net/netfilter/nf_conntrack_h323_asn1.c
Original file line number Diff line number Diff line change
Expand Up @@ -922,6 +922,8 @@ int DecodeQ931(unsigned char *buf, size_t sz, Q931 *q931)
break;
p++;
len--;
if (len <= 0)
break;
return DecodeH323_UserInformation(buf, p, len,
&q931->UUIE);
}
Expand Down
2 changes: 1 addition & 1 deletion net/netfilter/xt_tcpmss.c
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ tcpmss_mt(const struct sk_buff *skb, struct xt_action_param *par)
return (mssval >= info->mss_min &&
mssval <= info->mss_max) ^ info->invert;
}
if (op[i] < 2)
if (op[i] < 2 || i == optlen - 1)
i++;
else
i += op[i+1] ? : 1;
Expand Down
Loading