summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--desktop/searchweb.c2
-rw-r--r--frontends/atari/file.c2
-rw-r--r--frontends/riscos/gui.c35
-rw-r--r--render/form.c4
-rw-r--r--utils/file.c2
-rw-r--r--utils/url.c65
-rw-r--r--utils/url.h3
7 files changed, 56 insertions, 57 deletions
diff --git a/desktop/searchweb.c b/desktop/searchweb.c
index 41ba062fa..593591cc3 100644
--- a/desktop/searchweb.c
+++ b/desktop/searchweb.c
@@ -240,7 +240,7 @@ make_search_nsurl(struct search_provider *provider,
size_t urlstr_len;
/* escape the search term and join it to the search url */
- ret = url_escape(term, 0, true, NULL, &eterm);
+ ret = url_escape(term, true, NULL, &eterm);
if (ret != NSERROR_OK) {
return ret;
}
diff --git a/frontends/atari/file.c b/frontends/atari/file.c
index 3816e476d..235d8240f 100644
--- a/frontends/atari/file.c
+++ b/frontends/atari/file.c
@@ -193,7 +193,7 @@ static nserror atari_path_to_nsurl(const char *path, struct nsurl **url_out)
}
/* escape the path so it can be placed in a url */
- ret = url_escape(path, 0, false, "/", &escpath);
+ ret = url_escape(path, false, "/", &escpath);
if (ret != NSERROR_OK) {
return ret;
}
diff --git a/frontends/riscos/gui.c b/frontends/riscos/gui.c
index 72eeb6282..7c5216462 100644
--- a/frontends/riscos/gui.c
+++ b/frontends/riscos/gui.c
@@ -1405,7 +1405,7 @@ static nserror ro_path_to_nsurl(const char *path, struct nsurl **url_out)
int spare;
char *canonical_path; /* canonicalised RISC OS path */
char *unix_path; /* unix path */
- char *escurl;
+ char *escaped_path;
os_error *error;
nserror ret;
int urllen;
@@ -1443,31 +1443,34 @@ static nserror ro_path_to_nsurl(const char *path, struct nsurl **url_out)
}
free(canonical_path);
- /* convert the unix path into a url */
- urllen = strlen(unix_path) + FILE_SCHEME_PREFIX_LEN + 1;
+ /* url escape the unix path */
+ ret = url_escape(unix_path, false, "/", &escaped_path);
+ if (ret != NSERROR_OK) {
+ free(unix_path);
+ return ret;
+ }
+ free(unix_path);
+
+ /* convert the escaped unix path into a url */
+ urllen = strlen(escaped_path) + FILE_SCHEME_PREFIX_LEN + 1;
url = malloc(urllen);
if (url == NULL) {
LOG("Unable to allocate url");
- free(unix_path);
+ free(escaped_path);
return NSERROR_NOMEM;
}
- if (*unix_path == '/') {
- snprintf(url, urllen, "%s%s", FILE_SCHEME_PREFIX, unix_path + 1);
+ if (*escaped_path == '/') {
+ snprintf(url, urllen, "%s%s",
+ FILE_SCHEME_PREFIX, escaped_path + 1);
} else {
- snprintf(url, urllen, "%s%s", FILE_SCHEME_PREFIX, unix_path);
+ snprintf(url, urllen, "%s%s",
+ FILE_SCHEME_PREFIX, escaped_path);
}
- free(unix_path);
+ free(escaped_path);
- /* We don't want '/' to be escaped. */
- ret = url_escape(url, FILE_SCHEME_PREFIX_LEN, false, "/", &escurl);
+ ret = nsurl_create(url, url_out);
free(url);
- if (ret != NSERROR_OK) {
- return ret;
- }
-
- ret = nsurl_create(escurl, url_out);
- free(escurl);
return ret;
}
diff --git a/render/form.c b/render/form.c
index f8d0ce5fd..8ae59b5ed 100644
--- a/render/form.c
+++ b/render/form.c
@@ -912,7 +912,7 @@ static char *form_url_encode(struct form *form,
}
for (; control; control = control->next) {
- url_err = url_escape(control->name, 0, true, NULL, &name);
+ url_err = url_escape(control->name, true, NULL, &name);
if (url_err == NSERROR_NOMEM) {
free(s);
return NULL;
@@ -920,7 +920,7 @@ static char *form_url_encode(struct form *form,
assert(url_err == NSERROR_OK);
- url_err = url_escape(control->value, 0, true, NULL, &value);
+ url_err = url_escape(control->value, true, NULL, &value);
if (url_err == NSERROR_NOMEM) {
free(name);
free(s);
diff --git a/utils/file.c b/utils/file.c
index 3ec97dec6..cc82657c9 100644
--- a/utils/file.c
+++ b/utils/file.c
@@ -174,7 +174,7 @@ static nserror posix_path_to_nsurl(const char *path, struct nsurl **url_out)
}
/* escape the path so it can be placed in a url */
- ret = url_escape(path, 0, false, "/", &escpath);
+ ret = url_escape(path, false, "/", &escpath);
if (ret != NSERROR_OK) {
return ret;
}
diff --git a/utils/url.c b/utils/url.c
index d1e9ce2a7..861a62bdc 100644
--- a/utils/url.c
+++ b/utils/url.c
@@ -113,63 +113,60 @@ nserror url_unescape(const char *str, size_t length,
/* exported interface documented in utils/url.h */
-nserror url_escape(const char *unescaped, size_t toskip,
- bool sptoplus, const char *escexceptions, char **result)
+nserror url_escape(const char *unescaped, bool sptoplus,
+ const char *escexceptions, char **result)
{
- size_t len;
- char *escaped, *d, *tmpres;
+ size_t len, new_len;
+ char *escaped, *pos;
const char *c;
- if (!unescaped || !result)
+ if (unescaped == NULL || result == NULL) {
return NSERROR_NOT_FOUND;
-
- *result = NULL;
+ }
len = strlen(unescaped);
- if (len < toskip)
- return NSERROR_NOT_FOUND;
- len -= toskip;
escaped = malloc(len * 3 + 1);
- if (!escaped)
+ if (escaped == NULL) {
return NSERROR_NOMEM;
+ }
+ pos = escaped;
- for (c = unescaped + toskip, d = escaped; *c; c++) {
+ for (c = unescaped; *c != '\0'; c++) {
/* Check if we should escape this byte.
* '~' is unreserved and should not be percent encoded, if
* you believe the spec; however, leaving it unescaped
* breaks a bunch of websites, so we escape it anyway. */
- if (!isascii(*c)
- || (strchr(":/?#[]@" /* gen-delims */
- "!$&'()*+,;=" /* sub-delims */
- "<>%\"{}|\\^`~" /* others */, *c)
- && (!escexceptions || !strchr(escexceptions, *c)))
- || *c <= 0x20 || *c == 0x7f) {
+ if (!isascii(*c) ||
+ (strchr(":/?#[]@" /* gen-delims */
+ "!$&'()*+,;=" /* sub-delims */
+ "<>%\"{}|\\^`~" /* others */, *c) &&
+ (!escexceptions ||
+ !strchr(escexceptions, *c))) ||
+ *c <= 0x20 || *c == 0x7f) {
if (*c == 0x20 && sptoplus) {
- *d++ = '+';
+ *pos++ = '+';
} else {
- *d++ = '%';
- *d++ = "0123456789ABCDEF"[((*c >> 4) & 0xf)];
- *d++ = "0123456789ABCDEF"[(*c & 0xf)];
+ *pos++ = '%';
+ *pos++ = "0123456789ABCDEF"[(*c >> 4) & 0xf];
+ *pos++ = "0123456789ABCDEF"[*c & 0xf];
}
} else {
/* unreserved characters: [a-zA-Z0-9-._] */
- *d++ = *c;
+ *pos++ = *c;
}
}
- *d++ = '\0';
+ *pos = '\0';
+ new_len = pos - escaped;
- tmpres = malloc(d - escaped + toskip);
- if (!tmpres) {
- free(escaped);
- return NSERROR_NOMEM;
+ if (new_len != len) {
+ /* Shrink wrap the allocation around the escaped string */
+ char *tmp = realloc(escaped, new_len + 1);
+ if (tmp != NULL) {
+ escaped = tmp;
+ }
}
- memcpy(tmpres, unescaped, toskip);
- memcpy(tmpres + toskip, escaped, d - escaped);
- *result = tmpres;
-
- free(escaped);
-
+ *result = escaped;
return NSERROR_OK;
}
diff --git a/utils/url.h b/utils/url.h
index 5d8d1540c..c22c43b2a 100644
--- a/utils/url.h
+++ b/utils/url.h
@@ -32,13 +32,12 @@
* Escape a string suitable for inclusion in an URL.
*
* \param unescaped the unescaped string
- * \param toskip number of bytes to skip in unescaped string
* \param sptoplus true iff spaces should be converted to +
* \param escexceptions NULL or a string of characters excluded to be escaped
* \param result pointer to pointer to buffer to hold escaped string
* \return NSERROR_OK on success
*/
-nserror url_escape(const char *unescaped, size_t toskip, bool sptoplus,
+nserror url_escape(const char *unescaped, bool sptoplus,
const char *escexceptions, char **result);