mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-07 04:12:04 -04:00
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:
commit
cac73fd51b
7 changed files with 71 additions and 23 deletions
2
Makefile
2
Makefile
|
|
@ -1,7 +1,7 @@
|
|||
# SPDX-License-Identifier: GPL-2.0
|
||||
VERSION = 5
|
||||
PATCHLEVEL = 4
|
||||
SUBLEVEL = 122
|
||||
SUBLEVEL = 123
|
||||
EXTRAVERSION =
|
||||
NAME = Kleptomaniac Octopus
|
||||
|
||||
|
|
|
|||
|
|
@ -2022,6 +2022,10 @@ static void dwc3_gadget_enable_irq(struct dwc3 *dwc)
|
|||
if (dwc->revision < DWC3_REVISION_250A)
|
||||
reg |= DWC3_DEVTEN_ULSTCNGEN;
|
||||
|
||||
/* On 2.30a and above this bit enables U3/L2-L1 Suspend Events */
|
||||
if (dwc->revision >= DWC3_REVISION_230A)
|
||||
reg |= DWC3_DEVTEN_EOPFEN;
|
||||
|
||||
dwc3_writel(dwc->regs, DWC3_DEVTEN, reg);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -298,6 +298,7 @@ int nci_nfcc_loopback(struct nci_dev *ndev, void *data, size_t data_len,
|
|||
struct sk_buff **resp);
|
||||
|
||||
struct nci_hci_dev *nci_hci_allocate(struct nci_dev *ndev);
|
||||
void nci_hci_deallocate(struct nci_dev *ndev);
|
||||
int nci_hci_send_event(struct nci_dev *ndev, u8 gate, u8 event,
|
||||
const u8 *param, size_t param_len);
|
||||
int nci_hci_send_cmd(struct nci_dev *ndev, u8 gate,
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1175,6 +1175,7 @@ EXPORT_SYMBOL(nci_allocate_device);
|
|||
void nci_free_device(struct nci_dev *ndev)
|
||||
{
|
||||
nfc_free_device(ndev->nfc_dev);
|
||||
nci_hci_deallocate(ndev);
|
||||
kfree(ndev);
|
||||
}
|
||||
EXPORT_SYMBOL(nci_free_device);
|
||||
|
|
|
|||
|
|
@ -795,3 +795,8 @@ struct nci_hci_dev *nci_hci_allocate(struct nci_dev *ndev)
|
|||
|
||||
return hdev;
|
||||
}
|
||||
|
||||
void nci_hci_deallocate(struct nci_dev *ndev)
|
||||
{
|
||||
kfree(ndev->hci_dev);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -20,10 +20,24 @@
|
|||
|
||||
static char *debuginfo_path;
|
||||
|
||||
static int __find_debuginfo(Dwfl_Module *mod __maybe_unused, void **userdata,
|
||||
const char *modname __maybe_unused, Dwarf_Addr base __maybe_unused,
|
||||
const char *file_name, const char *debuglink_file __maybe_unused,
|
||||
GElf_Word debuglink_crc __maybe_unused, char **debuginfo_file_name)
|
||||
{
|
||||
const struct dso *dso = *userdata;
|
||||
|
||||
assert(dso);
|
||||
if (dso->symsrc_filename && strcmp (file_name, dso->symsrc_filename))
|
||||
*debuginfo_file_name = strdup(dso->symsrc_filename);
|
||||
return -1;
|
||||
}
|
||||
|
||||
static const Dwfl_Callbacks offline_callbacks = {
|
||||
.find_debuginfo = dwfl_standard_find_debuginfo,
|
||||
.find_debuginfo = __find_debuginfo,
|
||||
.debuginfo_path = &debuginfo_path,
|
||||
.section_address = dwfl_offline_section_address,
|
||||
// .find_elf is not set as we use dwfl_report_elf() instead.
|
||||
};
|
||||
|
||||
static int __report_module(struct addr_location *al, u64 ip,
|
||||
|
|
@ -53,9 +67,22 @@ static int __report_module(struct addr_location *al, u64 ip,
|
|||
}
|
||||
|
||||
if (!mod)
|
||||
mod = dwfl_report_elf(ui->dwfl, dso->short_name,
|
||||
(dso->symsrc_filename ? dso->symsrc_filename : dso->long_name), -1, al->map->start - al->map->pgoff,
|
||||
false);
|
||||
mod = dwfl_report_elf(ui->dwfl, dso->short_name, dso->long_name, -1,
|
||||
al->map->start - al->map->pgoff, false);
|
||||
if (!mod) {
|
||||
char filename[PATH_MAX];
|
||||
|
||||
if (dso__build_id_filename(dso, filename, sizeof(filename), false))
|
||||
mod = dwfl_report_elf(ui->dwfl, dso->short_name, filename, -1,
|
||||
al->map->start - al->map->pgoff, false);
|
||||
}
|
||||
|
||||
if (mod) {
|
||||
void **userdatap;
|
||||
|
||||
dwfl_module_info(mod, &userdatap, NULL, NULL, NULL, NULL, NULL, NULL);
|
||||
*userdatap = dso;
|
||||
}
|
||||
|
||||
return mod && dwfl_addrmodule(ui->dwfl, ip) == mod ? 0 : -1;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue