From: Mario Rugiero <mrugi...@gmail.com>

In cases where a parameter is passed to an URI search but
the corresponding value is missing, libfm users (PCManFM)
would crash or worse due to assuming value to be valid.
Since all of the params depend on this value, the reasonable
fix seems to be an early break or continue.
---
 src/modules/vfs-search.c | 36 +++++++++++++++++++++++++-----------
 1 file changed, 25 insertions(+), 11 deletions(-)

diff --git a/src/modules/vfs-search.c b/src/modules/vfs-search.c
index 57a375c..64344f2 100644
--- a/src/modules/vfs-search.c
+++ b/src/modules/vfs-search.c
@@ -464,21 +464,35 @@ static void parse_search_uri(FmVfsSearchEnumerator* priv, 
const char* uri_str)
                 char* value = strchr(params, '=');
                 char* sep = strchr(params, '&');
 
-                if (value && (sep == NULL || value < sep))
+                /* If there's no value, the whole param is crippled.
+                 * At the very least, that's the case for how currently
+                 * supported params work.
+                 */
+                if (value == NULL && sep == NULL)
                 {
-                    name = g_strndup(params, value - params);
-                    if (sep)
-                        value = g_uri_unescape_segment(value+1, sep, NULL);
-                    else
-                        value = g_uri_unescape_string(value+1, NULL);
+                    /* sep == NULL means this is the last parameter. */
+                    break;
                 }
-                else if (sep)
+                else if (value == NULL)
                 {
-                    name = g_strndup(params, sep - params);
-                    value = NULL;
+                    /* No value, but still more params later. */
+                    params = sep + 1;
+                    continue;
+                }
+                else if (value >= sep)
+                {
+                    /* We found a value, but it's for a later param, as it's
+                     * after the next sep.
+                     */
+                    params = sep + 1;
+                    continue;
                 }
-                else /* value == NULL && sep == NULL */
-                    name = g_strdup(params);
+
+                name = g_strndup(params, value - params);
+                if (sep)
+                    value = g_uri_unescape_segment(value+1, sep, NULL);
+                else
+                    value = g_uri_unescape_string(value+1, NULL);
 
                 /* g_printf("parameter name/value: %s = %s\n", name, value); */
 
-- 
2.17.1



_______________________________________________
Lxde-list mailing list
Lxde-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/lxde-list

Reply via email to