Received: by 2002:ac0:98c7:0:0:0:0:0 with SMTP id g7-v6csp1631651imd; Sun, 4 Nov 2018 06:40:28 -0800 (PST) X-Google-Smtp-Source: AJdET5dCXU27lS0EDD3wfD2PjVqKWO8DKtigrAOptSTgIVv4pwaTIG7J7db0IQRlx8AxPINcwQ1t X-Received: by 2002:a62:2782:: with SMTP id n124-v6mr18889040pfn.216.1541342427980; Sun, 04 Nov 2018 06:40:27 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1541342427; cv=none; d=google.com; s=arc-20160816; b=cKDTPOAcO7gr07UEhHyvOYF2RH/gVAVSvy1wOIwPeg580grCwp9B6f915ofKQNnrQD 5rFaoZNDUqm284mG269lGVdEDe4zpGJ/CiJJpjftsxFDeingIMd4Jt+HCSdrXQj3+fnX i4M+a3wsLpUBA3ZK6oCDzweEEKdw8owl7MCjXCQNwbPUNgAKUxKQua5d2ZIR3TEIzBs/ AIaAo4jF5MF8VxiOCsFPtCLl6g3t2/7W2+tNUgerncpDJ9H6mmWOlfJjZ0airfF0hEmL ruKkjI4N3dAMWuli4MomOe0Xuj9cRXwRt2XGXvFasAW1qfrGLjKayPI28+nO9eTJUv0D EnnQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature; bh=WVdoAksXadHvxOetves8LOfuNA0gd89RByllSOJm/rI=; b=BHA8TGESRY2oqH0/BvxVR6rFtQf4O1qaxzvPq54b0lchU+gR/+bY5tv+augYQ8Dqc2 Pedi2REnc663yBG2QTiDuWd2hPDg6UH7Mhrm4ev9vHoiM+HKLrEuZqcnYLVFlxJyWu8v B3gO9LLPnT5ukfkFk3clejcKrSft7OrqSSYqfbokpXXGVQKgJ9cWaiiZOkundwCrM9GC X4EAwB+7crWgTQ1+LgH594A1y45AfMApivkw2mJNtVboa2liclnahdH0w1h6e2ri5Ysr Rg+U6p28tsUfmwwouA031QlndPMzwMSGZLdtSbpF5qbJ7qdldoQS65KVVYinhw7UpsPS UR5Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=Fc0vsn8N; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id m22-v6si40845033pgj.583.2018.11.04.06.40.11; Sun, 04 Nov 2018 06:40:27 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=Fc0vsn8N; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730121AbeKDXHL (ORCPT + 99 others); Sun, 4 Nov 2018 18:07:11 -0500 Received: from mail.kernel.org ([198.145.29.99]:44560 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730073AbeKDXHJ (ORCPT ); Sun, 4 Nov 2018 18:07:09 -0500 Received: from sasha-vm.mshome.net (c-73-47-72-35.hsd1.nh.comcast.net [73.47.72.35]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 1E616204FD; Sun, 4 Nov 2018 13:52:05 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1541339525; bh=D7MEvnKmYygvDR6ngqCQunnaJSTv0vQPyO+z41kwuJY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Fc0vsn8N0v+K/v5EL64g7bY9WYuJaIE3tR7Gdb30pd2fiQVy8tF4aZZmiA81O7Fus 1RADBaOUkzV3ZRR1BDp/A3Y4aTy6tV7SEKQxoqG9Tkqmecw0Mb51o9h+q1MJPpnUtR rc6cCK9LczlbDP/SNGEBNsuWene1k6pcdtgeg9xo= From: Sasha Levin To: stable@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Masami Hiramatsu , Steven Rostedt , Sasha Levin Subject: [PATCH AUTOSEL 4.19 19/57] tracing/kprobes: Check the probe on unloaded module correctly Date: Sun, 4 Nov 2018 08:51:06 -0500 Message-Id: <20181104135144.88324-19-sashal@kernel.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20181104135144.88324-1-sashal@kernel.org> References: <20181104135144.88324-1-sashal@kernel.org> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Masami Hiramatsu [ Upstream commit 59158ec4aef7d44be51a6f3e7e17fc64c32604eb ] Current kprobe event doesn't checks correctly whether the given event is on unloaded module or not. It just checks the event has ":" in the name. That is not enough because if we define a probe on non-exist symbol on loaded module, it allows to define that (with warning message) To ensure it correctly, this searches the module name on loaded module list and only if there is not, it allows to define it. (this event will be available when the target module is loaded) Link: http://lkml.kernel.org/r/153547309528.26502.8300278470528281328.stgit@devbox Signed-off-by: Masami Hiramatsu Signed-off-by: Steven Rostedt (VMware) Signed-off-by: Sasha Levin --- kernel/trace/trace_kprobe.c | 39 ++++++++++++++++++++++++------------- 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/kernel/trace/trace_kprobe.c b/kernel/trace/trace_kprobe.c index c30032367aab..f9a0cd094b81 100644 --- a/kernel/trace/trace_kprobe.c +++ b/kernel/trace/trace_kprobe.c @@ -61,9 +61,23 @@ static nokprobe_inline bool trace_kprobe_within_module(struct trace_kprobe *tk, return strncmp(mod->name, name, len) == 0 && name[len] == ':'; } -static nokprobe_inline bool trace_kprobe_is_on_module(struct trace_kprobe *tk) +static nokprobe_inline bool trace_kprobe_module_exist(struct trace_kprobe *tk) { - return !!strchr(trace_kprobe_symbol(tk), ':'); + char *p; + bool ret; + + if (!tk->symbol) + return false; + p = strchr(tk->symbol, ':'); + if (!p) + return true; + *p = '\0'; + mutex_lock(&module_mutex); + ret = !!find_module(tk->symbol); + mutex_unlock(&module_mutex); + *p = ':'; + + return ret; } static nokprobe_inline unsigned long trace_kprobe_nhit(struct trace_kprobe *tk) @@ -554,19 +568,13 @@ static int __register_trace_kprobe(struct trace_kprobe *tk) else ret = register_kprobe(&tk->rp.kp); - if (ret == 0) + if (ret == 0) { tk->tp.flags |= TP_FLAG_REGISTERED; - else { - if (ret == -ENOENT && trace_kprobe_is_on_module(tk)) { - pr_warn("This probe might be able to register after target module is loaded. Continue.\n"); - ret = 0; - } else if (ret == -EILSEQ) { - pr_warn("Probing address(0x%p) is not an instruction boundary.\n", - tk->rp.kp.addr); - ret = -EINVAL; - } + } else if (ret == -EILSEQ) { + pr_warn("Probing address(0x%p) is not an instruction boundary.\n", + tk->rp.kp.addr); + ret = -EINVAL; } - return ret; } @@ -629,6 +637,11 @@ static int register_trace_kprobe(struct trace_kprobe *tk) /* Register k*probe */ ret = __register_trace_kprobe(tk); + if (ret == -ENOENT && !trace_kprobe_module_exist(tk)) { + pr_warn("This probe might be able to register after target module is loaded. Continue.\n"); + ret = 0; + } + if (ret < 0) unregister_kprobe_event(tk); else -- 2.17.1