We'll use `kbuf' for the search object key, since we already use
the `fbuf' term in `struct fbuf'.  This also adds an extra check
for open_memstream(3) failures in case of ENOMEM.
---
 lib/PublicInbox/xap_helper.h | 33 ++++++++++++++++-----------------
 1 file changed, 16 insertions(+), 17 deletions(-)

diff --git a/lib/PublicInbox/xap_helper.h b/lib/PublicInbox/xap_helper.h
index 1380ffd0..0a652abd 100644
--- a/lib/PublicInbox/xap_helper.h
+++ b/lib/PublicInbox/xap_helper.h
@@ -762,7 +762,7 @@ static void dispatch(struct req *req)
        union {
                struct srch *srch;
                char *ptr;
-       } fbuf;
+       } kbuf;
        char *end;
        FILE *kfp;
        struct srch **s;
@@ -776,8 +776,9 @@ static void dispatch(struct req *req)
        }
        if (!req->fn) ABORT("not handled: `%s'", req->argv[0]);
 
-       kfp = open_memstream(&fbuf.ptr, &size);
-       // write padding, first
+       kfp = open_memstream(&kbuf.ptr, &size);
+       if (!kfp) err(EXIT_FAILURE, "open_memstream(kbuf)");
+       // write padding, first (contents don't matter)
        fwrite(&req->argv[0], offsetof(struct srch, paths), 1, kfp);
 
        // global getopt variables:
@@ -824,26 +825,24 @@ static void dispatch(struct req *req)
                default: ABORT("bad switch `-%c'", c);
                }
        }
-       if (ferror(kfp) | fclose(kfp))
+       if (ferror(kfp) | fclose(kfp)) /* sets kbuf.srch */
                err(EXIT_FAILURE, "ferror|fclose"); // likely ENOMEM
-       fbuf.srch->db = NULL;
-       fbuf.srch->qp = NULL;
-       fbuf.srch->paths_len = size - offsetof(struct srch, paths);
-       if (fbuf.srch->paths_len <= 0) {
-               free_srch(fbuf.srch);
+       kbuf.srch->db = NULL;
+       kbuf.srch->qp = NULL;
+       kbuf.srch->paths_len = size - offsetof(struct srch, paths);
+       if (kbuf.srch->paths_len <= 0)
                ABORT("no -d args");
-       }
-       s = (struct srch **)tsearch(fbuf.srch, &srch_tree, srch_cmp);
+       s = (struct srch **)tsearch(kbuf.srch, &srch_tree, srch_cmp);
        if (!s) err(EXIT_FAILURE, "tsearch"); // likely ENOMEM
        req->srch = *s;
-       if (req->srch != fbuf.srch) { // reuse existing
-               free_srch(fbuf.srch);
+       if (req->srch != kbuf.srch) { // reuse existing
+               free_srch(kbuf.srch);
        } else if (!srch_init(req)) {
-               assert(fbuf.srch == *((struct srch **)tfind(
-                                       fbuf.srch, &srch_tree, srch_cmp)));
-               void *del = tdelete(fbuf.srch, &srch_tree, srch_cmp);
+               assert(kbuf.srch == *((struct srch **)tfind(
+                                       kbuf.srch, &srch_tree, srch_cmp)));
+               void *del = tdelete(kbuf.srch, &srch_tree, srch_cmp);
                assert(del);
-               free_srch(fbuf.srch);
+               free_srch(kbuf.srch);
                goto cmd_err; // srch_init already warned
        }
        try {

Reply via email to