summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVincent Sanders <vince@kyllikki.org>2019-08-12 12:13:09 +0100
committerVincent Sanders <vince@kyllikki.org>2019-08-12 11:16:12 +0100
commita3c3b2fa976a0679b40c85c3afb89e66cd8d1bfb (patch)
tree8ea74fafab6992708fef05ed0a3bc20e0cfddee6
parentef75d670d6537ac1bdf46c363843e801005907b2 (diff)
downloadnetsurf-a3c3b2fa976a0679b40c85c3afb89e66cd8d1bfb.tar.gz
netsurf-a3c3b2fa976a0679b40c85c3afb89e66cd8d1bfb.tar.bz2
make internal url navigation check safe
-rw-r--r--desktop/browser_window.c52
1 files changed, 38 insertions, 14 deletions
diff --git a/desktop/browser_window.c b/desktop/browser_window.c
index a6d3ae92c..acefc7854 100644
--- a/desktop/browser_window.c
+++ b/desktop/browser_window.c
@@ -2302,6 +2302,40 @@ browser_window_drop_file_at_point_internal(struct browser_window *bw,
}
+/**
+ * Check if this is an internal navigation URL.
+ *
+ * This safely checks if the given url is an internal navigation even
+ * for urls with no scheme or path.
+ *
+ * \param url The URL to check
+ * \return true if an internal navigation url else false
+ */
+static bool
+is_internal_navigate_url(nsurl *url)
+{
+ bool is_internal = false;
+ lwc_string *scheme, *path;
+
+ scheme = nsurl_get_component(url, NSURL_SCHEME);
+ if (scheme != NULL) {
+ path = nsurl_get_component(url, NSURL_PATH);
+ if (path != NULL) {
+ if (scheme == corestring_lwc_about) {
+ if (path == corestring_lwc_query_auth) {
+ is_internal = true;
+ } else if (path == corestring_lwc_query_ssl) {
+ is_internal = true;
+ }
+ }
+ lwc_string_unref(path);
+ }
+ lwc_string_unref(scheme);
+ }
+ return is_internal;
+}
+
+
/* exported interface, documented in netsurf/browser_window.h */
nserror
browser_window_get_name(struct browser_window *bw, const char **out_name)
@@ -3050,27 +3084,17 @@ browser_window_navigate(struct browser_window *bw,
nserror error;
bool is_internal = false;
struct browser_fetch_parameters params, *pass_params = NULL;
- lwc_string *scheme, *path;
assert(bw);
assert(url);
NSLOG(netsurf, INFO, "bw %p, url %s", bw, nsurl_access(url));
- /* Check if this is an internal navigation URL, if so, we do not
- * do certain things during the load
+ /*
+ * determine if navigation is internal url, if so, we do not
+ * do certain things during the load.
*/
- scheme = nsurl_get_component(url, NSURL_SCHEME);
- path = nsurl_get_component(url, NSURL_PATH);
- if (scheme == corestring_lwc_about) {
- if (path == corestring_lwc_query_auth) {
- is_internal = true;
- } else if (path == corestring_lwc_query_ssl) {
- is_internal = true;
- }
- }
- lwc_string_unref(scheme);
- lwc_string_unref(path);
+ is_internal = is_internal_navigate_url(url);
if (is_internal &&
!(flags & BW_NAVIGATE_INTERNAL)) {