On Thu, Jan 26, 2017 at 08:54:10AM +0900, Mike Hommey wrote:

> > Implementation-wise, I'd be happier if we do not add any new
> > callsites of strbuf_split(), which is a horrible interface.  But
> > that is a minor detail.
> 
> What would you suggest otherwise?

Try string_list_split() (or its in_place() variant, since it is probably
OK to hack up the string for your use case). Like this:

diff --git a/gpg-interface.c b/gpg-interface.c
index 2768bb307..051bb7d3e 100644
--- a/gpg-interface.c
+++ b/gpg-interface.c
@@ -158,14 +158,16 @@ static int pipe_gpg_command(struct child_process *cmd,
        /* Print out any line that doesn't start with [GNUPG:] if the gpg
         * command failed. */
        if (ret) {
-               struct strbuf **err_lines = strbuf_split(err, '\n');
-               for (struct strbuf **line = err_lines; *line; line++) {
-                       if (memcmp((*line)->buf, "[GNUPG:]", 8)) {
-                               strbuf_rtrim(*line);
-                               fprintf(stderr, "%s\n", (*line)->buf);
-                       }
+               struct string_list lines = STRING_LIST_INIT_NODUP;
+               int i;
+
+               string_list_split_in_place(&lines, err->buf, '\n', 0);
+               for (i = 0; i < lines.nr; i++) {
+                       const char *line = lines.items[i].string;
+                       if (!starts_with(line, "[GNUPG:]"))
+                               fprintf(stderr, "%s\n", line);
                }
-               strbuf_list_free(err_lines);
+               string_list_clear(&lines, 0);
        }
        return ret;
 }

Note that I also replaced the memcmp with starts_with(). That avoids the
magic number "8". I also suspect your original can read off the end of
the buffer when the line is shorter than 8 characters (e.g., if memcmp
does 64-bit loads).

-Peff

Reply via email to