Em Mon, Feb 08, 2021 at 09:08:49PM +0100, Jiri Olsa escreveu:
> +__maybe_unused
> +static int send_cmd(struct daemon *daemon, union cmd *cmd)
> +{
> +     int ret = -1, fd;
> +     char *line = NULL;
> +     size_t len = 0;
> +     ssize_t nread;
> +     FILE *in = NULL;
> +
> +     if (setup_client_config(daemon))
> +             return -1;
> +
> +     fd = setup_client_socket(daemon);
> +     if (fd < 0)
> +             return -1;
> +
> +     if (sizeof(*cmd) != writen(fd, cmd, sizeof(*cmd))) {
> +             perror("failed: write");
> +             goto out;
> +     }
> +
> +     in = fdopen(fd, "r");
> +     if (!in) {
> +             perror("failed: fdopen");
> +             goto out;
> +     }
> +
> +     while ((nread = getline(&line, &len, in)) != -1) {
> +             fwrite(line, nread, 1, stdout);
> +             fflush(stdout);
> +     }
> +
> +     ret = 0;
> +     fclose(in);
> +out:
> +     /* If in is defined, then fd is closed via fclose. */
> +     if (!in)
> +             close(fd);
> +     return ret;
> +}
> +

So I had to add the patch below to deal with this in some systems:

  cc1: warnings being treated as errors
  builtin-daemon.c: In function 'send_cmd':  MKDIR    /tmp/build/perf/bench/
  
  builtin-daemon.c:1368: error: ignoring return value of 'fwrite', declared 
with attribute warn_unused_result
    MKDIR    /tmp/build/perf/tests/
  make[3]: *** [/tmp/build/perf/builtin-daemon.o] Error 1

And also to not leak the 'line' buffer allocated by getline(), since you
initialized line to NULL and len to zero, man page says:

         If *lineptr is set to NULL and *n is set 0 before the call,
         then getline() will allocate a buffer for storing the line.
         This buffer should be freed by the user program even if
         getline() failed.


diff --git a/tools/perf/builtin-daemon.c b/tools/perf/builtin-daemon.c
index e0880c5ee39c89bd..0a282c4e23a9fd9a 100644
--- a/tools/perf/builtin-daemon.c
+++ b/tools/perf/builtin-daemon.c
@@ -344,12 +344,15 @@ static int send_cmd(struct daemon *daemon, union cmd *cmd)
        }
 
        while ((nread = getline(&line, &len, in)) != -1) {
-               fwrite(line, nread, 1, stdout);
+               if (fwrite(line, nread, 1, stdout) != 1)
+                       goto out_fclose;
                fflush(stdout);
        }
 
        ret = 0;
+out_fclose:
        fclose(in);
+       free(line);
 out:
        /* If in is defined, then fd is closed via fclose. */
        if (!in)

Reply via email to