mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: alexander.levin@verizon.com
To: "linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	"stable@vger.kernel.org" <stable@vger.kernel.org>
Cc: Masami Hiramatsu <mhiramat@kernel.org>,
	KUMANO Syuhei <kumano.prog@gmail.com>,
	Jon Medhurst <tixy@linaro.org>,
	alexander.levin@verizon.com
Subject: [PATCH AUTOSEL for 4.4 03/59] arm: kprobes: Fix the return address of multiple kretprobes
Date: Wed, 13 Dec 2017 01:58:26 +0000	[thread overview]
Message-ID: <20171213015817.6950-3-alexander.levin@verizon.com> (raw)
In-Reply-To: <20171213015817.6950-1-alexander.levin@verizon.com>

From: Masami Hiramatsu <mhiramat@kernel.org>

[ Upstream commit 06553175f585b52509c7df37d6f4a50aacb7b211 ]

This is arm port of commit 737480a0d525 ("kprobes/x86:
Fix the return address of multiple kretprobes").

Fix the return address of subsequent kretprobes when multiple
kretprobes are set on the same function.

For example:

  # cd /sys/kernel/debug/tracing
  # echo "r:event1 sys_symlink" > kprobe_events
  # echo "r:event2 sys_symlink" >> kprobe_events
  # echo 1 > events/kprobes/enable
  # ln -s /tmp/foo /tmp/bar

 (without this patch)

  # cat trace | grep -v ^#
              ln-82    [000] dn.2    68.446525: event1: (kretprobe_trampoline+0x0/0x18 <- SyS_symlink)
              ln-82    [000] dn.2    68.447831: event2: (ret_fast_syscall+0x0/0x1c <- SyS_symlink)

 (with this patch)

  # cat trace | grep -v ^#
              ln-81    [000] dn.1    39.463469: event1: (ret_fast_syscall+0x0/0x1c <- SyS_symlink)
              ln-81    [000] dn.1    39.464701: event2: (ret_fast_syscall+0x0/0x1c <- SyS_symlink)

Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
Cc: KUMANO Syuhei <kumano.prog@gmail.com>
Signed-off-by: Jon Medhurst <tixy@linaro.org>
Signed-off-by: Sasha Levin <alexander.levin@verizon.com>
---
 arch/arm/probes/kprobes/core.c | 24 ++++++++++++++++++++++--
 1 file changed, 22 insertions(+), 2 deletions(-)

diff --git a/arch/arm/probes/kprobes/core.c b/arch/arm/probes/kprobes/core.c
index a4ec240ee7ba..3eb018fa1a1f 100644
--- a/arch/arm/probes/kprobes/core.c
+++ b/arch/arm/probes/kprobes/core.c
@@ -433,6 +433,7 @@ static __used __kprobes void *trampoline_handler(struct pt_regs *regs)
 	struct hlist_node *tmp;
 	unsigned long flags, orig_ret_address = 0;
 	unsigned long trampoline_address = (unsigned long)&kretprobe_trampoline;
+	kprobe_opcode_t *correct_ret_addr = NULL;
 
 	INIT_HLIST_HEAD(&empty_rp);
 	kretprobe_hash_lock(current, &head, &flags);
@@ -455,14 +456,34 @@ static __used __kprobes void *trampoline_handler(struct pt_regs *regs)
 			/* another task is sharing our hash bucket */
 			continue;
 
+		orig_ret_address = (unsigned long)ri->ret_addr;
+
+		if (orig_ret_address != trampoline_address)
+			/*
+			 * This is the real return address. Any other
+			 * instances associated with this task are for
+			 * other calls deeper on the call stack
+			 */
+			break;
+	}
+
+	kretprobe_assert(ri, orig_ret_address, trampoline_address);
+
+	correct_ret_addr = ri->ret_addr;
+	hlist_for_each_entry_safe(ri, tmp, head, hlist) {
+		if (ri->task != current)
+			/* another task is sharing our hash bucket */
+			continue;
+
+		orig_ret_address = (unsigned long)ri->ret_addr;
 		if (ri->rp && ri->rp->handler) {
 			__this_cpu_write(current_kprobe, &ri->rp->kp);
 			get_kprobe_ctlblk()->kprobe_status = KPROBE_HIT_ACTIVE;
+			ri->ret_addr = correct_ret_addr;
 			ri->rp->handler(ri, regs);
 			__this_cpu_write(current_kprobe, NULL);
 		}
 
-		orig_ret_address = (unsigned long)ri->ret_addr;
 		recycle_rp_inst(ri, &empty_rp);
 
 		if (orig_ret_address != trampoline_address)
@@ -474,7 +495,6 @@ static __used __kprobes void *trampoline_handler(struct pt_regs *regs)
 			break;
 	}
 
-	kretprobe_assert(ri, orig_ret_address, trampoline_address);
 	kretprobe_hash_unlock(current, &flags);
 
 	hlist_for_each_entry_safe(ri, tmp, &empty_rp, hlist) {
-- 
2.11.0

  parent reply	other threads:[~2017-12-13  2:01 UTC|newest]

Thread overview: 59+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-12-13  1:58 [PATCH AUTOSEL for 4.4 01/59] ALSA: hda - add support for docking station for HP 820 G2 alexander.levin
2017-12-13  1:58 ` [PATCH AUTOSEL for 4.4 02/59] ALSA: hda - add support for docking station for HP 840 G3 alexander.levin
2017-12-13  1:58 ` alexander.levin [this message]
2017-12-13  1:58 ` [PATCH AUTOSEL for 4.4 06/59] r8152: fix the list rx_done may be used without initialization alexander.levin
2017-12-13  1:58 ` [PATCH AUTOSEL for 4.4 05/59] cpuidle: Validate cpu_dev in cpuidle_add_sysfs() alexander.levin
2017-12-13  1:58 ` [PATCH AUTOSEL for 4.4 04/59] arm: kprobes: Align stack to 8-bytes in test code alexander.levin
2017-12-13  1:58 ` [PATCH AUTOSEL for 4.4 10/59] net: qmi_wwan: Add USB IDs for MDM6600 modem on Motorola Droid 4 alexander.levin
2017-12-13  1:58 ` [PATCH AUTOSEL for 4.4 08/59] sch_dsmark: fix invalid skb_cow() usage alexander.levin
2017-12-13  1:58 ` [PATCH AUTOSEL for 4.4 07/59] crypto: deadlock between crypto_alg_sem/rtnl_mutex/genl_mutex alexander.levin
2017-12-13  1:58 ` [PATCH AUTOSEL for 4.4 09/59] bna: integer overflow bug in debugfs alexander.levin
2017-12-13  1:58 ` [PATCH AUTOSEL for 4.4 12/59] usb: gadget: udc: remove pointer dereference after free alexander.levin
2017-12-13  1:58 ` [PATCH AUTOSEL for 4.4 11/59] usb: gadget: f_uvc: Sanity check wMaxPacketSize for SuperSpeed alexander.levin
2017-12-13  1:58 ` [PATCH AUTOSEL for 4.4 14/59] netfilter: nfnl_cthelper: Fix memory leak alexander.levin
2017-12-13  1:58 ` [PATCH AUTOSEL for 4.4 13/59] netfilter: nfnl_cthelper: fix runtime expectation policy updates alexander.levin
2017-12-13  1:58 ` [PATCH AUTOSEL for 4.4 15/59] inet: frag: release spinlock before calling icmp_send() alexander.levin
2017-12-13  1:58 ` [PATCH AUTOSEL for 4.4 17/59] scsi: lpfc: Fix PT2PT PRLI reject alexander.levin
2017-12-13  1:58 ` [PATCH AUTOSEL for 4.4 16/59] pinctrl: st: add irq_request/release_resources callbacks alexander.levin
2017-12-13  1:58 ` [PATCH AUTOSEL for 4.4 18/59] KVM: x86: correct async page present tracepoint alexander.levin
2017-12-13  1:58 ` [PATCH AUTOSEL for 4.4 20/59] ARM: dts: ti: fix PCI bus dtc warnings alexander.levin
2017-12-13  1:58 ` [PATCH AUTOSEL for 4.4 19/59] KVM: VMX: Fix enable VPID conditions alexander.levin
2017-12-13  1:58 ` [PATCH AUTOSEL for 4.4 22/59] i2c: mux: pca954x: Add missing pca9546 definition to chip_desc alexander.levin
2017-12-13  1:58 ` [PATCH AUTOSEL for 4.4 24/59] r8152: prevent the driver from transmitting packets with carrier off alexander.levin
2017-12-13  1:58 ` [PATCH AUTOSEL for 4.4 21/59] hwmon: (asus_atk0110) fix uninitialized data access alexander.levin
2017-12-13  1:58 ` [PATCH AUTOSEL for 4.4 23/59] HID: xinmo: fix for out of range for THT 2P arcade controller alexander.levin
2017-12-13  1:58 ` [PATCH AUTOSEL for 4.4 28/59] i40e: Do not enable NAPI on q_vectors that have no rings alexander.levin
2017-12-13  1:58 ` [PATCH AUTOSEL for 4.4 25/59] s390/qeth: no ETH header for outbound AF_IUCV alexander.levin
2017-12-13  1:58 ` [PATCH AUTOSEL for 4.4 26/59] bna: avoid writing uninitialized data into hw registers alexander.levin
2017-12-13  1:58 ` [PATCH AUTOSEL for 4.4 27/59] net: Do not allow negative values for busy_read and busy_poll sysctl interfaces alexander.levin
2017-12-13  1:58 ` [PATCH AUTOSEL for 4.4 29/59] RDMA/iser: Fix possible mr leak on device removal event alexander.levin
2017-12-13  1:58 ` [PATCH AUTOSEL for 4.4 31/59] netfilter: nfnl_cthelper: fix a race when walk the nf_ct_helper_hash table alexander.levin
2017-12-13  1:58 ` [PATCH AUTOSEL for 4.4 30/59] irda: vlsi_ir: fix check for DMA mapping errors alexander.levin
2017-12-13  1:58 ` [PATCH AUTOSEL for 4.4 35/59] isdn: kcapi: avoid uninitialized data alexander.levin
2017-12-13  1:58 ` [PATCH AUTOSEL for 4.4 32/59] netfilter: nf_nat_snmp: Fix panic when snmp_trap_helper fails to register alexander.levin
2017-12-13  1:58 ` [PATCH AUTOSEL for 4.4 34/59] KVM: pci-assign: do not map smm memory slot pages in vt-d page tables alexander.levin
2017-12-13  1:58 ` [PATCH AUTOSEL for 4.4 33/59] ARM: dts: am335x-evmsk: adjust mmc2 param to allow suspend alexander.levin
2017-12-13  1:58 ` [PATCH AUTOSEL for 4.4 36/59] xhci: plat: Register shutdown for xhci_plat alexander.levin
2017-12-13  1:58 ` [PATCH AUTOSEL for 4.4 37/59] netfilter: nfnetlink_queue: fix secctx memory leak alexander.levin
2017-12-13  1:58 ` [PATCH AUTOSEL for 4.4 39/59] cpuidle: powernv: Pass correct drv->cpumask for registration alexander.levin
2017-12-13  1:58 ` [PATCH AUTOSEL for 4.4 38/59] ARM: dma-mapping: disallow dma_get_sgtable() for non-kernel managed memory alexander.levin
2017-12-13  1:58 ` [PATCH AUTOSEL for 4.4 41/59] backlight: pwm_bl: Fix overflow condition alexander.levin
2017-12-13  1:58 ` [PATCH AUTOSEL for 4.4 42/59] crypto: crypto4xx - increase context and scatter ring buffer elements alexander.levin
2017-12-13  1:58 ` [PATCH AUTOSEL for 4.4 43/59] rtc: pl031: make interrupt optional alexander.levin
2017-12-13  1:58 ` [PATCH AUTOSEL for 4.4 40/59] bnxt_en: Fix NULL pointer dereference in reopen failure path alexander.levin
2017-12-13  1:58 ` [PATCH AUTOSEL for 4.4 46/59] scsi: cxgb4i: fix Tx skb leak alexander.levin
2017-12-13  1:58 ` [PATCH AUTOSEL for 4.4 45/59] PCI: Avoid bus reset if bridge itself is broken alexander.levin
2017-12-13  1:58 ` [PATCH AUTOSEL for 4.4 47/59] scsi: mpt3sas: Fix IO error occurs on pulling out a drive from RAID1 volume created on two SATA drive alexander.levin
2017-12-13  1:58 ` [PATCH AUTOSEL for 4.4 44/59] net: phy: at803x: Change error to EINVAL for invalid MAC alexander.levin
2017-12-13  1:58 ` [PATCH AUTOSEL for 4.4 49/59] igb: check memory allocation failure alexander.levin
2017-12-13  1:58 ` [PATCH AUTOSEL for 4.4 48/59] PCI: Create SR-IOV virtfn/physfn links before attaching driver alexander.levin
2017-12-13  1:58 ` [PATCH AUTOSEL for 4.4 50/59] ixgbe: fix use of uninitialized padding alexander.levin
2017-12-13  1:58 ` [PATCH AUTOSEL for 4.4 51/59] PCI/AER: Report non-fatal errors only to the affected endpoint alexander.levin
2017-12-13  1:58 ` [PATCH AUTOSEL for 4.4 52/59] percpu: don't forget to free the temporary struct pcpu_alloc_info alexander.levin
2017-12-13  1:58 ` [PATCH AUTOSEL for 4.4 53/59] powerpc/xmon: Avoid tripping SMP hardlockup watchdog alexander.levin
2017-12-13  1:58 ` [PATCH AUTOSEL for 4.4 54/59] scsi: lpfc: Fix secure firmware updates alexander.levin
2017-12-13  1:58 ` [PATCH AUTOSEL for 4.4 55/59] scsi: lpfc: PLOGI failures during NPIV testing alexander.levin
2017-12-13  1:58 ` [PATCH AUTOSEL for 4.4 56/59] fm10k: ensure we process SM mbx when processing VF mbx alexander.levin
2017-12-13  1:58 ` [PATCH AUTOSEL for 4.4 57/59] tcp: fix under-evaluated ssthresh in TCP Vegas alexander.levin
2017-12-13  1:58 ` [PATCH AUTOSEL for 4.4 59/59] cpuidle: fix broadcast control when broadcast can not be entered alexander.levin
2017-12-13  1:58 ` [PATCH AUTOSEL for 4.4 58/59] rtc: set the alarm to the next expiring timer alexander.levin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20171213015817.6950-3-alexander.levin@verizon.com \
    --to=alexander.levin@verizon.com \
    --cc=kumano.prog@gmail.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mhiramat@kernel.org \
    --cc=stable@vger.kernel.org \
    --cc=tixy@linaro.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®