libbpf: Explicitly call write to append content to file
authorLiu Pan <patteliu@gmail.com>
Mon, 20 Mar 2023 03:07:20 +0000 (11:07 +0800)
committerAndrii Nakryiko <andrii@kernel.org>
Mon, 20 Mar 2023 18:59:45 +0000 (11:59 -0700)
Write data to fd by calling "vdprintf", in most implementations
of the standard library, the data is finally written by the writev syscall.
But "uprobe_events/kprobe_events" does not allow segmented writes,
so switch the "append_to_file" function to explicit write() call.

Signed-off-by: Liu Pan <patteliu@gmail.com>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Link: https://lore.kernel.org/bpf/20230320030720.650-1-patteliu@gmail.com
tools/lib/bpf/libbpf.c

index 4c34fbd..149864e 100644 (file)
@@ -9918,16 +9918,20 @@ static int append_to_file(const char *file, const char *fmt, ...)
 {
        int fd, n, err = 0;
        va_list ap;
+       char buf[1024];
+
+       va_start(ap, fmt);
+       n = vsnprintf(buf, sizeof(buf), fmt, ap);
+       va_end(ap);
+
+       if (n < 0 || n >= sizeof(buf))
+               return -EINVAL;
 
        fd = open(file, O_WRONLY | O_APPEND | O_CLOEXEC, 0);
        if (fd < 0)
                return -errno;
 
-       va_start(ap, fmt);
-       n = vdprintf(fd, fmt, ap);
-       va_end(ap);
-
-       if (n < 0)
+       if (write(fd, buf, n) < 0)
                err = -errno;
 
        close(fd);