BUG/MINOR: ssl: Prevent disk access when using "add ssl crt-list"

If an unknown CA file was first mentioned in an "add ssl crt-list" CLI
command, it would result in a call to X509_STORE_load_locations which
performs a disk access which is forbidden during runtime. The same would
happen if a "ca-verify-file" or "crl-file" was specified. This was due
to the fact that the crt-list file parsing and the crt-list related CLI
commands parsing use the same functions.
The patch simply adds a new parameter to all the ssl_bind parsing
functions so that they know if the call is made during init or by the
CLI, and the ssl_store_load_locations function can then reject any new
cafile_entry creation coming from a CLI call.

It can be backported as far as 2.2.

(cherry picked from commit fb00f31af4ba67c69a12807729514a2bdcd47efa)
Signed-off-by: Christopher Faulet <cfaulet@haproxy.com>
diff --git a/src/ssl_sock.c b/src/ssl_sock.c
index bd7b51b..10e2f44 100644
--- a/src/ssl_sock.c
+++ b/src/ssl_sock.c
@@ -300,11 +300,16 @@
 	return NULL;
 }
 
-int ssl_store_load_locations_file(char *path)
+int ssl_store_load_locations_file(char *path, int create_if_none)
 {
-	if (ssl_store_get0_locations_file(path) == NULL) {
+	X509_STORE *store = ssl_store_get0_locations_file(path);
+
+	/* If this function is called by the CLI, we should not call the
+	 * X509_STORE_load_locations function because it performs forbidden disk
+	 * accesses. */
+	if (!store && create_if_none) {
 		struct cafile_entry *ca_e;
-		X509_STORE *store = X509_STORE_new();
+		store = X509_STORE_new();
 		if (X509_STORE_load_locations(store, path, NULL)) {
 			int pathlen;
 			pathlen = strlen(path);
@@ -313,13 +318,13 @@
 				memcpy(ca_e->path, path, pathlen + 1);
 				ca_e->ca_store = store;
 				ebst_insert(&cafile_tree, &ca_e->node);
-				return 1;
 			}
+		} else {
+			X509_STORE_free(store);
+			store = NULL;
 		}
-		X509_STORE_free(store);
-		return 0;
 	}
-	return 1;
+	return (store != NULL);
 }
 
 /* mimic what X509_STORE_load_locations do with store_ctx */