]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
fts-solr: Append '/' to URL path when missing in configuration
authorMartti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
Tue, 26 Jun 2018 09:38:50 +0000 (12:38 +0300)
committerAki Tuomi <aki.tuomi@dovecot.fi>
Tue, 7 Aug 2018 11:10:08 +0000 (14:10 +0300)
This fixes a crash when url parameter has empty path like
http://localhost:8080 instead of http://localhost:8080/ and makes using
url like http://localhost:8080/solr behave the same as
http://localhost:8080/solr/

src/plugins/fts-solr/solr-connection.c

index 3d1546e48ad4f085b6054a354116a18a29812609..947ea76af2067c37b025a02451e85f7a2c97d465 100644 (file)
@@ -101,6 +101,20 @@ static int solr_xml_parse(struct solr_connection *conn,
        return 0;
 }
 
+/* Regardless of the specified URL, make sure path ends in '/' */
+static char *solr_connection_create_http_base_url(struct http_url *http_url)
+{
+       if (http_url->path == NULL)
+               return i_strconcat("/", http_url->enc_query, NULL);
+       size_t len = strlen(http_url->path);
+       if (len > 0 && http_url->path[len-1] != '/')
+               return i_strconcat(http_url->path, "/",
+                                  http_url->enc_query, NULL);
+       /* http_url->path is NULL on empty path, so this is impossible. */
+       i_assert(len != 0);
+       return i_strconcat(http_url->path, http_url->enc_query, NULL);
+}
+
 int solr_connection_init(const char *url,
                         const struct ssl_iostream_settings *ssl_client_set,
                         bool debug, struct solr_connection **conn_r,
@@ -121,7 +135,7 @@ int solr_connection_init(const char *url,
        conn = i_new(struct solr_connection, 1);
        conn->http_host = i_strdup(http_url->host.name);
        conn->http_port = http_url->port;
-       conn->http_base_url = i_strconcat(http_url->path, http_url->enc_query, NULL);
+       conn->http_base_url = solr_connection_create_http_base_url(http_url);
        conn->http_ssl = http_url->have_ssl;
        if (http_url->user != NULL) {
                conn->http_user = i_strdup(http_url->user);