[PATCH bpf-next v3 0/2] clean-up for BPF_LOG_KERNEL log level

STALE1713d

Revision v3 of 3 in this series.

8 messages, 4 authors, 2021-11-30 · open the first message on its own page

[PATCH bpf-next v3 0/2] clean-up for BPF_LOG_KERNEL log level

From: Hou Tao <hidden>
Date: 2021-11-02 10:00:22

Hi,

There are just two clean-up patches for BPF_LOG_KERNEL log level:
patch #1 fixes the possible extra newline for bpf_log() and removes
the unnecessary calculation and truncation, and patch #2 disallows
BPF_LOG_KERNEL log level for bpf_btf_load().

Comments are welcome.

Regards,
Tao

Change Log:
v3:
  * rebased on bpf-next
  * address comments from Daniel Borkmann:
    patch #1: add prefix "BPF: " instead of "BPF:" for error message
    patch #2: remove uncessary parenthesis, keep the max buffer length
              setting of btf verifier, and add Fixes tag.

v2: https://www.spinics.net/lists/bpf/msg48809.html
  * rebased on bpf-next
  * patch #1: add a trailing newline if needed (suggested by Martin)
  * add patch #2
 
v1: https://www.spinics.net/lists/bpf/msg48550.html

Hou Tao (2):
  bpf: clean-up bpf_verifier_vlog() for BPF_LOG_KERNEL log level
  bpf: disallow BPF_LOG_KERNEL log level for bpf(BPF_BTF_LOAD)

 include/linux/bpf_verifier.h |  7 +++++++
 kernel/bpf/btf.c             |  3 +--
 kernel/bpf/verifier.c        | 16 +++++++++-------
 3 files changed, 17 insertions(+), 9 deletions(-)

-- 
2.29.2

[PATCH bpf-next v3 1/2] bpf: clean-up bpf_verifier_vlog() for BPF_LOG_KERNEL log level

From: Hou Tao <hidden>
Date: 2021-11-02 10:00:22

An extra newline will output for bpf_log() with BPF_LOG_KERNEL level
as shown below:

[   52.095704] BPF:The function test_3 has 12 arguments. Too many.
[   52.095704]
[   52.096896] Error in parsing func ptr test_3 in struct bpf_dummy_ops

Now all bpf_log() are ended by newline, but not all btf_verifier_log()
are ended by newline, so checking whether or not the log message
has the trailing newline and adding a newline if not.

Also there is no need to calculate the left userspace buffer size
for kernel log output and to truncate the output by '\0' which
has already been done by vscnprintf(), so only do these for
userspace log output.

Signed-off-by: Hou Tao <redacted>
---
 kernel/bpf/verifier.c | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c
index a4b48bd4e3ca..77beaa46329a 100644
--- a/kernel/bpf/verifier.c
+++ b/kernel/bpf/verifier.c
@@ -299,13 +299,15 @@ void bpf_verifier_vlog(struct bpf_verifier_log *log, const char *fmt,
 	WARN_ONCE(n >= BPF_VERIFIER_TMP_LOG_SIZE - 1,
 		  "verifier log line truncated - local buffer too short\n");
 
-	n = min(log->len_total - log->len_used - 1, n);
-	log->kbuf[n] = '\0';
-
 	if (log->level == BPF_LOG_KERNEL) {
-		pr_err("BPF:%s\n", log->kbuf);
+		bool newline = n > 0 && log->kbuf[n - 1] == '\n';
+
+		pr_err("BPF: %s%s", log->kbuf, newline ? "" : "\n");
 		return;
 	}
+
+	n = min(log->len_total - log->len_used - 1, n);
+	log->kbuf[n] = '\0';
 	if (!copy_to_user(log->ubuf + log->len_used, log->kbuf, n + 1))
 		log->len_used += n;
 	else
-- 
2.29.2

[PATCH bpf-next v3 2/2] bpf: disallow BPF_LOG_KERNEL log level for bpf(BPF_BTF_LOAD)

From: Hou Tao <hidden>
Date: 2021-11-02 10:00:25

BPF_LOG_KERNEL is only used internally, so disallow bpf_btf_load()
to set log level as BPF_LOG_KERNEL. The same checking has already
been done in bpf_check(), so factor out a helper to check the
validity of log attributes and use it in both places.

Fixes: 8580ac9404f6 ("bpf: Process in-kernel BTF")
Signed-off-by: Hou Tao <redacted>
---
 include/linux/bpf_verifier.h | 7 +++++++
 kernel/bpf/btf.c             | 3 +--
 kernel/bpf/verifier.c        | 6 +++---
 3 files changed, 11 insertions(+), 5 deletions(-)
diff --git a/include/linux/bpf_verifier.h b/include/linux/bpf_verifier.h
index c8a78e830fca..a3d17601a5a7 100644
--- a/include/linux/bpf_verifier.h
+++ b/include/linux/bpf_verifier.h
@@ -396,6 +396,13 @@ static inline bool bpf_verifier_log_needed(const struct bpf_verifier_log *log)
 		 log->level == BPF_LOG_KERNEL);
 }
 
+static inline bool
+bpf_verifier_log_attr_valid(const struct bpf_verifier_log *log, u32 max_total)
+{
+	return log->len_total >= 128 && log->len_total <= max_total &&
+	       log->level && log->ubuf && !(log->level & ~BPF_LOG_MASK);
+}
+
 #define BPF_MAX_SUBPROGS 256
 
 struct bpf_subprog_info {
diff --git a/kernel/bpf/btf.c b/kernel/bpf/btf.c
index dbc3ad07e21b..657c6b48c616 100644
--- a/kernel/bpf/btf.c
+++ b/kernel/bpf/btf.c
@@ -4460,8 +4460,7 @@ static struct btf *btf_parse(bpfptr_t btf_data, u32 btf_data_size,
 		log->len_total = log_size;
 
 		/* log attributes have to be sane */
-		if (log->len_total < 128 || log->len_total > UINT_MAX >> 8 ||
-		    !log->level || !log->ubuf) {
+		if (!bpf_verifier_log_attr_valid(log, UINT_MAX >> 8)) {
 			err = -EINVAL;
 			goto errout;
 		}
diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c
index 77beaa46329a..19a52ff384ec 100644
--- a/kernel/bpf/verifier.c
+++ b/kernel/bpf/verifier.c
@@ -13935,11 +13935,11 @@ int bpf_check(struct bpf_prog **prog, union bpf_attr *attr, bpfptr_t uattr)
 		log->ubuf = (char __user *) (unsigned long) attr->log_buf;
 		log->len_total = attr->log_size;
 
-		ret = -EINVAL;
 		/* log attributes have to be sane */
-		if (log->len_total < 128 || log->len_total > UINT_MAX >> 2 ||
-		    !log->level || !log->ubuf || log->level & ~BPF_LOG_MASK)
+		if (!bpf_verifier_log_attr_valid(log, UINT_MAX >> 2)) {
+			ret = -EINVAL;
 			goto err_unlock;
+		}
 	}
 
 	if (IS_ERR(btf_vmlinux)) {
-- 
2.29.2

Re: [PATCH bpf-next v3 1/2] bpf: clean-up bpf_verifier_vlog() for BPF_LOG_KERNEL log level

From: Yonghong Song <hidden>
Date: 2021-11-02 17:27:41


On 11/2/21 3:15 AM, Hou Tao wrote:
An extra newline will output for bpf_log() with BPF_LOG_KERNEL level
as shown below:

[   52.095704] BPF:The function test_3 has 12 arguments. Too many.
[   52.095704]
[   52.096896] Error in parsing func ptr test_3 in struct bpf_dummy_ops

Now all bpf_log() are ended by newline, but not all btf_verifier_log()
are ended by newline, so checking whether or not the log message
has the trailing newline and adding a newline if not.

Also there is no need to calculate the left userspace buffer size
for kernel log output and to truncate the output by '\0' which
has already been done by vscnprintf(), so only do these for
userspace log output.

Signed-off-by: Hou Tao <redacted>
Acked-by: Yonghong Song <redacted>

Re: [PATCH bpf-next v3 2/2] bpf: disallow BPF_LOG_KERNEL log level for bpf(BPF_BTF_LOAD)

From: Yonghong Song <hidden>
Date: 2021-11-02 17:39:07


On 11/2/21 3:15 AM, Hou Tao wrote:
BPF_LOG_KERNEL is only used internally, so disallow bpf_btf_load()
to set log level as BPF_LOG_KERNEL. The same checking has already
been done in bpf_check(), so factor out a helper to check the
validity of log attributes and use it in both places.

Fixes: 8580ac9404f6 ("bpf: Process in-kernel BTF")
Signed-off-by: Hou Tao <redacted>
Acked-by: Yonghong Song <redacted>

Re: [PATCH bpf-next v3 0/2] clean-up for BPF_LOG_KERNEL log level

From: Martin KaFai Lau <hidden>
Date: 2021-11-02 17:51:46

On Tue, Nov 02, 2021 at 06:15:34PM +0800, Hou Tao wrote:
There are just two clean-up patches for BPF_LOG_KERNEL log level:
patch #1 fixes the possible extra newline for bpf_log() and removes
the unnecessary calculation and truncation, and patch #2 disallows
BPF_LOG_KERNEL log level for bpf_btf_load().
Acked-by: Martin KaFai Lau <redacted>

Re: [PATCH bpf-next v3 0/2] clean-up for BPF_LOG_KERNEL log level

From: Hou Tao <hidden>
Date: 2021-11-30 11:49:22

Hi Alexei,

Could you please pick the patchset for v5.16 ?

On 11/2/2021 6:15 PM, Hou Tao wrote:
Hi,

There are just two clean-up patches for BPF_LOG_KERNEL log level:
patch #1 fixes the possible extra newline for bpf_log() and removes
the unnecessary calculation and truncation, and patch #2 disallows
BPF_LOG_KERNEL log level for bpf_btf_load().

Comments are welcome.

Regards,
Tao

Change Log:
v3:
  * rebased on bpf-next
  * address comments from Daniel Borkmann:
    patch #1: add prefix "BPF: " instead of "BPF:" for error message
    patch #2: remove uncessary parenthesis, keep the max buffer length
              setting of btf verifier, and add Fixes tag.

v2: https://www.spinics.net/lists/bpf/msg48809.html
  * rebased on bpf-next
  * patch #1: add a trailing newline if needed (suggested by Martin)
  * add patch #2
 
v1: https://www.spinics.net/lists/bpf/msg48550.html

Hou Tao (2):
  bpf: clean-up bpf_verifier_vlog() for BPF_LOG_KERNEL log level
  bpf: disallow BPF_LOG_KERNEL log level for bpf(BPF_BTF_LOAD)

 include/linux/bpf_verifier.h |  7 +++++++
 kernel/bpf/btf.c             |  3 +--
 kernel/bpf/verifier.c        | 16 +++++++++-------
 3 files changed, 17 insertions(+), 9 deletions(-)

Re: [PATCH bpf-next v3 0/2] clean-up for BPF_LOG_KERNEL log level

From: Alexei Starovoitov <hidden>
Date: 2021-11-30 19:33:07

On Tue, Nov 30, 2021 at 3:48 AM Hou Tao [off-list ref] wrote:
Hi Alexei,

Could you please pick the patchset for v5.16 ?
Sorry it got lost in patchwork.
Please resubmit.
On 11/2/2021 6:15 PM, Hou Tao wrote:
quoted
Hi,

There are just two clean-up patches for BPF_LOG_KERNEL log level:
patch #1 fixes the possible extra newline for bpf_log() and removes
the unnecessary calculation and truncation, and patch #2 disallows
BPF_LOG_KERNEL log level for bpf_btf_load().

Comments are welcome.

Regards,
Tao

Change Log:
v3:
  * rebased on bpf-next
  * address comments from Daniel Borkmann:
    patch #1: add prefix "BPF: " instead of "BPF:" for error message
    patch #2: remove uncessary parenthesis, keep the max buffer length
              setting of btf verifier, and add Fixes tag.

v2: https://www.spinics.net/lists/bpf/msg48809.html
  * rebased on bpf-next
  * patch #1: add a trailing newline if needed (suggested by Martin)
  * add patch #2

v1: https://www.spinics.net/lists/bpf/msg48550.html

Hou Tao (2):
  bpf: clean-up bpf_verifier_vlog() for BPF_LOG_KERNEL log level
  bpf: disallow BPF_LOG_KERNEL log level for bpf(BPF_BTF_LOAD)

 include/linux/bpf_verifier.h |  7 +++++++
 kernel/bpf/btf.c             |  3 +--
 kernel/bpf/verifier.c        | 16 +++++++++-------
 3 files changed, 17 insertions(+), 9 deletions(-)
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help