This is the 5.4.123 stable release

-----BEGIN PGP SIGNATURE-----
 
 iQIzBAABCAAdFiEEZH8oZUiU471FcZm+ONu9yGCSaT4FAmCw0KEACgkQONu9yGCS
 aT4TxxAAvW/xsJKApUuCTrrdY/YMj96bFT6dcF/17N36Tb+lNRL+Ig+dYlfammlD
 sp7enkerXrIU+27ngnsJfznJLDXOCUPw77p9H90Kzbo7k3wi7Pt2nqFRyuOwYLRN
 CLo3gmWNWBReCjYmUK5uzUlGeUnQOtD7pcEMexOVxgMmRsJ1uKU2UGKHCIa8VxS1
 /xf8mQJv0lIbm8GLSYzCsP3zYafzc0cY0ST6CvCCX+71ryfKXGTtH0wAUvdvWsTs
 yvpc7UhFcnW9t2e77w9DmyQRf/nDfsu/ueXqITkJot4fYshA0w9owsNxKdnq/DKV
 nfIVK/agISYeT44uWOqb9TBUdEz2nWA31eIrXD6/Tf4ZUVw2WQy/UD8l5gUt+G7s
 Ag4nKSEZP4BAsZbnwnYPUm/qsfLm5l2+Spj4IK6mA7TZKMvjgLiHJIxihYzfeuof
 q/E9NeH8ejfrO6tnMyTUZzmPRjMImoeAvg+NaldpDlSyDE+DG+l9iIjO66Lg0uif
 dupHtAXFEjgfqHIRfvq4lW6lRKmUwhUkw0mdGgOSbgjoTktJNdrAVoQgsOIvhYBJ
 fuhs9PTGT5isekDEotdsj8wuXlVKQ2rMKl98Z1djZXA73INobftgbtFxaVGIhLj/
 7LK6pbnaClT5bHJBi+AvVExOZolPsCxgxaXsESCV4nxppEOjRxA=
 =+GH7
 -----END PGP SIGNATURE-----

Merge 5.4.123 into android11-5.4-lts

Changes in 5.4.123
	bpf: Wrap aux data inside bpf_sanitize_info container
	bpf: Fix mask direction swap upon off reg sign change
	bpf: No need to simulate speculative domain for immediates
	usb: dwc3: gadget: Enable suspend events
	perf unwind: Fix separate debug info files when using elfutils' libdw's unwinder
	perf unwind: Set userdata for all __report_module() paths
	NFC: nci: fix memory leak in nci_allocate_device
	Linux 5.4.123

Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
Change-Id: Ia6e930913849320021bacd7b2f0498450d3b88ff
This commit is contained in:
Greg Kroah-Hartman 2021-05-28 15:34:57 +02:00
commit cac73fd51b
7 changed files with 71 additions and 23 deletions

View file

@ -4272,18 +4272,10 @@ enum {
};
static int retrieve_ptr_limit(const struct bpf_reg_state *ptr_reg,
const struct bpf_reg_state *off_reg,
u32 *alu_limit, u8 opcode)
u32 *alu_limit, bool mask_to_left)
{
bool off_is_neg = off_reg->smin_value < 0;
bool mask_to_left = (opcode == BPF_ADD && off_is_neg) ||
(opcode == BPF_SUB && !off_is_neg);
u32 max = 0, ptr_limit = 0;
if (!tnum_is_const(off_reg->var_off) &&
(off_reg->smin_value < 0) != (off_reg->smax_value < 0))
return REASON_BOUNDS;
switch (ptr_reg->type) {
case PTR_TO_STACK:
/* Offset 0 is out-of-bounds, but acceptable start for the
@ -4349,15 +4341,20 @@ static bool sanitize_needed(u8 opcode)
return opcode == BPF_ADD || opcode == BPF_SUB;
}
struct bpf_sanitize_info {
struct bpf_insn_aux_data aux;
bool mask_to_left;
};
static int sanitize_ptr_alu(struct bpf_verifier_env *env,
struct bpf_insn *insn,
const struct bpf_reg_state *ptr_reg,
const struct bpf_reg_state *off_reg,
struct bpf_reg_state *dst_reg,
struct bpf_insn_aux_data *tmp_aux,
struct bpf_sanitize_info *info,
const bool commit_window)
{
struct bpf_insn_aux_data *aux = commit_window ? cur_aux(env) : tmp_aux;
struct bpf_insn_aux_data *aux = commit_window ? cur_aux(env) : &info->aux;
struct bpf_verifier_state *vstate = env->cur_state;
bool off_is_imm = tnum_is_const(off_reg->var_off);
bool off_is_neg = off_reg->smin_value < 0;
@ -4378,7 +4375,16 @@ static int sanitize_ptr_alu(struct bpf_verifier_env *env,
if (vstate->speculative)
goto do_sim;
err = retrieve_ptr_limit(ptr_reg, off_reg, &alu_limit, opcode);
if (!commit_window) {
if (!tnum_is_const(off_reg->var_off) &&
(off_reg->smin_value < 0) != (off_reg->smax_value < 0))
return REASON_BOUNDS;
info->mask_to_left = (opcode == BPF_ADD && off_is_neg) ||
(opcode == BPF_SUB && !off_is_neg);
}
err = retrieve_ptr_limit(ptr_reg, &alu_limit, info->mask_to_left);
if (err < 0)
return err;
@ -4386,8 +4392,8 @@ static int sanitize_ptr_alu(struct bpf_verifier_env *env,
/* In commit phase we narrow the masking window based on
* the observed pointer move after the simulated operation.
*/
alu_state = tmp_aux->alu_state;
alu_limit = abs(tmp_aux->alu_limit - alu_limit);
alu_state = info->aux.alu_state;
alu_limit = abs(info->aux.alu_limit - alu_limit);
} else {
alu_state = off_is_neg ? BPF_ALU_NEG_VALUE : 0;
alu_state |= off_is_imm ? BPF_ALU_IMMEDIATE : 0;
@ -4402,8 +4408,12 @@ do_sim:
/* If we're in commit phase, we're done here given we already
* pushed the truncated dst_reg into the speculative verification
* stack.
*
* Also, when register is a known constant, we rewrite register-based
* operation to immediate-based, and thus do not need masking (and as
* a consequence, do not need to simulate the zero-truncation either).
*/
if (commit_window)
if (commit_window || off_is_imm)
return 0;
/* Simulate and find potential out-of-bounds access under
@ -4517,7 +4527,7 @@ static int adjust_ptr_min_max_vals(struct bpf_verifier_env *env,
smin_ptr = ptr_reg->smin_value, smax_ptr = ptr_reg->smax_value;
u64 umin_val = off_reg->umin_value, umax_val = off_reg->umax_value,
umin_ptr = ptr_reg->umin_value, umax_ptr = ptr_reg->umax_value;
struct bpf_insn_aux_data tmp_aux = {};
struct bpf_sanitize_info info = {};
u8 opcode = BPF_OP(insn->code);
u32 dst = insn->dst_reg;
int ret;
@ -4578,7 +4588,7 @@ static int adjust_ptr_min_max_vals(struct bpf_verifier_env *env,
if (sanitize_needed(opcode)) {
ret = sanitize_ptr_alu(env, insn, ptr_reg, off_reg, dst_reg,
&tmp_aux, false);
&info, false);
if (ret < 0)
return sanitize_err(env, insn, ret, off_reg, dst_reg);
}
@ -4719,7 +4729,7 @@ static int adjust_ptr_min_max_vals(struct bpf_verifier_env *env,
return -EACCES;
if (sanitize_needed(opcode)) {
ret = sanitize_ptr_alu(env, insn, dst_reg, off_reg, dst_reg,
&tmp_aux, true);
&info, true);
if (ret < 0)
return sanitize_err(env, insn, ret, off_reg, dst_reg);
}