summaryrefslogtreecommitdiffstats
path: root/src/blob.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/blob.c')
-rw-r--r--src/blob.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/src/blob.c b/src/blob.c
index 196adf9..41e8d75 100644
--- a/src/blob.c
+++ b/src/blob.c
@@ -277,7 +277,8 @@ void blob_push_urldecode(blob_t *to, blob_t url)
/* skip '.' or two consecutive / */
} else if (blob_cmp(b, BLOB_STR("..")) == 0) {
/* go up one path component */
- blob_shrink_tail(to, blob_pushed(orig, b), '/');
+ blob_expand_head(to, orig, '/');
+ blob_expand_head_bytes(to, 1); /* back up past the '/' separator */
} else {
/* copy decoded; FIXME decode percent encoding */
blob_push_byte(to, '/');
@@ -410,6 +411,12 @@ blob_t blob_expand_head(blob_t *b, blob_t limits, unsigned char sep)
return r;
}
+void blob_expand_head_bytes(blob_t *b, int bytes)
+{
+ b->ptr -= bytes;
+ b->len += bytes;
+}
+
blob_t blob_expand_tail(blob_t *b, blob_t limits, unsigned char sep)
{
blob_t t = *b;