Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp5136615imu; Tue, 8 Jan 2019 12:10:16 -0800 (PST) X-Google-Smtp-Source: ALg8bN6NrgzsC7gr6EtTYkR2DOLuPHUrxSNUER9AZZBMI56uB3DcDSxwUeR9F6z45A5VI7gLHEF6 X-Received: by 2002:a63:ff62:: with SMTP id s34mr2759501pgk.325.1546978216193; Tue, 08 Jan 2019 12:10:16 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1546978216; cv=none; d=google.com; s=arc-20160816; b=FT5Y340j4IYOydQCLy7FlwdE/OZz39PnO1W1SDvhbZMfwda6vTiinkhyvtWHqo4JrI /cF2UVaqplB9NiQNu1It2vWLvHrzIOMaWWHZMvQMBKk6U9dOEKSeVYjvPKlrOMq+XBTl /YNjCkKvZ7R5QUH2lolWzoTd2+5NUs4iVwedxli2YqWZSj9hS7MH1j0XT+O+CZP1CETD /ka2ykevI8hOllBw5dJnusm4wVbvFFiq57fE72ASfQCs0Upph9Jnf3gGoRp9jcDcEv0q d5u4TvXHVkvabs1BA7NXtPJgIIKlKyx/DgxqYf6rVSEn9ou5Ck+GWYnT7n3r+nh5eg4Y ryeA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=/XeXg83XK7/tpzFq5MePPsTBAgX0jnsVV6CA1K4HHss=; b=X7RXLMR9lb4yT8JArFjBfJPzS6QuMGrN1A56anhSkOlutuB6mZh4WwaHw/lt/Nk8de YM0MVVQVTUwAMOo2YGY162LOr2lGdUjCGeQJEGQhwwLHdixE7QiuSyWv4zpKa5KZmZpS UkrdZ3kUbJ+o6lWZ0tOpvMclzDDZAf4MiSnd6/j6cjXXSN2NzV9DvtZHrPXFpwz8hZkO A29SYoFjkN5PKyHlyShYsvE1rjpWEd/ssxPFHlkyONPMRiClRgo+WpZmf6Y3HLvAxGMn Nk8caLOIQ+wx3H5UwFwnnLuy9nQT0xOMQuHNBUfpcxJ/8yGSXUGz0IkU8Prwfz4V4H8R D0pA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=wsurmlxC; 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 v16si35986842pgg.290.2019.01.08.12.10.00; Tue, 08 Jan 2019 12:10:16 -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=wsurmlxC; 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 S1729699AbfAHT1a (ORCPT + 99 others); Tue, 8 Jan 2019 14:27:30 -0500 Received: from mail.kernel.org ([198.145.29.99]:33532 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729619AbfAHT1Y (ORCPT ); Tue, 8 Jan 2019 14:27:24 -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 96F1C2176F; Tue, 8 Jan 2019 19:27:22 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1546975643; bh=IRPOWe/6aYzrVVGq+urfv6B6FdjKWiCQTZVHs+aznx8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=wsurmlxCPoIGqCwrzvRv7YfNAiwxxZJL322I+JsFmGjFa6aN2nnNgo/w0YuwNOusK KMczkzW45cILxvbXNDWpket71X+ZlgaJYqcyFoYkgXcgVLdLi+sRJBfYgCEJwN9F6j S13AoCvi4FL7skD1elhJQ94itOdWAd0RSw/w7mzc= From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: "Daniel T. Lee" , Daniel Borkmann , Sasha Levin , netdev@vger.kernel.org Subject: [PATCH AUTOSEL 4.20 029/117] samples: bpf: fix: error handling regarding kprobe_events Date: Tue, 8 Jan 2019 14:24:57 -0500 Message-Id: <20190108192628.121270-29-sashal@kernel.org> X-Mailer: git-send-email 2.19.1 In-Reply-To: <20190108192628.121270-1-sashal@kernel.org> References: <20190108192628.121270-1-sashal@kernel.org> MIME-Version: 1.0 X-Patchwork-Hint: Ignore Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: "Daniel T. Lee" [ Upstream commit 5a863813216ce79e16a8c1503b2543c528b778b6 ] Currently, kprobe_events failure won't be handled properly. Due to calling system() indirectly to write to kprobe_events, it can't be identified whether an error is derived from kprobe or system. // buf = "echo '%c:%s %s' >> /s/k/d/t/kprobe_events" err = system(buf); if (err < 0) { printf("failed to create kprobe .."); return -1; } For example, running ./tracex7 sample in ext4 partition, "echo p:open_ctree open_ctree >> /s/k/d/t/kprobe_events" gets 256 error code system() failure. => The error comes from kprobe, but it's not handled correctly. According to man of system(3), it's return value just passes the termination status of the child shell rather than treating the error as -1. (don't care success) Which means, currently it's not working as desired. (According to the upper code snippet) ex) running ./tracex7 with ext4 env. # Current Output sh: echo: I/O error failed to open event open_ctree # Desired Output failed to create kprobe 'open_ctree' error 'No such file or directory' The problem is, error can't be verified whether from child ps or system. But using write() directly can verify the command failure, and it will treat all error as -1. So I suggest using write() directly to 'kprobe_events' rather than calling system(). Signed-off-by: Daniel T. Lee Signed-off-by: Daniel Borkmann Signed-off-by: Sasha Levin --- samples/bpf/bpf_load.c | 33 ++++++++++++++++++++++++--------- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/samples/bpf/bpf_load.c b/samples/bpf/bpf_load.c index e6d7e0fe155b..96783207de4a 100644 --- a/samples/bpf/bpf_load.c +++ b/samples/bpf/bpf_load.c @@ -54,6 +54,23 @@ static int populate_prog_array(const char *event, int prog_fd) return 0; } +static int write_kprobe_events(const char *val) +{ + int fd, ret, flags; + + if ((val != NULL) && (val[0] == '\0')) + flags = O_WRONLY | O_TRUNC; + else + flags = O_WRONLY | O_APPEND; + + fd = open("/sys/kernel/debug/tracing/kprobe_events", flags); + + ret = write(fd, val, strlen(val)); + close(fd); + + return ret; +} + static int load_and_attach(const char *event, struct bpf_insn *prog, int size) { bool is_socket = strncmp(event, "socket", 6) == 0; @@ -165,10 +182,9 @@ static int load_and_attach(const char *event, struct bpf_insn *prog, int size) #ifdef __x86_64__ if (strncmp(event, "sys_", 4) == 0) { - snprintf(buf, sizeof(buf), - "echo '%c:__x64_%s __x64_%s' >> /sys/kernel/debug/tracing/kprobe_events", - is_kprobe ? 'p' : 'r', event, event); - err = system(buf); + snprintf(buf, sizeof(buf), "%c:__x64_%s __x64_%s", + is_kprobe ? 'p' : 'r', event, event); + err = write_kprobe_events(buf); if (err >= 0) { need_normal_check = false; event_prefix = "__x64_"; @@ -176,10 +192,9 @@ static int load_and_attach(const char *event, struct bpf_insn *prog, int size) } #endif if (need_normal_check) { - snprintf(buf, sizeof(buf), - "echo '%c:%s %s' >> /sys/kernel/debug/tracing/kprobe_events", - is_kprobe ? 'p' : 'r', event, event); - err = system(buf); + snprintf(buf, sizeof(buf), "%c:%s %s", + is_kprobe ? 'p' : 'r', event, event); + err = write_kprobe_events(buf); if (err < 0) { printf("failed to create kprobe '%s' error '%s'\n", event, strerror(errno)); @@ -519,7 +534,7 @@ static int do_load_bpf_file(const char *path, fixup_map_cb fixup_map) return 1; /* clear all kprobes */ - i = system("echo \"\" > /sys/kernel/debug/tracing/kprobe_events"); + i = write_kprobe_events(""); /* scan over all elf sections to get license and map info */ for (i = 1; i < ehdr.e_shnum; i++) { -- 2.19.1