Module Name: src Committed By: msaitoh Date: Fri Jun 23 05:40:02 UTC 2023
Modified Files: src/usr.sbin/sysinst [netbsd-10]: main.c Log Message: Pull up following revision(s) (requested by martin in ticket #212): usr.sbin/sysinst/main.c: revision 1.31 If the install medium does not come with any openssl trusted root certs, tell ftp(1) not to verify trust chains when doing https downloads. To generate a diff of this commit: cvs rdiff -u -r1.30 -r1.30.2.1 src/usr.sbin/sysinst/main.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/usr.sbin/sysinst/main.c diff -u src/usr.sbin/sysinst/main.c:1.30 src/usr.sbin/sysinst/main.c:1.30.2.1 --- src/usr.sbin/sysinst/main.c:1.30 Sun Jul 10 10:52:40 2022 +++ src/usr.sbin/sysinst/main.c Fri Jun 23 05:40:02 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: main.c,v 1.30 2022/07/10 10:52:40 martin Exp $ */ +/* $NetBSD: main.c,v 1.30.2.1 2023/06/23 05:40:02 msaitoh Exp $ */ /* * Copyright 1997 Piermont Information Systems Inc. @@ -97,6 +97,7 @@ __dead static void miscsighandler(int); static void ttysighandler(int); static void cleanup(void); static void process_f_flag(char *); +static bool no_openssl_trust_anchors_available(void); static int exit_cleanly = 0; /* Did we finish nicely? */ FILE *logfp; /* log file */ @@ -264,6 +265,10 @@ main(int argc, char **argv) /* Initialize the partitioning subsystem */ partitions_init(); + /* do we need to tell ftp(1) to avoid checking certificate chains? */ + if (no_openssl_trust_anchors_available()) + setenv("FTPSSLNOVERIFY", "1", 1); + /* initialize message window */ if (menu_init()) { __menu_initerror(); @@ -635,3 +640,46 @@ process_f_flag(char *f_name) fclose(fp); } + +/* + * return true if we do not have any root certificates installed, + * so can not verify any trust chain. + * We rely on /etc/openssl being the OPENSSLDIR and test the + * "all in one" /etc/openssl/cert.pem first, if that is not found + * check if there are multiple regular files or symlinks in + * /etc/openssl/certs/. + */ +static bool +no_openssl_trust_anchors_available(void) +{ + struct stat sb; + DIR *dir; + struct dirent *ent; + size_t cnt; + + /* check the omnibus single file variant first */ + if (stat("/etc/openssl/cert.pem", &sb) == 0 && + S_ISREG(sb.st_mode) && sb.st_size > 0) + return false; /* exists and is a non-empty file */ + + /* look for files/symlinks in the certs subdirectory */ + dir = opendir("/etc/openssl/certs"); + if (dir == NULL) + return true; + for (cnt = 0; cnt < 2; ) { + ent = readdir(dir); + if (ent == NULL) + break; + switch (ent->d_type) { + case DT_REG: + case DT_LNK: + cnt++; + break; + default: + break; + } + } + closedir(dir); + + return cnt < 2; +}