tls: Fix a crash on invalid cert in non-interactive mode - sacc - sacc(omys), simple console gopher client
git clone git://bitreich.org/sacc/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/sacc/
Log
Files
Refs
Tags
LICENSE
---
commit 5b9bcbd0dcf3cf2c4edb995621de245ce6b80a9d
parent 4003310026b26f9c81b44fb07686e7301064c4bf
Author: Hiltjo Posthuma 
Date:   Wed, 18 Jan 2023 23:52:32 +0100

tls: Fix a crash on invalid cert in non-interactive mode

This is because uiprompt() cannot be used in non-interactive.

To reproduce:

Put a different certificate in ~/.share/sacc/cert/bitreich.org
Then run:

        sacc gophers://bitreich.org > /tmp/plop

Diffstat:
  M common.h                            |       2 ++
  M io_tls.c                            |       5 +++++
  M sacc.c                              |       2 +-

3 files changed, 8 insertions(+), 1 deletion(-)
---
diff --git a/common.h b/common.h
@@ -23,6 +23,8 @@ struct dir {
         size_t curline;
 };
 
+extern int interactive;
+
 extern void (*diag)(char *, ...);
 
 extern void die(const char *, ...);
diff --git a/io_tls.c b/io_tls.c
@@ -210,6 +210,11 @@ connect_tls(struct cnx *c, struct addrinfo *ai, const char *host)
                 diag("Can't establish TLS with \"%s\": %s",
                      host, tls_error(t));
 
+                if (!interactive) {
+                        r = CONN_ABORT;
+                        goto end;
+                }
+
                 if (pem.cert) {
                         s = uiprompt("Save certificate locally and retry? [yN]: ");
                         switch (*s) {
diff --git a/sacc.c b/sacc.c
@@ -49,6 +49,7 @@ enum {
 
 void (*diag)(char *, ...);
 
+int interactive;
 const char ident[] = "@(#) sacc(omys): " VERSION;
 
 static char intbuf[256]; /* 256B ought to be enough for any URI */
@@ -56,7 +57,6 @@ static char *mainurl;
 static Item *mainentry;
 static int devnullfd;
 static int parent = 1;
-static int interactive;
 
 static void
 stddiag(char *fmt, ...)