diff options
author | Natanael Copa <ncopa@alpinelinux.org> | 2015-07-27 08:08:54 +0000 |
---|---|---|
committer | Natanael Copa <ncopa@alpinelinux.org> | 2015-07-27 11:13:28 +0000 |
commit | e6c1f4a663bf13c35e0a92ce7243d282a4a29c8c (patch) | |
tree | 0d6a91e95cc690d058f478f4543141ac060866e2 /main/lighttpd/0019-Use-buffer-API-to-read-and-modify-used-member.patch | |
parent | aa12abff47161235a3c11ec5c92465e98674234b (diff) | |
download | aports-e6c1f4a663bf13c35e0a92ce7243d282a4a29c8c.tar.bz2 aports-e6c1f4a663bf13c35e0a92ce7243d282a4a29c8c.tar.xz |
main/lighttpd: upgrade to 1.4.36
Diffstat (limited to 'main/lighttpd/0019-Use-buffer-API-to-read-and-modify-used-member.patch')
-rw-r--r-- | main/lighttpd/0019-Use-buffer-API-to-read-and-modify-used-member.patch | 4346 |
1 files changed, 0 insertions, 4346 deletions
diff --git a/main/lighttpd/0019-Use-buffer-API-to-read-and-modify-used-member.patch b/main/lighttpd/0019-Use-buffer-API-to-read-and-modify-used-member.patch deleted file mode 100644 index d455ff9a67..0000000000 --- a/main/lighttpd/0019-Use-buffer-API-to-read-and-modify-used-member.patch +++ /dev/null @@ -1,4346 +0,0 @@ -From ad3e93ea96d1cbaab00d07245dbd02f790060f85 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Stefan=20B=C3=BChler?= <stbuehler@web.de> -Date: Sun, 8 Feb 2015 19:10:44 +0000 -Subject: [PATCH 19/29] Use buffer API to read and modify "used" member -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -- a lot of code tried to handle manually adding terminating zeroes and - keeping track of the correct "used" count. - Replaced all "external" usages with simple wrapper functions: - * buffer_string_is_empty (used <= 1), buffer_is_empty (used == 0); - prefer buffer_string_is_empty - * buffer_string_set_length - * buffer_string_length - * CONST_BUF_LEN() macro -- removed "static" buffer hacks (buffers pointing to constant/stack - memory instead of malloc()ed data) -- buffer_append_strftime(): refactor buffer+strftime uses -- li_tohex(): no need for a buffer for binary-to-hex conversion: - the output data length is easy to predict -- remove "-Winline" from extra warnings: the "inline" keyword just - supresses the warning about unused but defined (static) functions; - don't care whether it actually gets inlined or not. - -From: Stefan Bühler <stbuehler@web.de> - -git-svn-id: svn://svn.lighttpd.net/lighttpd/branches/lighttpd-1.4.x@2979 152afb58-edef-0310-8abb-c4023f1b3aa9 ---- - configure.ac | 2 +- - src/CMakeLists.txt | 2 +- - src/array.c | 12 +-- - src/buffer.c | 128 ++++++++++++++++++++----------- - src/buffer.h | 13 ++++ - src/chunk.c | 11 +-- - src/configfile-glue.c | 2 +- - src/configfile.c | 4 +- - src/connections.c | 79 ++++--------------- - src/data_string.c | 11 +-- - src/etag.c | 5 +- - src/http-header-glue.c | 7 +- - src/http_auth.c | 71 ++++++++--------- - src/http_chunk.c | 5 +- - src/log.c | 19 ++--- - src/mod_access.c | 8 +- - src/mod_accesslog.c | 64 ++++++++-------- - src/mod_alias.c | 14 ++-- - src/mod_auth.c | 20 ++--- - src/mod_cgi.c | 47 ++++++------ - src/mod_cml.c | 12 ++- - src/mod_cml_funcs.c | 9 +-- - src/mod_cml_lua.c | 22 ++---- - src/mod_compress.c | 34 ++++----- - src/mod_dirlisting.c | 22 +++--- - src/mod_evasive.c | 2 +- - src/mod_evhost.c | 11 +-- - src/mod_expire.c | 21 ++--- - src/mod_extforward.c | 2 +- - src/mod_fastcgi.c | 99 ++++++++++++------------ - src/mod_flv_streaming.c | 13 ++-- - src/mod_indexfile.c | 4 +- - src/mod_magnet.c | 43 +++++------ - src/mod_mysql_vhost.c | 51 ++++--------- - src/mod_proxy.c | 47 +++++------- - src/mod_redirect.c | 4 +- - src/mod_rewrite.c | 4 +- - src/mod_rrdtool.c | 12 ++- - src/mod_scgi.c | 61 +++++++-------- - src/mod_secure_download.c | 9 +-- - src/mod_simple_vhost.c | 16 ++-- - src/mod_ssi.c | 16 ++-- - src/mod_ssi_expr.c | 2 +- - src/mod_staticfile.c | 14 ++-- - src/mod_status.c | 4 +- - src/mod_trigger_b4_dl.c | 16 ++-- - src/mod_userdir.c | 4 +- - src/mod_usertrack.c | 16 ++-- - src/mod_webdav.c | 177 ++++++++++++++++++++----------------------- - src/network_linux_sendfile.c | 4 +- - src/network_openssl.c | 6 +- - src/network_write.c | 6 +- - src/network_writev.c | 4 +- - src/proc_open.c | 7 +- - src/request.c | 49 ++++++------ - src/response.c | 53 +++++-------- - src/server.c | 23 +++--- - src/stat_cache.c | 23 +++--- - 58 files changed, 668 insertions(+), 778 deletions(-) - -diff --git a/configure.ac b/configure.ac -index 63261ca..c846d1a 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -666,7 +666,7 @@ AC_ARG_ENABLE(extra-warnings, - esac],[extrawarnings=false]) - - if test x$extrawarnings = xtrue; then -- TRY_CFLAGS([-g -O2 -g2 -Wall -Wmissing-declarations -Wdeclaration-after-statement -Wcast-align -Winline -Wsign-compare -Wnested-externs -Wpointer-arith -Wl,--as-needed -D_FORTIFY_SOURCE=2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security]) -+ TRY_CFLAGS([-g -O2 -g2 -Wall -Wmissing-declarations -Wdeclaration-after-statement -Wcast-align -Wsign-compare -Wnested-externs -Wpointer-arith -Wl,--as-needed -D_FORTIFY_SOURCE=2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security]) - fi - - dnl build version-id -diff --git a/src/array.c b/src/array.c -index 9a15abd..50f5e03 100644 ---- a/src/array.c -+++ b/src/array.c -@@ -98,7 +98,7 @@ static int array_get_index(array *a, const char *key, size_t keylen, int *rndx) - } else if (pos >= (int)a->used) { - pos -= i; - } else { -- cmp = buffer_caseless_compare(key, keylen, a->data[a->sorted[pos]]->key->ptr, a->data[a->sorted[pos]]->key->used); -+ cmp = buffer_caseless_compare(key, keylen, CONST_BUF_LEN(a->data[a->sorted[pos]]->key)); - - if (cmp == 0) { - /* found */ -@@ -121,7 +121,7 @@ static int array_get_index(array *a, const char *key, size_t keylen, int *rndx) - data_unset *array_get_element(array *a, const char *key) { - int ndx; - -- if (-1 != (ndx = array_get_index(a, key, strlen(key) + 1, NULL))) { -+ if (-1 != (ndx = array_get_index(a, key, strlen(key), NULL))) { - /* found, leave here */ - - return a->data[ndx]; -@@ -171,7 +171,7 @@ data_unset *array_replace(array *a, data_unset *du) { - int ndx; - - force_assert(NULL != du); -- if (-1 == (ndx = array_get_index(a, du->key->ptr, du->key->used, NULL))) { -+ if (-1 == (ndx = array_get_index(a, CONST_BUF_LEN(du->key), NULL))) { - array_insert_unique(a, du); - return NULL; - } else { -@@ -187,13 +187,13 @@ int array_insert_unique(array *a, data_unset *str) { - size_t j; - - /* generate unique index if neccesary */ -- if (str->key->used == 0 || str->is_index_key) { -+ if (buffer_is_empty(str->key) || str->is_index_key) { - buffer_copy_int(str->key, a->unique_ndx++); - str->is_index_key = 1; - } - - /* try to find the string */ -- if (-1 != (ndx = array_get_index(a, str->key->ptr, str->key->used, &pos))) { -+ if (-1 != (ndx = array_get_index(a, CONST_BUF_LEN(str->key), &pos))) { - /* found, leave here */ - if (a->data[ndx]->type == str->type) { - str->insert_dup(a->data[ndx], str); -@@ -235,7 +235,7 @@ int array_insert_unique(array *a, data_unset *str) { - - if (pos != ndx && - ((pos < 0) || -- buffer_caseless_compare(str->key->ptr, str->key->used, a->data[a->sorted[pos]]->key->ptr, a->data[a->sorted[pos]]->key->used) > 0)) { -+ buffer_caseless_compare(CONST_BUF_LEN(str->key), CONST_BUF_LEN(a->data[a->sorted[pos]]->key)) > 0)) { - pos++; - } - -diff --git a/src/buffer.c b/src/buffer.c -index 979d954..d343731 100644 ---- a/src/buffer.c -+++ b/src/buffer.c -@@ -9,7 +9,6 @@ - - static const char hex_chars[] = "0123456789abcdef"; - -- - /** - * init the buffer - * -@@ -83,37 +82,44 @@ static size_t buffer_align_size(size_t size) { - return size + align; - } - --static char* buffer_prepare_copy(buffer *b, size_t size) { -+/* make sure buffer is at least "size" big. discard old data */ -+static void buffer_alloc(buffer *b, size_t size) { - force_assert(NULL != b); -+ if (0 == size) size = 1; - -- /* also allocate space for terminating 0 */ -- /* check for overflow: unsigned overflow is defined to wrap around */ -- force_assert(1 + size > size); -- ++size; -+ if (size <= b->size) return; - -- if (0 == b->size || size > b->size) { -- if (NULL != b->ptr) free(b->ptr); -- b->ptr = NULL; -+ if (NULL != b->ptr) free(b->ptr); - -- b->size = buffer_align_size(size); -- force_assert(b->size > 0); -+ b->used = 0; -+ b->size = buffer_align_size(size); -+ b->ptr = malloc(b->size); - -- b->ptr = malloc(b->size); -- force_assert(NULL != b->ptr); -- } -+ force_assert(NULL != b->ptr); -+} - -- /* reset */ -- b->used = 0; -- b->ptr[0] = '\0'; -+/* make sure buffer is at least "size" big. keep old data */ -+static void buffer_realloc(buffer *b, size_t size) { -+ force_assert(NULL != b); -+ if (0 == size) size = 1; - -- return b->ptr; -+ if (size <= b->size) return; -+ -+ b->size = buffer_align_size(size); -+ b->ptr = realloc(b->ptr, b->size); -+ -+ force_assert(NULL != b->ptr); - } - -+ - char* buffer_string_prepare_copy(buffer *b, size_t size) { - force_assert(NULL != b); -+ force_assert(size + 1 > size); -+ -+ buffer_alloc(b, size + 1); - -- buffer_prepare_copy(b, size); - b->used = 1; -+ b->ptr[0] = '\0'; - - return b->ptr; - } -@@ -124,28 +130,29 @@ char* buffer_string_prepare_append(buffer *b, size_t size) { - if (buffer_string_is_empty(b)) { - return buffer_string_prepare_copy(b, size); - } else { -- /* not empty, b->used already includes a terminating 0 */ - size_t req_size = b->used + size; - -- /* check for overflow: unsigned overflow is defined to wrap around */ -+ /* not empty, b->used already includes a terminating 0 */ - force_assert(req_size >= b->used); - -- /* only append to 0-terminated string */ -- force_assert('\0' == b->ptr[b->used - 1]); -- -- if (req_size > b->size) { -- char *ptr; -- b->size = buffer_align_size(req_size); -+ /* check for overflow: unsigned overflow is defined to wrap around */ -+ force_assert(req_size >= b->used); - -- ptr = realloc(b->ptr, b->size); -- force_assert(NULL != ptr); -- b->ptr = ptr; -- } -+ buffer_realloc(b, req_size); - - return b->ptr + b->used - 1; - } - } - -+void buffer_string_set_length(buffer *b, size_t len) { -+ force_assert(NULL != b); -+ force_assert(len + 1 > len); -+ -+ buffer_realloc(b, len + 1); -+ -+ b->used = len + 1; -+ b->ptr[len] = '\0'; -+} - - void buffer_commit(buffer *b, size_t size) - { -@@ -182,7 +189,8 @@ void buffer_copy_string_len(buffer *b, const char *s, size_t s_len) { - - void buffer_copy_buffer(buffer *b, const buffer *src) { - if (NULL == src || 0 == src->used) { -- buffer_prepare_copy(b, 0); -+ buffer_string_prepare_copy(b, 0); -+ b->used = 0; /* keep special empty state for now */ - } else { - buffer_copy_string_len(b, src->ptr, buffer_string_length(src)); - } -@@ -301,6 +309,37 @@ void buffer_copy_int(buffer *b, intmax_t val) { - buffer_append_int(b, val); - } - -+void buffer_append_strftime(buffer *b, const char *format, const struct tm *tm) { -+ size_t r; -+ char* buf; -+ force_assert(NULL != b); -+ force_assert(NULL != tm); -+ -+ if (NULL == format || '\0' == format[0]) { -+ /* empty format */ -+ buffer_string_prepare_append(b, 0); -+ return; -+ } -+ -+ buf = buffer_string_prepare_append(b, 255); -+ r = strftime(buf, buffer_string_space(b), format, tm); -+ -+ /* 0 (in some apis buffer_string_space(b)) signals the string may have -+ * been too small; but the format could also just have lead to an empty -+ * string -+ */ -+ if (0 == r || r >= buffer_string_space(b)) { -+ /* give it a second try with a larger string */ -+ buf = buffer_string_prepare_append(b, 4095); -+ r = strftime(buf, buffer_string_space(b), format, tm); -+ } -+ -+ if (r >= buffer_string_space(b)) r = 0; -+ -+ buffer_commit(b, r); -+} -+ -+ - void li_itostrn(char *buf, size_t buf_len, intmax_t val) { - char p_buf[LI_ITOSTRING_LENGTH]; - char* const p_buf_end = p_buf + sizeof(p_buf); -@@ -446,20 +485,22 @@ int buffer_is_equal_right_len(buffer *b1, buffer *b2, size_t len) { - return 0 == memcmp(b1->ptr + b1->used - 1 - len, b2->ptr + b2->used - 1 - len, len); - } - --void buffer_copy_string_hex(buffer *b, const char *in, size_t in_len) { -+void li_tohex(char *buf, const char *s, size_t s_len) { - size_t i; - -- /* overflow protection */ -- force_assert(in_len * 2 + 1 > in_len); -+ for (i = 0; i < s_len; i++) { -+ buf[2*i] = hex_chars[(s[i] >> 4) & 0x0F]; -+ buf[2*i+1] = hex_chars[s[i] & 0x0F]; -+ } -+ buf[2*s_len] = '\0'; -+} - -- buffer_prepare_copy(b, in_len * 2); -+void buffer_copy_string_hex(buffer *b, const char *in, size_t in_len) { -+ /* overflow protection */ -+ force_assert(in_len * 2 > in_len); - -- b->used = 0; -- for (i = 0; i < in_len; i++) { -- b->ptr[b->used++] = hex_chars[(in[i] >> 4) & 0x0F]; -- b->ptr[b->used++] = hex_chars[in[i] & 0x0F]; -- } -- b->ptr[b->used++] = '\0'; -+ buffer_string_set_length(b, 2 * in_len); -+ li_tohex(b->ptr, in, in_len); - } - - /* everything except: ! ( ) * - . 0-9 A-Z _ a-z */ -@@ -882,8 +923,7 @@ void buffer_path_simplify(buffer *dest, buffer *src) - walk++; - } - -- *out = '\0'; -- dest->used = (out - start) + 1; -+ buffer_string_set_length(dest, out - start); - } - - int light_isdigit(int c) { -diff --git a/src/buffer.h b/src/buffer.h -index 7ea27f1..e2ac778 100644 ---- a/src/buffer.h -+++ b/src/buffer.h -@@ -10,6 +10,7 @@ - #include <stdlib.h> - #include <sys/types.h> - #include <stdio.h> -+#include <time.h> - - #if defined HAVE_STDINT_H - # include <stdint.h> -@@ -71,6 +72,13 @@ char* buffer_string_prepare_append(buffer *b, size_t size); - */ - void buffer_commit(buffer *b, size_t size); - -+/* sets string length: -+ * - always stores a terminating zero to terminate the "new" string -+ * - does not modify the string data apart from terminating zero -+ * - reallocates the buffer iff needed -+ */ -+void buffer_string_set_length(buffer *b, size_t len); -+ - void buffer_copy_string(buffer *b, const char *s); - void buffer_copy_string_len(buffer *b, const char *s, size_t s_len); - void buffer_copy_buffer(buffer *b, const buffer *src); -@@ -85,6 +93,8 @@ void buffer_append_long_hex(buffer *b, unsigned long len); - void buffer_append_int(buffer *b, intmax_t val); - void buffer_copy_int(buffer *b, intmax_t val); - -+void buffer_append_strftime(buffer *b, const char *format, const struct tm *tm); -+ - /* '-', log_10 (2^bits) = bits * log 2 / log 10 < bits * 0.31, terminating 0 */ - #define LI_ITOSTRING_LENGTH (2 + (8 * sizeof(intmax_t) * 31 + 99) / 100) - -@@ -93,6 +103,9 @@ void li_itostr(char *buf, intmax_t val); /* buf must have at least LI_ITOSTRING_ - void li_utostrn(char *buf, size_t buf_len, uintmax_t val); - void li_utostr(char *buf, uintmax_t val); /* buf must have at least LI_ITOSTRING_LENGTH bytes */ - -+/* buf must be (at least) 2*s_len + 1 big. uses lower-case hex letters. */ -+void li_tohex(char *buf, const char *s, size_t s_len); -+ - char * buffer_search_string_len(buffer *b, const char *needle, size_t len); - - /* NULL buffer or empty buffer (used == 0); -diff --git a/src/chunk.c b/src/chunk.c -index 83adc15..ccdae9a 100644 ---- a/src/chunk.c -+++ b/src/chunk.c -@@ -264,10 +264,11 @@ void chunkqueue_get_memory(chunkqueue *cq, char **mem, size_t *len, size_t min_s - } - /* if buffer is really small just make it bigger */ - else if (have < min_size && b->size <= REALLOC_MAX_SIZE) { -- size_t new_size = b->used + min_size, append; -+ size_t cur_len = buffer_string_length(b); -+ size_t new_size = cur_len + min_size, append; - if (new_size < alloc_size) new_size = alloc_size; - -- append = new_size - b->used; -+ append = new_size - cur_len; - if (append >= min_size) { - buffer_string_prepare_append(b, append); - have = buffer_string_space(b); -@@ -301,12 +302,8 @@ void chunkqueue_use_memory(chunkqueue *cq, size_t len) { - force_assert(NULL != cq->last && MEM_CHUNK == cq->last->type); - b = cq->last->mem; - -- force_assert(b->used > 0); -- force_assert(len <= buffer_string_space(b)); -- - if (len > 0) { -- b->used += len; -- b->ptr[b->used - 1] = '\0'; -+ buffer_commit(b, len); - } else if (buffer_string_is_empty(b)) { - /* unused buffer: can't remove chunk easily from - * end of list, so just reset the buffer -diff --git a/src/configfile-glue.c b/src/configfile-glue.c -index 2fb8c62..f411d72 100644 ---- a/src/configfile-glue.c -+++ b/src/configfile-glue.c -@@ -491,7 +491,7 @@ static cond_result_t config_check_cond_nocache(server *srv, connection *con, dat - #ifndef elementsof - #define elementsof(x) (sizeof(x) / sizeof(x[0])) - #endif -- n = pcre_exec(dc->regex, dc->regex_study, l->ptr, l->used - 1, 0, 0, -+ n = pcre_exec(dc->regex, dc->regex_study, CONST_BUF_LEN(l), 0, 0, - cache->matches, elementsof(cache->matches)); - - cache->patterncount = n; -diff --git a/src/configfile.c b/src/configfile.c -index 1c36c3e..929d292 100644 ---- a/src/configfile.c -+++ b/src/configfile.c -@@ -1130,7 +1130,7 @@ int config_read(server *srv, const char *fn) { - dcwd = data_string_init(); - buffer_string_prepare_copy(dcwd->value, 1023); - if (NULL != getcwd(dcwd->value->ptr, dcwd->value->size - 1)) { -- dcwd->value->used = strlen(dcwd->value->ptr) + 1; -+ buffer_commit(dcwd->value, strlen(dcwd->value->ptr)); - buffer_copy_string_len(dcwd->key, CONST_STR_LEN("var.CWD")); - array_insert_unique(srv->config, (data_unset *)dcwd); - } else { -@@ -1320,7 +1320,7 @@ int config_set_defaults(server *srv) { - srv->srvconf.port = s->ssl_enabled ? 443 : 80; - } - -- if (srv->srvconf.event_handler->used == 0) { -+ if (buffer_string_is_empty(srv->srvconf.event_handler)) { - /* choose a good default - * - * the event_handler list is sorted by 'goodness' -diff --git a/src/connections.c b/src/connections.c -index 3fab768..8f26a30 100644 ---- a/src/connections.c -+++ b/src/connections.c -@@ -400,7 +400,7 @@ static int connection_handle_write_prepare(server *srv, connection *con) { - * 403 is from the response handler when noone else catched it - * - * */ -- if ((!con->http_status || con->http_status == 200) && con->uri.path->used && -+ if ((!con->http_status || con->http_status == 200) && !buffer_string_is_empty(con->uri.path) && - con->uri.path->ptr[0] != '*') { - response_header_insert(srv, con, CONST_STR_LEN("Allow"), CONST_STR_LEN("OPTIONS, GET, HEAD, POST")); - -@@ -873,42 +873,7 @@ static int connection_handle_read_state(server *srv, connection *con) { - } - } - -- /* the last chunk might be empty */ -- for (c = cq->first; c;) { -- if (cq->first == c && c->mem->used == 0) { -- /* the first node is empty */ -- /* ... and it is empty, move it to unused */ -- -- cq->first = c->next; -- if (cq->first == NULL) cq->last = NULL; -- -- c->next = cq->unused; -- cq->unused = c; -- cq->unused_chunks++; -- -- c = cq->first; -- } else if (c->next && c->next->mem->used == 0) { -- chunk *fc; -- /* next node is the last one */ -- /* ... and it is empty, move it to unused */ -- -- fc = c->next; -- c->next = fc->next; -- -- fc->next = cq->unused; -- cq->unused = fc; -- cq->unused_chunks++; -- -- /* the last node was empty */ -- if (c->next == NULL) { -- cq->last = c; -- } -- -- c = c->next; -- } else { -- c = c->next; -- } -- } -+ chunkqueue_remove_finished_chunks(cq); - - /* we might have got several packets at once - */ -@@ -927,15 +892,12 @@ static int connection_handle_read_state(server *srv, connection *con) { - last_offset = 0; - - for (c = cq->first; c; c = c->next) { -- buffer b; - size_t i; -+ size_t len = buffer_string_length(c->mem) - c->offset; -+ const char *b = c->mem->ptr + c->offset; - -- b.ptr = c->mem->ptr + c->offset; -- b.used = c->mem->used - c->offset; -- if (b.used > 0) b.used--; /* buffer "used" includes terminating zero */ -- -- for (i = 0; i < b.used; i++) { -- char ch = b.ptr[i]; -+ for (i = 0; i < len; ++i) { -+ char ch = b[i]; - - if ('\r' == ch) { - /* chec if \n\r\n follows */ -@@ -945,13 +907,11 @@ static int connection_handle_read_state(server *srv, connection *con) { - int header_end_match_pos = 1; - - for ( ; cc; cc = cc->next, j = 0 ) { -- buffer bb; -- bb.ptr = cc->mem->ptr + cc->offset; -- bb.used = cc->mem->used - cc->offset; -- if (bb.used > 0) bb.used--; /* buffer "used" includes terminating zero */ -+ size_t bblen = buffer_string_length(cc->mem) - cc->offset; -+ const char *bb = c->mem->ptr + cc->offset; - -- for ( ; j < bb.used; j++) { -- ch = bb.ptr[j]; -+ for ( ; j < bblen; j++) { -+ ch = bb[j]; - - if (ch == header_end[header_end_match_pos]) { - header_end_match_pos++; -@@ -976,25 +936,16 @@ found_header_end: - buffer_reset(con->request.request); - - for (c = cq->first; c; c = c->next) { -- buffer b; -- -- b.ptr = c->mem->ptr + c->offset; -- b.used = c->mem->used - c->offset; -+ size_t len = buffer_string_length(c->mem) - c->offset; - - if (c == last_chunk) { -- b.used = last_offset + 1; -+ len = last_offset; - } - -- buffer_append_string_buffer(con->request.request, &b); -+ buffer_append_string_len(con->request.request, c->mem->ptr + c->offset, len); -+ c->offset += len; - -- if (c == last_chunk) { -- c->offset += last_offset; -- -- break; -- } else { -- /* the whole packet was copied */ -- c->offset = c->mem->used - 1; -- } -+ if (c == last_chunk) break; - } - - connection_set_state(srv, con, CON_STATE_REQUEST_END); -diff --git a/src/data_string.c b/src/data_string.c -index fc57de2..d65b3be 100644 ---- a/src/data_string.c -+++ b/src/data_string.c -@@ -36,7 +36,7 @@ static int data_string_insert_dup(data_unset *dst, data_unset *src) { - data_string *ds_dst = (data_string *)dst; - data_string *ds_src = (data_string *)src; - -- if (ds_dst->value->used) { -+ if (!buffer_is_empty(ds_dst->value)) { - buffer_append_string_len(ds_dst->value, CONST_STR_LEN(", ")); - buffer_append_string_buffer(ds_dst->value, ds_src->value); - } else { -@@ -52,7 +52,7 @@ static int data_response_insert_dup(data_unset *dst, data_unset *src) { - data_string *ds_dst = (data_string *)dst; - data_string *ds_src = (data_string *)src; - -- if (ds_dst->value->used) { -+ if (!buffer_is_empty(ds_dst->value)) { - buffer_append_string_len(ds_dst->value, CONST_STR_LEN("\r\n")); - buffer_append_string_buffer(ds_dst->value, ds_dst->key); - buffer_append_string_len(ds_dst->value, CONST_STR_LEN(": ")); -@@ -69,18 +69,19 @@ static int data_response_insert_dup(data_unset *dst, data_unset *src) { - - static void data_string_print(const data_unset *d, int depth) { - data_string *ds = (data_string *)d; -- unsigned int i; -+ size_t i, len; - UNUSED(depth); - - /* empty and uninitialized strings */ -- if (ds->value->used < 1) { -+ if (buffer_string_is_empty(ds->value)) { - fputs("\"\"", stdout); - return; - } - - /* print out the string as is, except prepend " with backslash */ - putc('"', stdout); -- for (i = 0; i < ds->value->used - 1; i++) { -+ len = buffer_string_length(ds->value); -+ for (i = 0; i < len; i++) { - unsigned char c = ds->value->ptr[i]; - if (c == '"') { - fputs("\\\"", stdout); -diff --git a/src/etag.c b/src/etag.c -index bf63d94..f8fb609 100644 ---- a/src/etag.c -+++ b/src/etag.c -@@ -37,10 +37,11 @@ int etag_create(buffer *etag, struct stat *st,etag_flags_t flags) { - } - - int etag_mutate(buffer *mut, buffer *etag) { -- size_t i; -+ size_t i, len; - uint32_t h; - -- for (h=0, i=0; i < etag->used-1; ++i) h = (h<<5)^(h>>27)^(etag->ptr[i]); -+ len = buffer_string_length(etag); -+ for (h=0, i=0; i < len; ++i) h = (h<<5)^(h>>27)^(etag->ptr[i]); - - buffer_reset(mut); - buffer_copy_string_len(mut, CONST_STR_LEN("\"")); -diff --git a/src/http-header-glue.c b/src/http-header-glue.c -index f910f3f..752d91e 100644 ---- a/src/http-header-glue.c -+++ b/src/http-header-glue.c -@@ -125,7 +125,7 @@ int http_response_redirect_to_directory(server *srv, connection *con) { - - buffer_copy_buffer(o, con->uri.scheme); - buffer_append_string_len(o, CONST_STR_LEN("://")); -- if (con->uri.authority->used) { -+ if (!buffer_is_empty(con->uri.authority)) { - buffer_append_string_buffer(o, con->uri.authority); - } else { - /* get the name of the currently connected socket */ -@@ -237,10 +237,7 @@ buffer * strftime_cache_get(server *srv, time_t last_mod) { - srv->mtime_cache[i].mtime = last_mod; - buffer_string_prepare_copy(srv->mtime_cache[i].str, 1023); - tm = gmtime(&(srv->mtime_cache[i].mtime)); -- srv->mtime_cache[i].str->used = strftime(srv->mtime_cache[i].str->ptr, -- srv->mtime_cache[i].str->size - 1, -- "%a, %d %b %Y %H:%M:%S GMT", tm); -- srv->mtime_cache[i].str->used++; -+ buffer_append_strftime(srv->mtime_cache[i].str, "%a, %d %b %Y %H:%M:%S GMT", tm); - - return srv->mtime_cache[i].str; - } -diff --git a/src/http_auth.c b/src/http_auth.c -index c693645..a98ea62 100644 ---- a/src/http_auth.c -+++ b/src/http_auth.c -@@ -39,13 +39,7 @@ typedef unsigned char HASH[HASHLEN]; - typedef char HASHHEX[HASHHEXLEN+1]; - - static void CvtHex(const HASH Bin, char Hex[33]) { -- unsigned short i; -- -- for (i = 0; i < 16; i++) { -- Hex[i*2] = int2hex((Bin[i] >> 4) & 0xf); -- Hex[i*2+1] = int2hex(Bin[i] & 0xf); -- } -- Hex[32] = '\0'; -+ li_tohex(Hex, (const char*) Bin, 16); - } - - /** -@@ -97,9 +91,7 @@ static unsigned char * base64_decode(buffer *out, const char *in) { - - size_t in_len = strlen(in); - -- buffer_string_prepare_copy(out, in_len); -- -- result = (unsigned char *)out->ptr; -+ result = (unsigned char *) buffer_string_prepare_copy(out, in_len); - - /* run through the whole string, converting as we go */ - for (i = 0; i < in_len; i++) { -@@ -157,8 +149,7 @@ static unsigned char * base64_decode(buffer *out, const char *in) { - break; - } - -- result[j] = '\0'; -- out->used = j; -+ buffer_commit(out, j); - - return result; - } -@@ -166,7 +157,7 @@ static unsigned char * base64_decode(buffer *out, const char *in) { - static int http_auth_get_password(server *srv, mod_auth_plugin_data *p, buffer *username, buffer *realm, buffer *password) { - int ret = -1; - -- if (!username->used|| !realm->used) return -1; -+ if (buffer_is_empty(username) || buffer_is_empty(realm)) return -1; - - if (p->conf.auth_backend == AUTH_BACKEND_HTDIGEST) { - stream f; -@@ -226,8 +217,8 @@ static int http_auth_get_password(server *srv, mod_auth_plugin_data *p, buffer * - pwd_len = f.size - (f_pwd - f.start); - } - -- if (username->used - 1 == u_len && -- (realm->used - 1 == r_len) && -+ if (buffer_string_length(username) == u_len && -+ (buffer_string_length(realm) == r_len) && - (0 == strncmp(username->ptr, f_user, u_len)) && - (0 == strncmp(realm->ptr, f_realm, r_len))) { - /* found */ -@@ -296,7 +287,7 @@ static int http_auth_get_password(server *srv, mod_auth_plugin_data *p, buffer * - pwd_len = f.size - (f_pwd - f.start); - } - -- if (username->used - 1 == u_len && -+ if (buffer_string_length(username) == u_len && - (0 == strncmp(username->ptr, f_user, u_len))) { - /* found */ - -@@ -652,10 +643,10 @@ static int http_auth_basic_password_compare(server *srv, mod_auth_plugin_data *p - char a1[256]; - - li_MD5_Init(&Md5Ctx); -- li_MD5_Update(&Md5Ctx, (unsigned char *)username->ptr, username->used - 1); -- li_MD5_Update(&Md5Ctx, (unsigned char *)":", 1); -- li_MD5_Update(&Md5Ctx, (unsigned char *)realm->ptr, realm->used - 1); -- li_MD5_Update(&Md5Ctx, (unsigned char *)":", 1); -+ li_MD5_Update(&Md5Ctx, CONST_BUF_LEN(username)); -+ li_MD5_Update(&Md5Ctx, CONST_STR_LEN(":")); -+ li_MD5_Update(&Md5Ctx, CONST_BUF_LEN(realm)); -+ li_MD5_Update(&Md5Ctx, CONST_STR_LEN(":")); - li_MD5_Update(&Md5Ctx, (unsigned char *)pw, strlen(pw)); - li_MD5_Final(HA1, &Md5Ctx); - -@@ -682,7 +673,7 @@ static int http_auth_basic_password_compare(server *srv, mod_auth_plugin_data *p - char *crypted; - - /* a simple DES password is 2 + 11 characters. everything else should be longer. */ -- if (password->used < 13 + 1) { -+ if (buffer_string_length(password) < 13) { - return -1; - } - -@@ -707,7 +698,7 @@ static int http_auth_basic_password_compare(server *srv, mod_auth_plugin_data *p - char *dn; - int ret; - char *attrs[] = { LDAP_NO_ATTRS, NULL }; -- size_t i; -+ size_t i, len; - - /* for now we stay synchronous */ - -@@ -726,7 +717,8 @@ static int http_auth_basic_password_compare(server *srv, mod_auth_plugin_data *p - * a unpleasant way - */ - -- for (i = 0; i < username->used - 1; i++) { -+ len = buffer_string_length(username); -+ for (i = 0; i < len; i++) { - char c = username->ptr[i]; - - if (!isalpha(c) && -@@ -863,9 +855,8 @@ int http_auth_basic_check(server *srv, connection *con, mod_auth_plugin_data *p, - return 0; - } - -- *pw++ = '\0'; -- -- username->used = pw - username->ptr; -+ buffer_string_set_length(username, pw - username->ptr); -+ pw++; - - password = buffer_init(); - /* copy password to r1 */ -@@ -1084,10 +1075,10 @@ int http_auth_digest_check(server *srv, connection *con, mod_auth_plugin_data *p - /* generate password from plain-text */ - li_MD5_Init(&Md5Ctx); - li_MD5_Update(&Md5Ctx, (unsigned char *)username, strlen(username)); -- li_MD5_Update(&Md5Ctx, (unsigned char *)":", 1); -+ li_MD5_Update(&Md5Ctx, CONST_STR_LEN(":")); - li_MD5_Update(&Md5Ctx, (unsigned char *)realm, strlen(realm)); -- li_MD5_Update(&Md5Ctx, (unsigned char *)":", 1); -- li_MD5_Update(&Md5Ctx, (unsigned char *)password->ptr, password->used - 1); -+ li_MD5_Update(&Md5Ctx, CONST_STR_LEN(":")); -+ li_MD5_Update(&Md5Ctx, CONST_BUF_LEN(password)); - li_MD5_Final(HA1, &Md5Ctx); - } else if (p->conf.auth_backend == AUTH_BACKEND_HTDIGEST) { - /* HA1 */ -@@ -1109,9 +1100,9 @@ int http_auth_digest_check(server *srv, connection *con, mod_auth_plugin_data *p - /* Errata ID 1649: http://www.rfc-editor.org/errata_search.php?rfc=2617 */ - CvtHex(HA1, a1); - li_MD5_Update(&Md5Ctx, (unsigned char *)a1, 32); -- li_MD5_Update(&Md5Ctx, (unsigned char *)":", 1); -+ li_MD5_Update(&Md5Ctx, CONST_STR_LEN(":")); - li_MD5_Update(&Md5Ctx, (unsigned char *)nonce, strlen(nonce)); -- li_MD5_Update(&Md5Ctx, (unsigned char *)":", 1); -+ li_MD5_Update(&Md5Ctx, CONST_STR_LEN(":")); - li_MD5_Update(&Md5Ctx, (unsigned char *)cnonce, strlen(cnonce)); - li_MD5_Final(HA1, &Md5Ctx); - } -@@ -1121,12 +1112,12 @@ int http_auth_digest_check(server *srv, connection *con, mod_auth_plugin_data *p - /* calculate H(A2) */ - li_MD5_Init(&Md5Ctx); - li_MD5_Update(&Md5Ctx, (unsigned char *)m, strlen(m)); -- li_MD5_Update(&Md5Ctx, (unsigned char *)":", 1); -+ li_MD5_Update(&Md5Ctx, CONST_STR_LEN(":")); - li_MD5_Update(&Md5Ctx, (unsigned char *)uri, strlen(uri)); - /* qop=auth-int not supported, already checked above */ - /* - if (qop && strcasecmp(qop, "auth-int") == 0) { -- li_MD5_Update(&Md5Ctx, (unsigned char *)":", 1); -+ li_MD5_Update(&Md5Ctx, CONST_STR_LEN(":")); - li_MD5_Update(&Md5Ctx, (unsigned char *) [body checksum], HASHHEXLEN); - } - */ -@@ -1136,16 +1127,16 @@ int http_auth_digest_check(server *srv, connection *con, mod_auth_plugin_data *p - /* calculate response */ - li_MD5_Init(&Md5Ctx); - li_MD5_Update(&Md5Ctx, (unsigned char *)a1, HASHHEXLEN); -- li_MD5_Update(&Md5Ctx, (unsigned char *)":", 1); -+ li_MD5_Update(&Md5Ctx, CONST_STR_LEN(":")); - li_MD5_Update(&Md5Ctx, (unsigned char *)nonce, strlen(nonce)); -- li_MD5_Update(&Md5Ctx, (unsigned char *)":", 1); -+ li_MD5_Update(&Md5Ctx, CONST_STR_LEN(":")); - if (qop && *qop) { - li_MD5_Update(&Md5Ctx, (unsigned char *)nc, strlen(nc)); -- li_MD5_Update(&Md5Ctx, (unsigned char *)":", 1); -+ li_MD5_Update(&Md5Ctx, CONST_STR_LEN(":")); - li_MD5_Update(&Md5Ctx, (unsigned char *)cnonce, strlen(cnonce)); -- li_MD5_Update(&Md5Ctx, (unsigned char *)":", 1); -+ li_MD5_Update(&Md5Ctx, CONST_STR_LEN(":")); - li_MD5_Update(&Md5Ctx, (unsigned char *)qop, strlen(qop)); -- li_MD5_Update(&Md5Ctx, (unsigned char *)":", 1); -+ li_MD5_Update(&Md5Ctx, CONST_STR_LEN(":")); - }; - li_MD5_Update(&Md5Ctx, (unsigned char *)HA2Hex, HASHHEXLEN); - li_MD5_Final(RespHash, &Md5Ctx); -@@ -1198,8 +1189,8 @@ int http_auth_digest_generate_nonce(server *srv, mod_auth_plugin_data *p, buffer - - /* generate shared-secret */ - li_MD5_Init(&Md5Ctx); -- li_MD5_Update(&Md5Ctx, (unsigned char *)fn->ptr, fn->used - 1); -- li_MD5_Update(&Md5Ctx, (unsigned char *)"+", 1); -+ li_MD5_Update(&Md5Ctx, CONST_BUF_LEN(fn)); -+ li_MD5_Update(&Md5Ctx, CONST_STR_LEN("+")); - - /* we assume sizeof(time_t) == 4 here, but if not it ain't a problem at all */ - li_itostr(hh, srv->cur_ts); -diff --git a/src/http_chunk.c b/src/http_chunk.c -index dd6a043..79e4586 100644 ---- a/src/http_chunk.c -+++ b/src/http_chunk.c -@@ -42,8 +42,7 @@ static void http_chunk_append_len(server *srv, connection *con, size_t len) { - b->ptr[j] = (len & 0xf) + (((len & 0xf) <= 9) ? '0' : 'a' - 10); - len >>= 4; - } -- b->used = i; -- b->ptr[b->used++] = '\0'; -+ buffer_commit(b, i); - - buffer_append_string_len(b, CONST_STR_LEN("\r\n")); - } -@@ -82,7 +81,7 @@ void http_chunk_append_buffer(server *srv, connection *con, buffer *mem) { - cq = con->write_queue; - - if (con->response.transfer_encoding & HTTP_TRANSFER_ENCODING_CHUNKED) { -- http_chunk_append_len(srv, con, mem->used - 1); -+ http_chunk_append_len(srv, con, buffer_string_length(mem)); - } - - chunkqueue_append_buffer(cq, mem); -diff --git a/src/log.c b/src/log.c -index 097e59e..6c9c38d 100644 ---- a/src/log.c -+++ b/src/log.c -@@ -333,8 +333,7 @@ static int log_buffer_prepare(buffer *b, server *srv, const char *filename, unsi - /* cache the generated timestamp */ - if (srv->cur_ts != srv->last_generated_debug_ts) { - buffer_string_prepare_copy(srv->ts_debug_str, 255); -- strftime(srv->ts_debug_str->ptr, srv->ts_debug_str->size - 1, "%Y-%m-%d %H:%M:%S", localtime(&(srv->cur_ts))); -- srv->ts_debug_str->used = strlen(srv->ts_debug_str->ptr) + 1; -+ buffer_append_strftime(srv->ts_debug_str, "%Y-%m-%d %H:%M:%S", localtime(&(srv->cur_ts))); - - srv->last_generated_debug_ts = srv->cur_ts; - } -@@ -362,8 +361,7 @@ static void log_write(server *srv, buffer *b) { - case ERRORLOG_FILE: - case ERRORLOG_FD: - buffer_append_string_len(b, CONST_STR_LEN("\n")); -- force_assert(b->used > 0); -- write(srv->errorlog_fd, b->ptr, b->used - 1); -+ write(srv->errorlog_fd, CONST_BUF_LEN(b)); - break; - case ERRORLOG_SYSLOG: - syslog(LOG_ERR, "%s", b->ptr); -@@ -387,11 +385,11 @@ int log_error_write(server *srv, const char *filename, unsigned int line, const - - int log_error_write_multiline_buffer(server *srv, const char *filename, unsigned int line, buffer *multiline, const char *fmt, ...) { - va_list ap; -- size_t prefix_used; -+ size_t prefix_len; - buffer *b = srv->errorlog_buf; - char *pos, *end, *current_line; - -- if (multiline->used < 2) return 0; -+ if (buffer_string_is_empty(multiline)) return 0; - - if (-1 == log_buffer_prepare(b, srv, filename, line)) return 0; - -@@ -399,20 +397,19 @@ int log_error_write_multiline_buffer(server *srv, const char *filename, unsigned - log_buffer_append_printf(b, fmt, ap); - va_end(ap); - -- prefix_used = b->used; -+ prefix_len = buffer_string_length(b); - - current_line = pos = multiline->ptr; -- end = multiline->ptr + multiline->used; -+ end = multiline->ptr + buffer_string_length(multiline); - -- for ( ; pos < end ; ++pos) { -+ for ( ; pos <= end ; ++pos) { - switch (*pos) { - case '\n': - case '\r': - case '\0': /* handles end of string */ - if (current_line < pos) { - /* truncate to prefix */ -- b->used = prefix_used; -- b->ptr[b->used - 1] = '\0'; -+ buffer_string_set_length(b, prefix_len); - - buffer_append_string_len(b, current_line, pos - current_line); - log_write(srv, b); -diff --git a/src/mod_access.c b/src/mod_access.c -index 7b88e19..a6c25a4 100644 ---- a/src/mod_access.c -+++ b/src/mod_access.c -@@ -125,11 +125,11 @@ URIHANDLER_FUNC(mod_access_uri_handler) { - int s_len; - size_t k; - -- if (con->uri.path->used == 0) return HANDLER_GO_ON; -+ if (buffer_is_empty(con->uri.path)) return HANDLER_GO_ON; - - mod_access_patch_connection(srv, con, p); - -- s_len = con->uri.path->used - 1; -+ s_len = buffer_string_length(con->uri.path); - - if (con->conf.log_request_handling) { - log_error_write(srv, __FILE__, __LINE__, "s", -@@ -138,12 +138,12 @@ URIHANDLER_FUNC(mod_access_uri_handler) { - - for (k = 0; k < p->conf.access_deny->used; k++) { - data_string *ds = (data_string *)p->conf.access_deny->data[k]; -- int ct_len = ds->value->used - 1; -+ int ct_len = buffer_string_length(ds->value); - int denied = 0; - - - if (ct_len > s_len) continue; -- if (ds->value->used == 0) continue; -+ if (buffer_is_empty(ds->value)) continue; - - /* if we have a case-insensitive FS we have to lower-case the URI here too */ - -diff --git a/src/mod_accesslog.c b/src/mod_accesslog.c -index 20d52b9..9bb3fe2 100644 ---- a/src/mod_accesslog.c -+++ b/src/mod_accesslog.c -@@ -223,9 +223,9 @@ static void accesslog_append_escaped(buffer *dest, buffer *str) { - static int accesslog_parse_format(server *srv, format_fields *fields, buffer *format) { - size_t i, j, k = 0, start = 0; - -- if (format->used == 0) return -1; -+ if (buffer_is_empty(format)) return -1; - -- for (i = 0; i < format->used - 1; i++) { -+ for (i = 0; i < buffer_string_length(format); i++) { - switch(format->ptr[i]) { - case '%': - if (i > 0 && start != i) { -@@ -297,11 +297,11 @@ static int accesslog_parse_format(server *srv, format_fields *fields, buffer *fo - case '{': - /* go forward to } */ - -- for (k = i+2; k < format->used - 1; k++) { -+ for (k = i+2; k < buffer_string_length(format); k++) { - if (format->ptr[k] == '}') break; - } - -- if (k == format->used - 1) { -+ if (k == buffer_string_length(format)) { - log_error_write(srv, __FILE__, __LINE__, "s", "%{ has to be terminated by a }"); - return -1; - } -@@ -416,9 +416,9 @@ FREE_FUNC(mod_accesslog_free) { - - if (!s) continue; - -- if (s->access_logbuffer->used) { -+ if (!buffer_string_is_empty(s->access_logbuffer)) { - if (s->log_access_fd != -1) { -- write(s->log_access_fd, s->access_logbuffer->ptr, s->access_logbuffer->used - 1); -+ write(s->log_access_fd, CONST_BUF_LEN(s->access_logbuffer)); - } - } - -@@ -502,7 +502,7 @@ SETDEFAULTS_FUNC(log_access_open) { - - /* parse */ - -- if (s->format->used) { -+ if (!buffer_is_empty(s->format)) { - size_t j, count; - - s->parsed_format = calloc(1, sizeof(*(s->parsed_format))); -@@ -572,7 +572,7 @@ SETDEFAULTS_FUNC(log_access_open) { - continue; - } - -- if (s->access_logfile->used < 2) continue; -+ if (buffer_string_is_empty(s->access_logfile)) continue; - - if (-1 == (s->log_access_fd = open_logfile_or_pipe(srv, s->access_logfile->ptr))) - return HANDLER_ERROR; -@@ -591,17 +591,17 @@ SIGHUP_FUNC(log_access_cycle) { - for (i = 0; i < srv->config_context->used; i++) { - plugin_config *s = p->config_storage[i]; - -- if (s->access_logbuffer->used) { -+ if (!buffer_string_is_empty(s->access_logbuffer)) { - if (s->log_access_fd != -1) { -- write(s->log_access_fd, s->access_logbuffer->ptr, s->access_logbuffer->used - 1); -+ write(s->log_access_fd, CONST_BUF_LEN(s->access_logbuffer)); - } - - buffer_reset(s->access_logbuffer); - } - -- if (s->use_syslog == 0 && -- s->access_logfile->used > 1 && -- s->access_logfile->ptr[0] != '|') { -+ if (s->use_syslog == 0 -+ && !buffer_string_is_empty(s->access_logfile) -+ && s->access_logfile->ptr[0] != '|') { - - if (-1 != s->log_access_fd) close(s->log_access_fd); - -@@ -691,8 +691,8 @@ REQUESTDONE_FUNC(log_access_write) { - b = p->conf.access_logbuffer; - } - -- if (b->used == 0) { -- buffer_copy_string_len(b, CONST_STR_LEN("")); -+ if (buffer_is_empty(b)) { -+ buffer_string_set_length(b, 0); - } - - for (j = 0; j < p->conf.parsed_format->used; j++) { -@@ -715,11 +715,10 @@ REQUESTDONE_FUNC(log_access_write) { - #if defined(HAVE_STRUCT_TM_GMTOFF) - # ifdef HAVE_LOCALTIME_R - localtime_r(&(srv->cur_ts), &tm); -- strftime(p->conf.ts_accesslog_str->ptr, p->conf.ts_accesslog_str->size - 1, p->conf.ts_accesslog_fmt_str->ptr, &tm); -+ buffer_append_strftime(p->conf.ts_accesslog_str, p->conf.ts_accesslog_fmt_str->ptr, &tm); - # else /* HAVE_LOCALTIME_R */ -- strftime(p->conf.ts_accesslog_str->ptr, p->conf.ts_accesslog_str->size - 1, p->conf.ts_accesslog_fmt_str->ptr, localtime_r(&(srv->cur_ts))); -+ buffer_append_strftime(p->conf.ts_accesslog_str, p->conf.ts_accesslog_fmt_str->ptr, localtime(&(srv->cur_ts))); - # endif /* HAVE_LOCALTIME_R */ -- p->conf.ts_accesslog_str->used = strlen(p->conf.ts_accesslog_str->ptr) + 1; - - if (p->conf.append_tz_offset) { - buffer_append_string_len(p->conf.ts_accesslog_str, tm.tm_gmtoff >= 0 ? "+" : "-", 1); -@@ -739,11 +738,10 @@ REQUESTDONE_FUNC(log_access_write) { - #else /* HAVE_STRUCT_TM_GMTOFF */ - # ifdef HAVE_GMTIME_R - gmtime_r(&(srv->cur_ts), &tm); -- strftime(p->conf.ts_accesslog_str->ptr, p->conf.ts_accesslog_str->size - 1, p->conf.ts_accesslog_fmt_str->ptr, &tm); -+ buffer_append_strftime(p->conf.ts_accesslog_str, p->conf.ts_accesslog_fmt_str->ptr, &tm); - # else /* HAVE_GMTIME_R */ -- strftime(p->conf.ts_accesslog_str->ptr, p->conf.ts_accesslog_str->size - 1, p->conf.ts_accesslog_fmt_str->ptr, gmtime(&(srv->cur_ts))); -+ buffer_append_strftime(p->conf.ts_accesslog_str, p->conf.ts_accesslog_fmt_str->ptr, gmtime(&(srv->cur_ts))); - # endif /* HAVE_GMTIME_R */ -- p->conf.ts_accesslog_str->used = strlen(p->conf.ts_accesslog_str->ptr) + 1; - #endif /* HAVE_STRUCT_TM_GMTOFF */ - - *(p->conf.last_generated_accesslog_ts_ptr) = srv->cur_ts; -@@ -765,14 +763,14 @@ REQUESTDONE_FUNC(log_access_write) { - buffer_append_string_len(b, CONST_STR_LEN("-")); - break; - case FORMAT_REMOTE_USER: -- if (NULL != (ds = (data_string *)array_get_element(con->environment, "REMOTE_USER")) && ds->value->used > 1) { -+ if (NULL != (ds = (data_string *)array_get_element(con->environment, "REMOTE_USER")) && !buffer_string_is_empty(ds->value)) { - accesslog_append_escaped(b, ds->value); - } else { - buffer_append_string_len(b, CONST_STR_LEN("-")); - } - break; - case FORMAT_REQUEST_LINE: -- if (con->request.request_line->used) { -+ if (!buffer_string_is_empty(con->request.request_line)) { - accesslog_append_escaped(b, con->request.request_line); - } - break; -@@ -810,7 +808,7 @@ REQUESTDONE_FUNC(log_access_write) { - } - break; - case FORMAT_FILENAME: -- if (con->physical.path->used > 1) { -+ if (!buffer_string_is_empty(con->physical.path)) { - buffer_append_string_buffer(b, con->physical.path); - } else { - buffer_append_string_len(b, CONST_STR_LEN("-")); -@@ -834,14 +832,14 @@ REQUESTDONE_FUNC(log_access_write) { - buffer_append_int(b, srv->cur_ts - con->request_start); - break; - case FORMAT_SERVER_NAME: -- if (con->server_name->used > 1) { -+ if (!buffer_string_is_empty(con->server_name)) { - buffer_append_string_buffer(b, con->server_name); - } else { - buffer_append_string_len(b, CONST_STR_LEN("-")); - } - break; - case FORMAT_HTTP_HOST: -- if (con->uri.authority->used > 1) { -+ if (!buffer_string_is_empty(con->uri.authority)) { - accesslog_append_escaped(b, con->uri.authority); - } else { - buffer_append_string_len(b, CONST_STR_LEN("-")); -@@ -849,7 +847,7 @@ REQUESTDONE_FUNC(log_access_write) { - break; - case FORMAT_REQUEST_PROTOCOL: - buffer_append_string_len(b, -- con->request.http_version == HTTP_VERSION_1_1 ? "HTTP/1.1" : "HTTP/1.0", 8); -+ con->request.http_version == HTTP_VERSION_1_1 ? "HTTP/1.1" : "HTTP/1.0", 8); - break; - case FORMAT_REQUEST_METHOD: - buffer_append_string(b, get_http_method_name(con->request.http_method)); -@@ -904,19 +902,19 @@ REQUESTDONE_FUNC(log_access_write) { - buffer_append_string_len(b, CONST_STR_LEN("\n")); - - if (p->conf.use_syslog || /* syslog doesn't cache */ -- (p->conf.access_logfile->used && p->conf.access_logfile->ptr[0] == '|') || /* pipes don't cache */ -+ (!buffer_string_is_empty(p->conf.access_logfile) && p->conf.access_logfile->ptr[0] == '|') || /* pipes don't cache */ - newts || -- b->used > BUFFER_MAX_REUSE_SIZE) { -+ buffer_string_length(b) >= BUFFER_MAX_REUSE_SIZE) { - if (p->conf.use_syslog) { - #ifdef HAVE_SYSLOG_H -- if (b->used > 2) { -+ if (!buffer_string_is_empty(b)) { - /* syslog appends a \n on its own */ -- syslog(p->conf.syslog_level, "%*s", (int) b->used - 2, b->ptr); -+ buffer_string_set_length(b, buffer_string_length(b) - 1); -+ syslog(p->conf.syslog_level, "%s", b->ptr); - } - #endif - } else if (p->conf.log_access_fd != -1) { -- force_assert(b->used > 0); -- write(p->conf.log_access_fd, b->ptr, b->used - 1); -+ write(p->conf.log_access_fd, CONST_BUF_LEN(b)); - } - buffer_reset(b); - } -diff --git a/src/mod_alias.c b/src/mod_alias.c -index bf22b5f..4625973 100644 ---- a/src/mod_alias.c -+++ b/src/mod_alias.c -@@ -95,10 +95,10 @@ SETDEFAULTS_FUNC(mod_alias_set_defaults) { - for (k = j + 1; k < a->used; k ++) { - const buffer *key = a->data[a->sorted[k]]->key; - -- if (key->used < prefix->used) { -+ if (buffer_string_length(key) < buffer_string_length(prefix)) { - break; - } -- if (memcmp(key->ptr, prefix->ptr, prefix->used - 1) != 0) { -+ if (memcmp(key->ptr, prefix->ptr, buffer_string_length(prefix)) != 0) { - break; - } - /* ok, they have same prefix. check position */ -@@ -151,22 +151,22 @@ PHYSICALPATH_FUNC(mod_alias_physical_handler) { - char *uri_ptr; - size_t k; - -- if (con->physical.path->used == 0) return HANDLER_GO_ON; -+ if (buffer_is_empty(con->physical.path)) return HANDLER_GO_ON; - - mod_alias_patch_connection(srv, con, p); - - /* not to include the tailing slash */ -- basedir_len = (con->physical.basedir->used - 1); -+ basedir_len = buffer_string_length(con->physical.basedir); - if ('/' == con->physical.basedir->ptr[basedir_len-1]) --basedir_len; -- uri_len = con->physical.path->used - 1 - basedir_len; -+ uri_len = buffer_string_length(con->physical.path) - basedir_len; - uri_ptr = con->physical.path->ptr + basedir_len; - - for (k = 0; k < p->conf.alias->used; k++) { - data_string *ds = (data_string *)p->conf.alias->data[k]; -- int alias_len = ds->key->used - 1; -+ int alias_len = buffer_string_length(ds->key); - - if (alias_len > uri_len) continue; -- if (ds->key->used == 0) continue; -+ if (buffer_is_empty(ds->key)) continue; - - if (0 == (con->conf.force_lowercase_filenames ? - strncasecmp(uri_ptr, ds->key->ptr, alias_len) : -diff --git a/src/mod_auth.c b/src/mod_auth.c -index d5a3f1c..1870893 100644 ---- a/src/mod_auth.c -+++ b/src/mod_auth.c -@@ -206,18 +206,18 @@ static handler_t mod_auth_uri_handler(server *srv, connection *con, void *p_d) { - for (k = 0; k < p->conf.auth_require->used; k++) { - buffer *require = p->conf.auth_require->data[k]->key; - -- if (require->used == 0) continue; -- if (con->uri.path->used < require->used) continue; -+ if (buffer_is_empty(require)) continue; -+ if (buffer_string_length(con->uri.path) < buffer_string_length(require)) continue; - - /* if we have a case-insensitive FS we have to lower-case the URI here too */ - - if (con->conf.force_lowercase_filenames) { -- if (0 == strncasecmp(con->uri.path->ptr, require->ptr, require->used - 1)) { -+ if (0 == strncasecmp(con->uri.path->ptr, require->ptr, buffer_string_length(require))) { - auth_required = 1; - break; - } - } else { -- if (0 == strncmp(con->uri.path->ptr, require->ptr, require->used - 1)) { -+ if (0 == strncmp(con->uri.path->ptr, require->ptr, buffer_string_length(require))) { - auth_required = 1; - break; - } -@@ -248,7 +248,7 @@ static handler_t mod_auth_uri_handler(server *srv, connection *con, void *p_d) { - - /* try to get Authorization-header */ - -- if (NULL != (ds = (data_string *)array_get_element(con->request.headers, "Authorization")) && ds->value->used) { -+ if (NULL != (ds = (data_string *)array_get_element(con->request.headers, "Authorization")) && !buffer_is_empty(ds->value)) { - char *auth_realm; - - http_authorization = ds->value->ptr; -@@ -419,7 +419,7 @@ SETDEFAULTS_FUNC(mod_auth_set_defaults) { - return HANDLER_ERROR; - } - -- if (s->auth_backend_conf->used) { -+ if (!buffer_string_is_empty(s->auth_backend_conf)) { - if (0 == strcmp(s->auth_backend_conf->ptr, "htpasswd")) { - s->auth_backend = AUTH_BACKEND_HTPASSWD; - } else if (0 == strcmp(s->auth_backend_conf->ptr, "htdigest")) { -@@ -436,7 +436,7 @@ SETDEFAULTS_FUNC(mod_auth_set_defaults) { - } - - #ifdef USE_LDAP -- if (s->auth_ldap_filter->used) { -+ if (!buffer_string_is_empty(s->auth_ldap_filter)) { - char *dollar; - - /* parse filter */ -@@ -562,7 +562,7 @@ SETDEFAULTS_FUNC(mod_auth_set_defaults) { - } - } - -- switch(s->auth_ldap_hostname->used) { -+ switch(s->auth_backend) { - case AUTH_BACKEND_LDAP: { - handler_t ret = auth_ldap_init(srv, s); - if (ret == HANDLER_ERROR) -@@ -588,7 +588,7 @@ handler_t auth_ldap_init(server *srv, mod_auth_plugin_config *s) { - } - #endif - -- if (s->auth_ldap_hostname->used) { -+ if (!buffer_string_is_empty(s->auth_ldap_hostname)) { - /* free old context */ - if (NULL != s->ldap) ldap_unbind_s(s->ldap); - -@@ -627,7 +627,7 @@ handler_t auth_ldap_init(server *srv, mod_auth_plugin_config *s) { - - - /* 1. */ -- if (s->auth_ldap_binddn->used) { -+ if (!buffer_string_is_empty(s->auth_ldap_binddn)) { - if (LDAP_SUCCESS != (ret = ldap_simple_bind_s(s->ldap, s->auth_ldap_binddn->ptr, s->auth_ldap_bindpw->ptr))) { - log_error_write(srv, __FILE__, __LINE__, "ss", "ldap:", ldap_err2string(ret)); - -diff --git a/src/mod_cgi.c b/src/mod_cgi.c -index f132b8a..8a7cc2b 100644 ---- a/src/mod_cgi.c -+++ b/src/mod_cgi.c -@@ -376,8 +376,7 @@ static int cgi_demux_response(server *srv, handler_ctx *hctx) { - return FDEVENT_HANDLED_FINISHED; - } - -- hctx->response->ptr[n] = '\0'; -- hctx->response->used = n+1; -+ buffer_commit(hctx->response, n); - - /* split header from body */ - -@@ -385,7 +384,7 @@ static int cgi_demux_response(server *srv, handler_ctx *hctx) { - int is_header = 0; - int is_header_end = 0; - size_t last_eol = 0; -- size_t i; -+ size_t i, header_len; - - buffer_append_string_buffer(hctx->response_header, hctx->response); - -@@ -412,8 +411,9 @@ static int cgi_demux_response(server *srv, handler_ctx *hctx) { - - /* nph (non-parsed headers) */ - if (0 == strncmp(hctx->response_header->ptr, "HTTP/1.", 7)) is_header = 1; -- -- for (i = 0; !is_header_end && i < hctx->response_header->used - 1; i++) { -+ -+ header_len = buffer_string_length(hctx->response_header); -+ for (i = 0; !is_header_end && i < header_len; i++) { - char c = hctx->response_header->ptr[i]; - - switch (c) { -@@ -463,26 +463,25 @@ static int cgi_demux_response(server *srv, handler_ctx *hctx) { - } else { - const char *bstart; - size_t blen; -- -+ -+ /* the body starts after the EOL */ -+ bstart = hctx->response_header->ptr + i; -+ blen = header_len - i; -+ - /** - * i still points to the char after the terminating EOL EOL - * - * put it on the last \n again - */ - i--; -- -- /* the body starts after the EOL */ -- bstart = hctx->response_header->ptr + (i + 1); -- blen = (hctx->response_header->used - 1) - (i + 1); -- -+ - /* string the last \r?\n */ - if (i > 0 && (hctx->response_header->ptr[i - 1] == '\r')) { - i--; - } - -- hctx->response_header->ptr[i] = '\0'; -- hctx->response_header->used = i + 1; /* the string + \0 */ -- -+ buffer_string_set_length(hctx->response_header, i); -+ - /* parse the response header */ - cgi_response_parse(srv, con, p, hctx->response_header); - -@@ -738,7 +737,7 @@ static int cgi_create_env(server *srv, connection *con, plugin_data *p, buffer * - - #ifndef __WIN32 - -- if (cgi_handler->used > 1) { -+ if (!buffer_string_is_empty(cgi_handler)) { - /* stat the exec file */ - if (-1 == (stat(cgi_handler->ptr, &st))) { - log_error_write(srv, __FILE__, __LINE__, "sbss", -@@ -800,7 +799,7 @@ static int cgi_create_env(server *srv, connection *con, plugin_data *p, buffer * - } - - if (!buffer_string_is_empty(con->server_name)) { -- size_t len = con->server_name->used - 1; -+ size_t len = buffer_string_length(con->server_name); - - if (con->server_name->ptr[0] == '[') { - const char *colon = strstr(con->server_name->ptr, "]:"); -@@ -938,7 +937,7 @@ static int cgi_create_env(server *srv, connection *con, plugin_data *p, buffer * - - ds = (data_string *)con->request.headers->data[n]; - -- if (ds->value->used && ds->key->used) { -+ if (!buffer_is_empty(ds->value) && !buffer_is_empty(ds->key)) { - buffer_copy_string_encoded_cgi_varnames(p->tmp_buf, CONST_BUF_LEN(ds->key), 1); - - cgi_env_add(&env, CONST_BUF_LEN(p->tmp_buf), CONST_BUF_LEN(ds->value)); -@@ -950,7 +949,7 @@ static int cgi_create_env(server *srv, connection *con, plugin_data *p, buffer * - - ds = (data_string *)con->environment->data[n]; - -- if (ds->value->used && ds->key->used) { -+ if (!buffer_is_empty(ds->value) && !buffer_is_empty(ds->key)) { - buffer_copy_string_encoded_cgi_varnames(p->tmp_buf, CONST_BUF_LEN(ds->key), 0); - - cgi_env_add(&env, CONST_BUF_LEN(p->tmp_buf), CONST_BUF_LEN(ds->value)); -@@ -969,7 +968,7 @@ static int cgi_create_env(server *srv, connection *con, plugin_data *p, buffer * - args = malloc(sizeof(*args) * argc); - i = 0; - -- if (cgi_handler->used > 1) { -+ if (!buffer_string_is_empty(cgi_handler)) { - args[i++] = cgi_handler->ptr; - } - args[i++] = con->physical.path->ptr; -@@ -1071,7 +1070,7 @@ static int cgi_create_env(server *srv, connection *con, plugin_data *p, buffer * - } - break; - case MEM_CHUNK: -- if ((r = write(to_cgi_fds[1], c->mem->ptr + c->offset, c->mem->used - c->offset - 1)) < 0) { -+ if ((r = write(to_cgi_fds[1], c->mem->ptr + c->offset, buffer_string_length(c->mem) - c->offset)) < 0) { - switch(errno) { - case ENOSPC: - con->http_status = 507; -@@ -1185,7 +1184,7 @@ URIHANDLER_FUNC(cgi_is_handled) { - - if (con->mode != DIRECT) return HANDLER_GO_ON; - -- if (fn->used == 0) return HANDLER_GO_ON; -+ if (buffer_is_empty(fn)) return HANDLER_GO_ON; - - mod_cgi_patch_connection(srv, con, p); - -@@ -1193,13 +1192,13 @@ URIHANDLER_FUNC(cgi_is_handled) { - if (!S_ISREG(sce->st.st_mode)) return HANDLER_GO_ON; - if (p->conf.execute_x_only == 1 && (sce->st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH)) == 0) return HANDLER_GO_ON; - -- s_len = fn->used - 1; -+ s_len = buffer_string_length(fn); - - for (k = 0; k < p->conf.cgi->used; k++) { - data_string *ds = (data_string *)p->conf.cgi->data[k]; -- size_t ct_len = ds->key->used - 1; -+ size_t ct_len = buffer_string_length(ds->key); - -- if (ds->key->used == 0) continue; -+ if (buffer_is_empty(ds->key)) continue; - if (s_len < ct_len) continue; - - if (0 == strncmp(fn->ptr + s_len - ct_len, ds->key->ptr, ct_len)) { -diff --git a/src/mod_cml.c b/src/mod_cml.c -index 3033d42..baa23b3 100644 ---- a/src/mod_cml.c -+++ b/src/mod_cml.c -@@ -185,20 +185,18 @@ static int cache_call_lua(server *srv, connection *con, plugin_data *p, buffer * - /* cleanup basedir */ - b = p->baseurl; - buffer_copy_buffer(b, con->uri.path); -- for (c = b->ptr + b->used - 1; c > b->ptr && *c != '/'; c--); -+ for (c = b->ptr + buffer_string_length(b); c > b->ptr && *c != '/'; c--); - - if (*c == '/') { -- b->used = c - b->ptr + 2; -- *(c+1) = '\0'; -+ buffer_string_set_length(b, c - b->ptr + 1); - } - - b = p->basedir; - buffer_copy_buffer(b, con->physical.path); -- for (c = b->ptr + b->used - 1; c > b->ptr && *c != '/'; c--); -+ for (c = b->ptr + buffer_string_length(b); c > b->ptr && *c != '/'; c--); - - if (*c == '/') { -- b->used = c - b->ptr + 2; -- *(c+1) = '\0'; -+ buffer_string_set_length(b, c - b->ptr + 1); - } - - -@@ -274,7 +272,7 @@ URIHANDLER_FUNC(mod_cml_is_handled) { - - if (buffer_string_is_empty(p->conf.ext)) return HANDLER_GO_ON; - -- if (!buffer_is_equal_right_len(con->physical.path, p->conf.ext, p->conf.ext->used - 1)) { -+ if (!buffer_is_equal_right_len(con->physical.path, p->conf.ext, buffer_string_length(p->conf.ext))) { - return HANDLER_GO_ON; - } - -diff --git a/src/mod_cml_funcs.c b/src/mod_cml_funcs.c -index 9d859c7..a377edd 100644 ---- a/src/mod_cml_funcs.c -+++ b/src/mod_cml_funcs.c -@@ -35,14 +35,9 @@ typedef char HASHHEX[HASHHEXLEN+1]; - int f_crypto_md5(lua_State *L) { - li_MD5_CTX Md5Ctx; - HASH HA1; -- buffer b; - char hex[33]; - int n = lua_gettop(L); - -- b.ptr = hex; -- b.used = 0; -- b.size = sizeof(hex); -- - if (n != 1) { - lua_pushstring(L, "md5: expected one argument"); - lua_error(L); -@@ -57,9 +52,9 @@ int f_crypto_md5(lua_State *L) { - li_MD5_Update(&Md5Ctx, (unsigned char *)lua_tostring(L, 1), lua_strlen(L, 1)); - li_MD5_Final(HA1, &Md5Ctx); - -- buffer_copy_string_hex(&b, (char *)HA1, 16); -+ li_tohex(hex, (const char*) HA1, 16); - -- lua_pushstring(L, b.ptr); -+ lua_pushstring(L, hex); - - return 1; - } -diff --git a/src/mod_cml_lua.c b/src/mod_cml_lua.c -index 63dd1e7..895a709 100644 ---- a/src/mod_cml_lua.c -+++ b/src/mod_cml_lua.c -@@ -102,13 +102,14 @@ static int c_to_lua_push(lua_State *L, int tbl, const char *key, size_t key_len, - - static int cache_export_get_params(lua_State *L, int tbl, buffer *qrystr) { - size_t is_key = 1; -- size_t i; -+ size_t i, len; - char *key = NULL, *val = NULL; - - key = qrystr->ptr; - - /* we need the \0 */ -- for (i = 0; i < qrystr->used; i++) { -+ len = buffer_string_length(qrystr); -+ for (i = 0; i <= len; i++) { - switch(qrystr->ptr[i]) { - case '=': - if (is_key) { -@@ -129,8 +130,8 @@ static int cache_export_get_params(lua_State *L, int tbl, buffer *qrystr) { - qrystr->ptr[i] = '\0'; - - c_to_lua_push(L, tbl, -- key, strlen(key), -- val, strlen(val)); -+ key, strlen(key), -+ val, strlen(val)); - } - - key = qrystr->ptr + i + 1; -@@ -398,7 +399,6 @@ int cache_parse_lua(server *srv, connection *con, plugin_data *p, buffer *fn) { - if (ret == 0) { - data_string *ds; - char timebuf[sizeof("Sat, 23 Jul 2005 21:20:01 GMT")]; -- buffer tbuf; - - con->file_finished = 1; - -@@ -411,17 +411,11 @@ int cache_parse_lua(server *srv, connection *con, plugin_data *p, buffer *fn) { - strftime(timebuf, sizeof(timebuf), "%a, %d %b %Y %H:%M:%S GMT", gmtime(&mtime)); - - response_header_overwrite(srv, con, CONST_STR_LEN("Last-Modified"), timebuf, sizeof(timebuf) - 1); -- -- tbuf.ptr = timebuf; -- tbuf.used = sizeof(timebuf); -- tbuf.size = sizeof(timebuf); -- } else { -- tbuf.ptr = ds->value->ptr; -- tbuf.used = ds->value->used; -- tbuf.size = ds->value->size; -+ ds = (data_string *)array_get_element(con->response.headers, "Last-Modified"); -+ force_assert(NULL != ds); - } - -- if (HANDLER_FINISHED == http_response_handle_cachable(srv, con, &tbuf)) { -+ if (HANDLER_FINISHED == http_response_handle_cachable(srv, con, ds->value)) { - /* ok, the client already has our content, - * no need to send it again */ - -diff --git a/src/mod_compress.c b/src/mod_compress.c -index 120b379..f0ffa1c 100644 ---- a/src/mod_compress.c -+++ b/src/mod_compress.c -@@ -244,6 +244,7 @@ static int deflate_file_to_buffer_gzip(server *srv, connection *con, plugin_data - unsigned char *c; - unsigned long crc; - z_stream z; -+ size_t outlen; - - UNUSED(srv); - UNUSED(con); -@@ -282,9 +283,9 @@ static int deflate_file_to_buffer_gzip(server *srv, connection *con, plugin_data - c[8] = 0x00; /* extra flags */ - c[9] = 0x03; /* UNIX */ - -- p->b->used = 10; -- z.next_out = (unsigned char *)p->b->ptr + p->b->used; -- z.avail_out = p->b->size - p->b->used - 9; -+ outlen = 10; -+ z.next_out = (unsigned char *)p->b->ptr + outlen; -+ z.avail_out = p->b->size - outlen - 9; - z.total_out = 0; - - if (Z_STREAM_END != deflate(&z, Z_FINISH)) { -@@ -293,11 +294,11 @@ static int deflate_file_to_buffer_gzip(server *srv, connection *con, plugin_data - } - - /* trailer */ -- p->b->used += z.total_out; -+ outlen += z.total_out; - - crc = generate_crc32c(start, st_size); - -- c = (unsigned char *)p->b->ptr + p->b->used; -+ c = (unsigned char *)p->b->ptr + outlen; - - c[0] = (crc >> 0) & 0xff; - c[1] = (crc >> 8) & 0xff; -@@ -307,8 +308,8 @@ static int deflate_file_to_buffer_gzip(server *srv, connection *con, plugin_data - c[5] = (z.total_in >> 8) & 0xff; - c[6] = (z.total_in >> 16) & 0xff; - c[7] = (z.total_in >> 24) & 0xff; -- p->b->used += 8; -- p->b->ptr[p->b->used++] = '\0'; -+ outlen += 8; -+ buffer_commit(p->b, outlen); - - if (Z_OK != deflateEnd(&z)) { - return -1; -@@ -398,16 +399,15 @@ static int deflate_file_to_buffer_bzip2(server *srv, connection *con, plugin_dat - return -1; - } - -+ if (BZ_OK != BZ2_bzCompressEnd(&bz)) { -+ return -1; -+ } -+ - /* file is too large for now */ - if (bz.total_out_hi32) return -1; - - /* trailer */ -- p->b->used = bz.total_out_lo32; -- p->b->ptr[p->b->used++] = '\0'; -- -- if (BZ_OK != BZ2_bzCompressEnd(&bz)) { -- return -1; -- } -+ buffer_commit(p->b, bz.total_out_lo32); - - return 0; - } -@@ -434,8 +434,8 @@ static int deflate_file_to_file(server *srv, connection *con, plugin_data *p, bu - buffer_copy_buffer(p->ofn, p->conf.compress_cache_dir); - buffer_append_slash(p->ofn); - -- if (0 == strncmp(con->physical.path->ptr, con->physical.doc_root->ptr, con->physical.doc_root->used-1)) { -- buffer_append_string(p->ofn, con->physical.path->ptr + con->physical.doc_root->used - 1); -+ if (0 == strncmp(con->physical.path->ptr, con->physical.doc_root->ptr, buffer_string_length(con->physical.doc_root))) { -+ buffer_append_string(p->ofn, con->physical.path->ptr + buffer_string_length(con->physical.doc_root)); - } else { - buffer_append_string_buffer(p->ofn, con->uri.path); - } -@@ -883,7 +883,7 @@ PHYSICALPATH_FUNC(mod_compress_physical) { - } - - /* deflate it */ -- if (use_etag && p->conf.compress_cache_dir->used) { -+ if (use_etag && !buffer_string_is_empty(p->conf.compress_cache_dir)) { - if (0 != deflate_file_to_file(srv, con, p, con->physical.path, sce, compression_type)) - return HANDLER_GO_ON; - } else { -@@ -897,7 +897,7 @@ PHYSICALPATH_FUNC(mod_compress_physical) { - } - response_header_overwrite(srv, con, CONST_STR_LEN("Content-Type"), CONST_BUF_LEN(sce->content_type)); - /* let mod_staticfile handle the cached compressed files, physical path was modified */ -- return (use_etag && p->conf.compress_cache_dir->used) ? HANDLER_GO_ON : HANDLER_FINISHED; -+ return (use_etag && !buffer_string_is_empty(p->conf.compress_cache_dir)) ? HANDLER_GO_ON : HANDLER_FINISHED; - } - } - } -diff --git a/src/mod_dirlisting.c b/src/mod_dirlisting.c -index e2e0bfa..d8bf3a3 100644 ---- a/src/mod_dirlisting.c -+++ b/src/mod_dirlisting.c -@@ -492,7 +492,7 @@ static void http_list_directory_header(server *srv, connection *con, plugin_data - buffer_append_string_encoded(out, CONST_BUF_LEN(con->uri.path), ENCODING_MINIMAL_XML); - buffer_append_string_len(out, CONST_STR_LEN("</title>\n")); - -- if (p->conf.external_css->used > 1) { -+ if (!buffer_string_is_empty(p->conf.external_css)) { - buffer_append_string_len(out, CONST_STR_LEN("<link rel=\"stylesheet\" type=\"text/css\" href=\"")); - buffer_append_string_buffer(out, p->conf.external_css); - buffer_append_string_len(out, CONST_STR_LEN("\" />\n")); -@@ -614,7 +614,7 @@ static void http_list_directory_footer(server *srv, connection *con, plugin_data - "<div class=\"foot\">" - )); - -- if (p->conf.set_footer->used > 1) { -+ if (buffer_string_is_empty(p->conf.set_footer)) { - buffer_append_string_buffer(out, p->conf.set_footer); - } else if (buffer_is_empty(con->conf.server_tag)) { - buffer_append_string_len(out, CONST_STR_LEN(PACKAGE_DESC)); -@@ -653,9 +653,9 @@ static int http_list_directory(server *srv, connection *con, plugin_data *p, buf - struct tm tm; - #endif - -- if (dir->used == 0) return -1; -+ if (buffer_string_is_empty(dir)) return -1; - -- i = dir->used - 1; -+ i = buffer_string_length(dir); - - #ifdef HAVE_PATHCONF - if (0 >= (name_max = pathconf(dir->ptr, _PC_NAME_MAX))) { -@@ -672,8 +672,8 @@ static int http_list_directory(server *srv, connection *con, plugin_data *p, buf - name_max = NAME_MAX; - #endif - -- path = malloc(dir->used + name_max); -- force_assert(path); -+ path = malloc(buffer_string_length(dir) + name_max + 1); -+ force_assert(NULL != path); - strcpy(path, dir->ptr); - path_file = path + i; - -@@ -846,10 +846,10 @@ static int http_list_directory(server *srv, connection *con, plugin_data *p, buf - data_string *ds = (data_string *)con->conf.mimetypes->data[k]; - size_t ct_len; - -- if (ds->key->used == 0) -+ if (buffer_is_empty(ds->key)) - continue; - -- ct_len = ds->key->used - 1; -+ ct_len = buffer_string_length(ds->key); - if (tmp->namelen < ct_len) - continue; - -@@ -925,9 +925,9 @@ URIHANDLER_FUNC(mod_dirlisting_subrequest) { - - if (con->mode != DIRECT) return HANDLER_GO_ON; - -- if (con->physical.path->used == 0) return HANDLER_GO_ON; -- if (con->uri.path->used == 0) return HANDLER_GO_ON; -- if (con->uri.path->ptr[con->uri.path->used - 2] != '/') return HANDLER_GO_ON; -+ if (buffer_is_empty(con->physical.path)) return HANDLER_GO_ON; -+ if (buffer_is_empty(con->uri.path)) return HANDLER_GO_ON; -+ if (con->uri.path->ptr[buffer_string_length(con->uri.path) - 1] != '/') return HANDLER_GO_ON; - - mod_dirlisting_patch_connection(srv, con, p); - -diff --git a/src/mod_evasive.c b/src/mod_evasive.c -index a20aff5..d9b8732 100644 ---- a/src/mod_evasive.c -+++ b/src/mod_evasive.c -@@ -138,7 +138,7 @@ URIHANDLER_FUNC(mod_evasive_uri_handler) { - size_t conns_by_ip = 0; - size_t j; - -- if (con->uri.path->used == 0) return HANDLER_GO_ON; -+ if (buffer_is_empty(con->uri.path)) return HANDLER_GO_ON; - - mod_evasive_patch_connection(srv, con, p); - -diff --git a/src/mod_evhost.c b/src/mod_evhost.c -index 5281523..e728551 100644 ---- a/src/mod_evhost.c -+++ b/src/mod_evhost.c -@@ -146,7 +146,7 @@ SETDEFAULTS_FUNC(mod_evhost_set_defaults) { - return HANDLER_ERROR; - } - -- if (s->path_pieces_raw->used != 0) { -+ if (!buffer_string_is_empty(s->path_pieces_raw)) { - mod_evhost_parse_pattern(s); - } - } -@@ -164,8 +164,7 @@ SETDEFAULTS_FUNC(mod_evhost_set_defaults) { - */ - - static int mod_evhost_parse_host(connection *con,array *host) { -- /* con->uri.authority->used is always > 0 if we come here */ -- register char *ptr = con->uri.authority->ptr + con->uri.authority->used - 1; -+ register char *ptr = con->uri.authority->ptr + buffer_string_length(con->uri.authority); - char *colon = ptr; /* needed to filter out the colon (if exists) */ - int first = 1; - data_string *ds; -@@ -265,7 +264,7 @@ static handler_t mod_evhost_uri_handler(server *srv, connection *con, void *p_d) - stat_cache_entry *sce = NULL; - - /* not authority set */ -- if (con->uri.authority->used == 0) return HANDLER_GO_ON; -+ if (buffer_string_is_empty(con->uri.authority)) return HANDLER_GO_ON; - - mod_evhost_patch_connection(srv, con, p); - -@@ -300,9 +299,7 @@ static handler_t mod_evhost_uri_handler(server *srv, connection *con, void *p_d) - buffer_append_string_len(p->tmp_buf, con->uri.authority->ptr, colon - con->uri.authority->ptr); /* adds fqdn */ - } - } else if (NULL != (ds = (data_string *)array_get_element(parsed_host,p->conf.path_pieces[i]->ptr))) { -- if (ds->value->used) { -- buffer_append_string_buffer(p->tmp_buf,ds->value); -- } -+ buffer_append_string_buffer(p->tmp_buf,ds->value); - } else { - /* unhandled %-sequence */ - } -diff --git a/src/mod_expire.c b/src/mod_expire.c -index 31a81b7..e26c3c6 100644 ---- a/src/mod_expire.c -+++ b/src/mod_expire.c -@@ -90,7 +90,7 @@ static int mod_expire_get_offset(server *srv, plugin_data *p, buffer *expire, ti - * e.g. 'access 1 years' - */ - -- if (expire->used == 0) { -+ if (buffer_string_is_empty(expire)) { - log_error_write(srv, __FILE__, __LINE__, "s", - "empty:"); - return -1; -@@ -288,22 +288,21 @@ URIHANDLER_FUNC(mod_expire_path_handler) { - int s_len; - size_t k; - -- if (con->uri.path->used == 0) return HANDLER_GO_ON; -+ if (buffer_is_empty(con->uri.path)) return HANDLER_GO_ON; - - mod_expire_patch_connection(srv, con, p); - -- s_len = con->uri.path->used - 1; -+ s_len = buffer_string_length(con->uri.path); - - for (k = 0; k < p->conf.expire_url->used; k++) { - data_string *ds = (data_string *)p->conf.expire_url->data[k]; -- int ct_len = ds->key->used - 1; -+ int ct_len = buffer_string_length(ds->key); - - if (ct_len > s_len) continue; -- if (ds->key->used == 0) continue; -+ if (buffer_is_empty(ds->key)) continue; - - if (0 == strncmp(con->uri.path->ptr, ds->key->ptr, ct_len)) { - time_t ts, expires; -- size_t len; - stat_cache_entry *sce = NULL; - - /* if stat fails => sce == NULL, ignore return value */ -@@ -332,14 +331,8 @@ URIHANDLER_FUNC(mod_expire_path_handler) { - /* expires should be at least srv->cur_ts */ - if (expires < srv->cur_ts) expires = srv->cur_ts; - -- if (0 == (len = strftime(p->expire_tstmp->ptr, p->expire_tstmp->size - 1, -- "%a, %d %b %Y %H:%M:%S GMT", gmtime(&(expires))))) { -- /* could not set expire header, out of mem */ -- -- return HANDLER_GO_ON; -- } -- -- p->expire_tstmp->used = len + 1; -+ buffer_string_prepare_copy(p->expire_tstmp, 255); -+ buffer_append_strftime(p->expire_tstmp, "%a, %d %b %Y %H:%M:%S GMT", gmtime(&(expires))); - - /* HTTP/1.0 */ - response_header_overwrite(srv, con, CONST_STR_LEN("Expires"), CONST_BUF_LEN(p->expire_tstmp)); -diff --git a/src/mod_extforward.c b/src/mod_extforward.c -index 99c4af5..7f77982 100644 ---- a/src/mod_extforward.c -+++ b/src/mod_extforward.c -@@ -236,7 +236,7 @@ static void put_string_into_array_len(array *ary, const char *str, int len) - static array *extract_forward_array(buffer *pbuffer) - { - array *result = array_init(); -- if (pbuffer->used > 0) { -+ if (!buffer_string_is_empty(pbuffer)) { - char *base, *curr; - /* state variable, 0 means not in string, 1 means in string */ - int in_str = 0; -diff --git a/src/mod_fastcgi.c b/src/mod_fastcgi.c -index a935961..d16306c 100644 ---- a/src/mod_fastcgi.c -+++ b/src/mod_fastcgi.c -@@ -784,7 +784,7 @@ static int parse_binpath(char_array *env, buffer *b) { - /* search for spaces */ - - start = b->ptr; -- for (i = 0; i < b->used - 1; i++) { -+ for (i = 0; i < buffer_string_length(b); i++) { - switch(b->ptr[i]) { - case ' ': - case '\t': -@@ -863,19 +863,19 @@ static int fcgi_spawn_connection(server *srv, - - #ifdef HAVE_SYS_UN_H - fcgi_addr_un.sun_family = AF_UNIX; -- if (proc->unixsocket->used > sizeof(fcgi_addr_un.sun_path)) { -+ if (buffer_string_length(proc->unixsocket) + 1 > sizeof(fcgi_addr_un.sun_path)) { - log_error_write(srv, __FILE__, __LINE__, "sB", - "ERROR: Unix Domain socket filename too long:", - proc->unixsocket); - return -1; - } -- memcpy(fcgi_addr_un.sun_path, proc->unixsocket->ptr, proc->unixsocket->used); -+ memcpy(fcgi_addr_un.sun_path, proc->unixsocket->ptr, buffer_string_length(proc->unixsocket) + 1); - - #ifdef SUN_LEN - servlen = SUN_LEN(&fcgi_addr_un); - #else - /* stevens says: */ -- servlen = proc->unixsocket->used + sizeof(fcgi_addr_un.sun_family); -+ servlen = buffer_string_length(proc->unixsocket) + 1 + sizeof(fcgi_addr_un.sun_family); - #endif - socket_type = AF_UNIX; - fcgi_addr = (struct sockaddr *) &fcgi_addr_un; -@@ -1324,7 +1324,7 @@ SETDEFAULTS_FUNC(mod_fastcgi_set_defaults) { - /* unix domain socket */ - struct sockaddr_un un; - -- if (host->unixsocket->used > sizeof(un.sun_path) - 2) { -+ if (buffer_string_length(host->unixsocket) + 1 > sizeof(un.sun_path) - 2) { - log_error_write(srv, __FILE__, __LINE__, "sbsbsbs", - "unixsocket is too long in:", - da->key, "= (", -@@ -1667,19 +1667,19 @@ static connection_result_t fcgi_establish_connection(server *srv, handler_ctx *h - #ifdef HAVE_SYS_UN_H - /* use the unix domain socket */ - fcgi_addr_un.sun_family = AF_UNIX; -- if (proc->unixsocket->used > sizeof(fcgi_addr_un.sun_path)) { -+ if (buffer_string_length(proc->unixsocket) + 1 > sizeof(fcgi_addr_un.sun_path)) { - log_error_write(srv, __FILE__, __LINE__, "sB", - "ERROR: Unix Domain socket filename too long:", - proc->unixsocket); - return -1; - } -- memcpy(fcgi_addr_un.sun_path, proc->unixsocket->ptr, proc->unixsocket->used); -+ memcpy(fcgi_addr_un.sun_path, proc->unixsocket->ptr, buffer_string_length(proc->unixsocket) + 1); - - #ifdef SUN_LEN - servlen = SUN_LEN(&fcgi_addr_un); - #else - /* stevens says: */ -- servlen = proc->unixsocket->used + sizeof(fcgi_addr_un.sun_family); -+ servlen = buffer_string_length(proc->unixsocket) + 1 + sizeof(fcgi_addr_un.sun_family); - #endif - fcgi_addr = (struct sockaddr *) &fcgi_addr_un; - -@@ -1774,7 +1774,7 @@ static int fcgi_env_add_request_headers(server *srv, connection *con, plugin_dat - - ds = (data_string *)con->request.headers->data[i]; - -- if (ds->value->used && ds->key->used) { -+ if (!buffer_is_empty(ds->value) && !buffer_is_empty(ds->key)) { - buffer_copy_string_encoded_cgi_varnames(srv->tmp_buf, CONST_BUF_LEN(ds->key), 1); - - FCGI_ENV_ADD_CHECK(fcgi_env_add(p->fcgi_env, CONST_BUF_LEN(srv->tmp_buf), CONST_BUF_LEN(ds->value)),con); -@@ -1786,7 +1786,7 @@ static int fcgi_env_add_request_headers(server *srv, connection *con, plugin_dat - - ds = (data_string *)con->environment->data[i]; - -- if (ds->value->used && ds->key->used) { -+ if (!buffer_is_empty(ds->value) && !buffer_is_empty(ds->key)) { - buffer_copy_string_encoded_cgi_varnames(srv->tmp_buf, CONST_BUF_LEN(ds->key), 0); - - FCGI_ENV_ADD_CHECK(fcgi_env_add(p->fcgi_env, CONST_BUF_LEN(srv->tmp_buf), CONST_BUF_LEN(ds->value)), con); -@@ -1833,8 +1833,8 @@ static int fcgi_create_env(server *srv, handler_ctx *hctx, size_t request_id) { - FCGI_ENV_ADD_CHECK(fcgi_env_add(p->fcgi_env, CONST_STR_LEN("SERVER_SOFTWARE"), CONST_BUF_LEN(con->conf.server_tag)),con) - } - -- if (con->server_name->used) { -- size_t len = con->server_name->used - 1; -+ if (!buffer_is_empty(con->server_name)) { -+ size_t len = buffer_string_length(con->server_name); - - if (con->server_name->ptr[0] == '[') { - const char *colon = strstr(con->server_name->ptr, "]:"); -@@ -1961,7 +1961,7 @@ static int fcgi_create_env(server *srv, handler_ctx *hctx, size_t request_id) { - FCGI_ENV_ADD_CHECK(fcgi_env_add(p->fcgi_env, CONST_STR_LEN("DOCUMENT_ROOT"), CONST_BUF_LEN(con->physical.basedir)),con) - } - -- if (host->strip_request_uri->used > 1) { -+ if (!buffer_string_is_empty(host->strip_request_uri)) { - /* we need at least one char to strip off */ - /** - * /app1/index/list -@@ -1971,18 +1971,18 @@ static int fcgi_create_env(server *srv, handler_ctx *hctx, size_t request_id) { - * /index/list - * - */ -- if ('/' != host->strip_request_uri->ptr[host->strip_request_uri->used - 2]) { -+ if ('/' != host->strip_request_uri->ptr[buffer_string_length(host->strip_request_uri) - 1]) { - /* fix the user-input to have / as last char */ - buffer_append_string_len(host->strip_request_uri, CONST_STR_LEN("/")); - } - -- if (con->request.orig_uri->used >= host->strip_request_uri->used && -- 0 == strncmp(con->request.orig_uri->ptr, host->strip_request_uri->ptr, host->strip_request_uri->used - 1)) { -+ if (buffer_string_length(con->request.orig_uri) >= buffer_string_length(host->strip_request_uri) && -+ 0 == strncmp(con->request.orig_uri->ptr, host->strip_request_uri->ptr, buffer_string_length(host->strip_request_uri))) { - /* the left is the same */ - - fcgi_env_add(p->fcgi_env, CONST_STR_LEN("REQUEST_URI"), -- con->request.orig_uri->ptr + (host->strip_request_uri->used - 2), -- con->request.orig_uri->used - (host->strip_request_uri->used - 2) - 1); -+ con->request.orig_uri->ptr + (buffer_string_length(host->strip_request_uri) - 1), -+ buffer_string_length(con->request.orig_uri) - (buffer_string_length(host->strip_request_uri) - 1)); - } else { - FCGI_ENV_ADD_CHECK(fcgi_env_add(p->fcgi_env, CONST_STR_LEN("REQUEST_URI"), CONST_BUF_LEN(con->request.orig_uri)),con) - } -@@ -2022,7 +2022,7 @@ static int fcgi_create_env(server *srv, handler_ctx *hctx, size_t request_id) { - fcgi_header(&(header), FCGI_PARAMS, request_id, 0, 0); - buffer_append_string_len(b, (const char *)&header, sizeof(header)); - -- hctx->wb->bytes_in += b->used - 1; -+ hctx->wb->bytes_in += buffer_string_length(b); - chunkqueue_append_buffer(hctx->wb, b); - buffer_free(b); - } -@@ -2303,11 +2303,10 @@ static int fastcgi_get_packet(server *srv, handler_ctx *hctx, fastcgi_response_p - if (0 == toread) break; - } - -- if ((packet->b->used == 0) || -- (packet->b->used - 1 < sizeof(FCGI_Header))) { -+ if (buffer_string_length(packet->b) < sizeof(FCGI_Header)) { - /* no header */ - if (hctx->plugin_data->conf.debug) { -- log_error_write(srv, __FILE__, __LINE__, "sdsds", "FastCGI: header too small:", packet->b->used, "bytes <", sizeof(FCGI_Header), "bytes, waiting for more data"); -+ log_error_write(srv, __FILE__, __LINE__, "sdsds", "FastCGI: header too small:", buffer_string_length(packet->b), "bytes <", sizeof(FCGI_Header), "bytes, waiting for more data"); - } - - buffer_free(packet->b); -@@ -2324,13 +2323,13 @@ static int fastcgi_get_packet(server *srv, handler_ctx *hctx, fastcgi_response_p - packet->padding = header->paddingLength; - - /* ->b should only be the content */ -- buffer_copy_string_len(packet->b, CONST_STR_LEN("")); /* used == 1 */ -+ buffer_string_set_length(packet->b, 0); - - if (packet->len) { - /* copy the content */ -- for (; c && (packet->b->used < packet->len + 1); c = c->next) { -- size_t weWant = packet->len - (packet->b->used - 1); -- size_t weHave = c->mem->used - c->offset - offset - 1; -+ for (; c && (buffer_string_length(packet->b) < packet->len); c = c->next) { -+ size_t weWant = packet->len - buffer_string_length(packet->b); -+ size_t weHave = buffer_string_length(c->mem) - c->offset - offset; - - if (weHave > weWant) weHave = weWant; - -@@ -2340,24 +2339,23 @@ static int fastcgi_get_packet(server *srv, handler_ctx *hctx, fastcgi_response_p - offset = 0; - } - -- if (packet->b->used < packet->len + 1) { -+ if (buffer_string_length(packet->b) < packet->len) { - /* we didn't get the full packet */ - - buffer_free(packet->b); - return -1; - } - -- packet->b->used -= packet->padding; -- packet->b->ptr[packet->b->used - 1] = '\0'; -+ buffer_string_set_length(packet->b, buffer_string_length(packet->b) - packet->padding); - } - - /* tag the chunks as read */ - toread = packet->len + sizeof(FCGI_Header); - for (c = hctx->rb->first; c && toread; c = c->next) { -- if (c->mem->used - c->offset - 1 <= toread) { -+ if (buffer_string_length(c->mem) - c->offset <= toread) { - /* we read this whole buffer, move it to unused */ -- toread -= c->mem->used - c->offset - 1; -- c->offset = c->mem->used - 1; /* everthing has been written */ -+ toread -= buffer_string_length(c->mem) - c->offset; -+ c->offset = buffer_string_length(c->mem); /* everthing has been written */ - } else { - c->offset += toread; - toread = 0; -@@ -2451,14 +2449,12 @@ static int fcgi_demux_response(server *srv, handler_ctx *hctx) { - char *hend = c + 4; /* header end == body start */ - size_t hlen = hend - hctx->response_header->ptr; - buffer_copy_string_len(packet.b, hend, buffer_string_length(hctx->response_header) - hlen); -- hctx->response_header->used = hlen; -- hctx->response_header->ptr[hctx->response_header->used++] = '\0'; -+ buffer_string_set_length(hctx->response_header, hlen); - } else if (NULL != (c = buffer_search_string_len(hctx->response_header, CONST_STR_LEN("\n\n")))) { - char *hend = c + 2; /* header end == body start */ - size_t hlen = hend - hctx->response_header->ptr; - buffer_copy_string_len(packet.b, hend, buffer_string_length(hctx->response_header) - hlen); -- hctx->response_header->used = hlen; -- hctx->response_header->ptr[hctx->response_header->used++] = '\0'; -+ buffer_string_set_length(hctx->response_header, hlen); - } else { - /* no luck, no header found */ - break; -@@ -2525,7 +2521,7 @@ static int fcgi_demux_response(server *srv, handler_ctx *hctx) { - http_chunk_append_buffer(srv, con, packet.b); - joblist_append(srv, con); - } -- } else if (hctx->send_content_body && packet.b->used > 1) { -+ } else if (hctx->send_content_body && !buffer_string_is_empty(packet.b)) { - if (con->request.http_version == HTTP_VERSION_1_1 && - !(con->parsed_response & HTTP_CONTENT_LENGTH)) { - /* enable chunked-transfer-encoding */ -@@ -2721,7 +2717,7 @@ static handler_t fcgi_write_request(server *srv, handler_ctx *hctx) { - log_error_write(srv, __FILE__, __LINE__, "s", "fatal error: host = NULL"); - return HANDLER_ERROR; - } -- if ((!host->port && !host->unixsocket->used)) { -+ if ((!host->port && buffer_string_is_empty(host->unixsocket))) { - log_error_write(srv, __FILE__, __LINE__, "s", "fatal error: neither host->port nor host->unixsocket is set"); - return HANDLER_ERROR; - } -@@ -2794,7 +2790,7 @@ static handler_t fcgi_write_request(server *srv, handler_ctx *hctx) { - if (proc->load < hctx->proc->load) hctx->proc = proc; - } - -- ret = host->unixsocket->used ? AF_UNIX : AF_INET; -+ ret = buffer_string_is_empty(host->unixsocket) ? AF_INET : AF_UNIX; - - if (-1 == (hctx->fd = socket(ret, SOCK_STREAM, 0))) { - if (errno == EMFILE || -@@ -3335,7 +3331,7 @@ static handler_t fcgi_check_extension(server *srv, connection *con, void *p_d, i - - if (buffer_string_is_empty(fn)) return HANDLER_GO_ON; - -- s_len = fn->used - 1; -+ s_len = buffer_string_length(fn); - - fcgi_patch_connection(srv, con, p); - -@@ -3352,9 +3348,9 @@ static handler_t fcgi_check_extension(server *srv, connection *con, void *p_d, i - data_string *ds = (data_string *)p->conf.ext_mapping->data[k]; - size_t ct_len; /* length of the config entry */ - -- if (ds->key->used == 0) continue; -+ if (buffer_is_empty(ds->key)) continue; - -- ct_len = ds->key->used - 1; -+ ct_len = buffer_string_length(ds->key); - - if (s_len < ct_len) continue; - -@@ -3380,18 +3376,20 @@ static handler_t fcgi_check_extension(server *srv, connection *con, void *p_d, i - } - - if (extension == NULL) { -+ size_t uri_path_len = buffer_string_length(con->uri.path); -+ - /* check if extension matches */ - for (k = 0; k < p->conf.exts->used; k++) { - size_t ct_len; /* length of the config entry */ - fcgi_extension *ext = p->conf.exts->exts[k]; - -- if (ext->key->used == 0) continue; -+ if (buffer_is_empty(ext->key)) continue; - -- ct_len = ext->key->used - 1; -+ ct_len = buffer_string_length(ext->key); - - /* check _url_ in the form "/fcgi_pattern" */ - if (ext->key->ptr[0] == '/') { -- if ((ct_len <= con->uri.path->used -1) && -+ if ((ct_len <= uri_path_len) && - (strncmp(con->uri.path->ptr, ext->key->ptr, ct_len) == 0)) { - extension = ext; - break; -@@ -3506,17 +3504,14 @@ static handler_t fcgi_check_extension(server *srv, connection *con, void *p_d, i - /* the rewrite is only done for /prefix/? matches */ - if (host->fix_root_path_name && extension->key->ptr[0] == '/' && extension->key->ptr[1] == '\0') { - buffer_copy_string(con->request.pathinfo, con->uri.path->ptr); -- con->uri.path->used = 1; -- con->uri.path->ptr[con->uri.path->used - 1] = '\0'; -+ buffer_string_set_length(con->uri.path, 0); - } else if (extension->key->ptr[0] == '/' && -- con->uri.path->used > extension->key->used && -- NULL != (pathinfo = strchr(con->uri.path->ptr + extension->key->used - 1, '/'))) { -+ buffer_string_length(con->uri.path) > buffer_string_length(extension->key) && -+ NULL != (pathinfo = strchr(con->uri.path->ptr + buffer_string_length(extension->key), '/'))) { - /* rewrite uri.path and pathinfo */ - - buffer_copy_string(con->request.pathinfo, pathinfo); -- -- con->uri.path->used -= con->request.pathinfo->used - 1; -- con->uri.path->ptr[con->uri.path->used - 1] = '\0'; -+ buffer_string_set_length(con->uri.path, buffer_string_length(con->uri.path) - buffer_string_length(con->request.pathinfo)); - } - } - } -diff --git a/src/mod_flv_streaming.c b/src/mod_flv_streaming.c -index 1c1a356..db041e2 100644 ---- a/src/mod_flv_streaming.c -+++ b/src/mod_flv_streaming.c -@@ -136,13 +136,14 @@ static int mod_flv_streaming_patch_connection(server *srv, connection *con, plug - - static int split_get_params(array *get_params, buffer *qrystr) { - size_t is_key = 1; -- size_t i; -+ size_t i, len; - char *key = NULL, *val = NULL; - - key = qrystr->ptr; - - /* we need the \0 */ -- for (i = 0; i < qrystr->used; i++) { -+ len = buffer_string_length(qrystr); -+ for (i = 0; i <= len; i++) { - switch(qrystr->ptr[i]) { - case '=': - if (is_key) { -@@ -195,14 +196,14 @@ URIHANDLER_FUNC(mod_flv_streaming_path_handler) { - - mod_flv_streaming_patch_connection(srv, con, p); - -- s_len = con->physical.path->used - 1; -+ s_len = buffer_string_length(con->physical.path); - - for (k = 0; k < p->conf.extensions->used; k++) { - data_string *ds = (data_string *)p->conf.extensions->data[k]; -- int ct_len = ds->value->used - 1; -+ int ct_len = buffer_string_length(ds->value); - - if (ct_len > s_len) continue; -- if (ds->value->used == 0) continue; -+ if (buffer_is_empty(ds->value)) continue; - - if (0 == strncmp(con->physical.path->ptr + s_len - ct_len, ds->value->ptr, ct_len)) { - data_string *get_param; -@@ -221,7 +222,7 @@ URIHANDLER_FUNC(mod_flv_streaming_path_handler) { - } - - /* too short */ -- if (get_param->value->used < 2) return HANDLER_GO_ON; -+ if (buffer_string_is_empty(get_param->value)) return HANDLER_GO_ON; - - /* check if it is a number */ - start = strtol(get_param->value->ptr, &err, 10); -diff --git a/src/mod_indexfile.c b/src/mod_indexfile.c -index fe750c1..13d18e2 100644 ---- a/src/mod_indexfile.c -+++ b/src/mod_indexfile.c -@@ -141,8 +141,8 @@ URIHANDLER_FUNC(mod_indexfile_subrequest) { - - if (con->mode != DIRECT) return HANDLER_GO_ON; - -- if (con->uri.path->used == 0) return HANDLER_GO_ON; -- if (con->uri.path->ptr[con->uri.path->used - 2] != '/') return HANDLER_GO_ON; -+ if (buffer_is_empty(con->uri.path)) return HANDLER_GO_ON; -+ if (con->uri.path->ptr[buffer_string_length(con->uri.path) - 1] != '/') return HANDLER_GO_ON; - - mod_indexfile_patch_connection(srv, con, p); - -diff --git a/src/mod_magnet.c b/src/mod_magnet.c -index 80cb799..8f89d4e 100644 ---- a/src/mod_magnet.c -+++ b/src/mod_magnet.c -@@ -189,17 +189,12 @@ static int magnet_array_next(lua_State *L) { - - if (pos >= a->used) return 0; - if (NULL != (du = a->data[pos])) { -- if (du->key->used) { -- lua_pushlstring(L, du->key->ptr, du->key->used - 1); -- } -- else { -- lua_pushlstring(L, "", 0); -- } -+ lua_pushlstring(L, CONST_BUF_LEN(du->key)); - switch (du->type) { - case TYPE_STRING: - ds = (data_string *)du; -- if (ds->value && ds->value->used) { -- lua_pushlstring(L, ds->value->ptr, ds->value->used - 1); -+ if (!buffer_is_empty(ds->value)) { -+ lua_pushlstring(L, CONST_BUF_LEN(ds->value)); - } else { - lua_pushnil(L); - } -@@ -252,8 +247,9 @@ static int magnet_stat(lua_State *L) { - const char *s = luaL_checkstring(L, 1); - server *srv; - connection *con; -- buffer sb; -+ buffer *sb; - stat_cache_entry *sce = NULL; -+ handler_t res; - - lua_pushstring(L, "lighty.srv"); - lua_gettable(L, LUA_REGISTRYINDEX); -@@ -265,12 +261,12 @@ static int magnet_stat(lua_State *L) { - con = lua_touserdata(L, -1); - lua_pop(L, 1); - -- sb.ptr = (char *)s; -- sb.used = sb.size = strlen(s) + 1; -- -- if (HANDLER_GO_ON != stat_cache_get_entry(srv, con, &sb, &sce)) { -- lua_pushnil(L); -+ sb = buffer_init_string(s); -+ res = stat_cache_get_entry(srv, con, sb, &sce); -+ buffer_free(sb); - -+ if (HANDLER_GO_ON != res) { -+ lua_pushnil(L); - return 1; - } - -@@ -324,7 +320,7 @@ static int magnet_stat(lua_State *L) { - buffer *b = buffer_init(); - etag_mutate(b, sce->etag); - -- lua_pushlstring(L, b->ptr, b->used - 1); -+ lua_pushlstring(L, CONST_BUF_LEN(b)); - buffer_free(b); - } else { - lua_pushnil(L); -@@ -332,7 +328,7 @@ static int magnet_stat(lua_State *L) { - lua_setfield(L, -2, "etag"); - - if (!buffer_string_is_empty(sce->content_type)) { -- lua_pushlstring(L, sce->content_type->ptr, sce->content_type->used - 1); -+ lua_pushlstring(L, CONST_BUF_LEN(sce->content_type)); - } else { - lua_pushnil(L); - } -@@ -369,8 +365,8 @@ static int magnet_reqhdr_get(lua_State *L) { - lua_pop(L, 1); - - if (NULL != (ds = (data_string *)array_get_element(con->request.headers, key))) { -- if (ds->value->used) { -- lua_pushlstring(L, ds->value->ptr, ds->value->used - 1); -+ if (!buffer_is_empty(ds->value)) { -+ lua_pushlstring(L, CONST_BUF_LEN(ds->value)); - } else { - lua_pushnil(L); - } -@@ -555,8 +551,8 @@ static int magnet_env_get(lua_State *L) { - - dest = magnet_env_get_buffer(srv, con, key); - -- if (dest && dest->used) { -- lua_pushlstring(L, dest->ptr, dest->used - 1); -+ if (!buffer_is_empty(dest)) { -+ lua_pushlstring(L, CONST_BUF_LEN(dest)); - } else { - lua_pushnil(L); - } -@@ -617,8 +613,8 @@ static int magnet_env_next(lua_State *L) { - lua_pushstring(L, magnet_env[pos].name); - - dest = magnet_env_get_buffer_by_id(srv, con, magnet_env[pos].type); -- if (dest && dest->used) { -- lua_pushlstring(L, dest->ptr, dest->used - 1); -+ if (!buffer_is_empty(dest)) { -+ lua_pushlstring(L, CONST_BUF_LEN(dest)); - } else { - lua_pushnil(L); - } -@@ -649,7 +645,8 @@ static int magnet_cgi_get(lua_State *L) { - con = lua_touserdata(L, -1); - lua_pop(L, 1); - -- if (NULL != (ds = (data_string *)array_get_element(con->environment, key)) && ds->value->used) -+ ds = (data_string *)array_get_element(con->environment, key); -+ if (!buffer_is_empty(ds->value)) - lua_pushlstring(L, CONST_BUF_LEN(ds->value)); - else - lua_pushnil(L); -diff --git a/src/mod_mysql_vhost.c b/src/mod_mysql_vhost.c -index 7d679fb..21260d5 100644 ---- a/src/mod_mysql_vhost.c -+++ b/src/mod_mysql_vhost.c -@@ -25,10 +25,6 @@ - * for domain to directory lookups, - * i.e virtual hosts (vhosts). - * -- * Optionally sets fcgi_offset and fcgi_arg -- * in preparation for fcgi.c to handle -- * per-user fcgi chroot jails. -- * - * /ada@riksnet.se 2004-12-06 - */ - -@@ -63,8 +59,6 @@ typedef struct { - typedef struct { - buffer *server_name; - buffer *document_root; -- buffer *fcgi_arg; -- unsigned fcgi_offset; - } plugin_connection_data; - - /* init the plugin data */ -@@ -136,8 +130,6 @@ static void* mod_mysql_vhost_connection_data(server *srv, connection *con, void - - c->server_name = buffer_init(); - c->document_root = buffer_init(); -- c->fcgi_arg = buffer_init(); -- c->fcgi_offset = 0; - - return con->plugin_ctx[p->id] = c; - } -@@ -158,8 +150,6 @@ CONNECTION_FUNC(mod_mysql_vhost_handle_connection_close) { - - buffer_free(c->server_name); - buffer_free(c->document_root); -- buffer_free(c->fcgi_arg); -- c->fcgi_offset = 0; - - free(c); - -@@ -222,7 +212,7 @@ SERVER_FUNC(mod_mysql_vhost_set_defaults) { - s->mysql_pre = buffer_init(); - s->mysql_post = buffer_init(); - -- if (sel->used && (qmark = strchr(sel->ptr, '?'))) { -+ if (!buffer_string_is_empty(sel) && (qmark = strchr(sel->ptr, '?'))) { - *qmark = '\0'; - buffer_copy_string(s->mysql_pre, sel->ptr); - buffer_copy_string(s->mysql_post, qmark+1); -@@ -258,7 +248,7 @@ SERVER_FUNC(mod_mysql_vhost_set_defaults) { - mysql_options(s->mysql, MYSQL_OPT_RECONNECT, &reconnect); - #endif - --#define FOO(x) (s->x->used ? s->x->ptr : NULL) -+#define FOO(x) (buffer_string_is_empty(s->x) ? NULL : s->x->ptr) - - #if MYSQL_VERSION_ID >= 40100 - /* CLIENT_MULTI_STATEMENTS first appeared in 4.1 */ -@@ -334,37 +324,35 @@ CONNECTION_FUNC(mod_mysql_vhost_handle_docroot) { - MYSQL_RES *result = NULL; - - /* no host specified? */ -- if (!con->uri.authority->used) return HANDLER_GO_ON; -+ if (buffer_string_is_empty(con->uri.authority)) return HANDLER_GO_ON; - - mod_mysql_vhost_patch_connection(srv, con, p); - - if (!p->conf.mysql) return HANDLER_GO_ON; -- if (0 == p->conf.mysql_pre->used) return HANDLER_GO_ON; -+ if (buffer_string_is_empty(p->conf.mysql_pre)) return HANDLER_GO_ON; - - /* sets up connection data if not done yet */ - c = mod_mysql_vhost_connection_data(srv, con, p_d); - - /* check if cached this connection */ -- if (c->server_name->used && /* con->uri.authority->used && */ -- buffer_is_equal(c->server_name, con->uri.authority)) goto GO_ON; -+ if (buffer_is_equal(c->server_name, con->uri.authority)) goto GO_ON; - - /* build and run SQL query */ - buffer_copy_buffer(p->tmp_buf, p->conf.mysql_pre); -- if (p->conf.mysql_post->used) { -+ if (!buffer_is_empty(p->conf.mysql_post)) { - /* escape the uri.authority */ - unsigned long to_len; - -- /* 'to' has to be 'from_len * 2 + 1' */ -- buffer_string_prepare_append(p->tmp_buf, (con->uri.authority->used - 1) * 2 + 1); -+ buffer_string_prepare_append(p->tmp_buf, buffer_string_length(con->uri.authority) * 2); - - to_len = mysql_real_escape_string(p->conf.mysql, -- p->tmp_buf->ptr + p->tmp_buf->used - 1, -- con->uri.authority->ptr, con->uri.authority->used - 1); -- p->tmp_buf->used += to_len; -+ p->tmp_buf->ptr + buffer_string_length(p->tmp_buf), -+ CONST_BUF_LEN(con->uri.authority)); -+ buffer_commit(p->tmp_buf, to_len); - - buffer_append_string_buffer(p->tmp_buf, p->conf.mysql_post); - } -- if (mysql_real_query(p->conf.mysql, p->tmp_buf->ptr, p->tmp_buf->used - 1)) { -+ if (mysql_real_query(p->conf.mysql, CONST_BUF_LEN(p->tmp_buf))) { - log_error_write(srv, __FILE__, __LINE__, "s", mysql_error(p->conf.mysql)); - goto ERR500; - } -@@ -397,18 +385,6 @@ CONNECTION_FUNC(mod_mysql_vhost_handle_docroot) { - buffer_copy_buffer(c->server_name, con->uri.authority); - buffer_copy_buffer(c->document_root, p->tmp_buf); - -- /* fcgi_offset and fcgi_arg are optional */ -- if (cols > 1 && row[1]) { -- c->fcgi_offset = atoi(row[1]); -- -- if (cols > 2 && row[2]) { -- buffer_copy_string(c->fcgi_arg, row[2]); -- } else { -- c->fcgi_arg->used = 0; -- } -- } else { -- c->fcgi_offset = c->fcgi_arg->used = 0; -- } - mysql_free_result(result); - #if MYSQL_VERSION_ID >= 40100 - while (mysql_next_result(p->conf.mysql) == 0); -@@ -420,10 +396,9 @@ GO_ON: - buffer_copy_buffer(con->physical.doc_root, c->document_root); - - #ifdef DEBUG -- log_error_write(srv, __FILE__, __LINE__, "sbbdb", -+ log_error_write(srv, __FILE__, __LINE__, "sbb", - result ? "NOT CACHED" : "cached", -- con->server_name, con->physical.doc_root, -- c->fcgi_offset, c->fcgi_arg); -+ con->server_name, con->physical.doc_root); - #endif - return HANDLER_GO_ON; - -diff --git a/src/mod_proxy.c b/src/mod_proxy.c -index fc2ca1a..dfdc636 100644 ---- a/src/mod_proxy.c -+++ b/src/mod_proxy.c -@@ -472,7 +472,7 @@ static int proxy_create_env(server *srv, handler_ctx *hctx) { - - ds = (data_string *)con->request.headers->data[i]; - -- if (ds->value->used && ds->key->used) { -+ if (!buffer_is_empty(ds->value) && !buffer_is_empty(ds->key)) { - if (buffer_is_equal_string(ds->key, CONST_STR_LEN("Connection"))) continue; - if (buffer_is_equal_string(ds->key, CONST_STR_LEN("Proxy-Connection"))) continue; - -@@ -485,7 +485,7 @@ static int proxy_create_env(server *srv, handler_ctx *hctx) { - - buffer_append_string_len(b, CONST_STR_LEN("\r\n")); - -- hctx->wb->bytes_in += b->used - 1; -+ hctx->wb->bytes_in += buffer_string_length(b); - chunkqueue_append_buffer(hctx->wb, b); - buffer_free(b); - -@@ -620,7 +620,7 @@ static int proxy_demux_response(server *srv, handler_ctx *hctx) { - - if (p->conf.debug) { - log_error_write(srv, __FILE__, __LINE__, "sd", -- "proxy - have to read:", b); -+ "proxy - have to read:", b); - } - - if (b > 0) { -@@ -637,8 +637,7 @@ static int proxy_demux_response(server *srv, handler_ctx *hctx) { - /* this should be catched by the b > 0 above */ - force_assert(r); - -- hctx->response->used += r; -- hctx->response->ptr[hctx->response->used - 1] = '\0'; -+ buffer_commit(hctx->response, r); - - #if 0 - log_error_write(srv, __FILE__, __LINE__, "sdsbs", -@@ -656,7 +655,7 @@ static int proxy_demux_response(server *srv, handler_ctx *hctx) { - /* search for the \r\n\r\n in the string */ - if (NULL != (c = buffer_search_string_len(hctx->response, CONST_STR_LEN("\r\n\r\n")))) { - size_t hlen = c - hctx->response->ptr + 4; -- size_t blen = hctx->response->used - hlen - 1; -+ size_t blen = buffer_string_length(hctx->response) - hlen; - /* found */ - - buffer_append_string_len(hctx->response_header, hctx->response->ptr, hlen); -@@ -674,13 +673,13 @@ static int proxy_demux_response(server *srv, handler_ctx *hctx) { - - con->file_started = 1; - if (blen > 0) http_chunk_append_mem(srv, con, c + 4, blen); -- hctx->response->used = 0; -+ buffer_reset(hctx->response); - joblist_append(srv, con); - } - } else { - http_chunk_append_buffer(srv, con, hctx->response); - joblist_append(srv, con); -- hctx->response->used = 0; -+ buffer_reset(hctx->response); - } - - } else { -@@ -703,8 +702,7 @@ static handler_t proxy_write_request(server *srv, handler_ctx *hctx) { - - int ret; - -- if (!host || -- (!host->host->used || !host->port)) return -1; -+ if (!host || buffer_string_is_empty(host->host) || !host->port) return -1; - - switch(hctx->state) { - case PROXY_STATE_CONNECT: -@@ -721,17 +719,17 @@ static handler_t proxy_write_request(server *srv, handler_ctx *hctx) { - case PROXY_STATE_INIT: - #if defined(HAVE_IPV6) && defined(HAVE_INET_PTON) - if (strstr(host->host->ptr,":")) { -- if (-1 == (hctx->fd = socket(AF_INET6, SOCK_STREAM, 0))) { -- log_error_write(srv, __FILE__, __LINE__, "ss", "socket failed: ", strerror(errno)); -- return HANDLER_ERROR; -- } -+ if (-1 == (hctx->fd = socket(AF_INET6, SOCK_STREAM, 0))) { -+ log_error_write(srv, __FILE__, __LINE__, "ss", "socket failed: ", strerror(errno)); -+ return HANDLER_ERROR; -+ } - } else - #endif - { -- if (-1 == (hctx->fd = socket(AF_INET, SOCK_STREAM, 0))) { -- log_error_write(srv, __FILE__, __LINE__, "ss", "socket failed: ", strerror(errno)); -- return HANDLER_ERROR; -- } -+ if (-1 == (hctx->fd = socket(AF_INET, SOCK_STREAM, 0))) { -+ log_error_write(srv, __FILE__, __LINE__, "ss", "socket failed: ", strerror(errno)); -+ return HANDLER_ERROR; -+ } - } - hctx->fde_ndx = -1; - -@@ -1078,13 +1076,8 @@ static handler_t mod_proxy_check_extension(server *srv, connection *con, void *p - mod_proxy_patch_connection(srv, con, p); - - fn = con->uri.path; -- -- if (fn->used == 0) { -- return HANDLER_ERROR; -- } -- -- s_len = fn->used - 1; -- -+ if (buffer_string_is_empty(fn)) return HANDLER_ERROR; -+ s_len = buffer_string_length(fn); - - path_info_offset = 0; - -@@ -1099,9 +1092,9 @@ static handler_t mod_proxy_check_extension(server *srv, connection *con, void *p - - ext = (data_array *)p->conf.extensions->data[k]; - -- if (ext->key->used == 0) continue; -+ if (buffer_is_empty(ext->key)) continue; - -- ct_len = ext->key->used - 1; -+ ct_len = buffer_string_length(ext->key); - - if (s_len < ct_len) continue; - -diff --git a/src/mod_redirect.c b/src/mod_redirect.c -index 93cecb7..615c7db 100644 ---- a/src/mod_redirect.c -+++ b/src/mod_redirect.c -@@ -198,9 +198,9 @@ static handler_t mod_redirect_uri_handler(server *srv, connection *con, void *p_ - match = kv->key; - extra = kv->key_extra; - pattern = kv->value->ptr; -- pattern_len = kv->value->used - 1; -+ pattern_len = buffer_string_length(kv->value); - -- if ((n = pcre_exec(match, extra, p->match_buf->ptr, p->match_buf->used - 1, 0, 0, ovec, 3 * N)) < 0) { -+ if ((n = pcre_exec(match, extra, CONST_BUF_LEN(p->match_buf), 0, 0, ovec, 3 * N)) < 0) { - if (n != PCRE_ERROR_NOMATCH) { - log_error_write(srv, __FILE__, __LINE__, "sd", - "execution error while matching: ", n); -diff --git a/src/mod_rewrite.c b/src/mod_rewrite.c -index 48c0987..5191a64 100644 ---- a/src/mod_rewrite.c -+++ b/src/mod_rewrite.c -@@ -372,9 +372,9 @@ static int process_rewrite_rules(server *srv, connection *con, plugin_data *p, r - - match = rule->key; - pattern = rule->value->ptr; -- pattern_len = rule->value->used - 1; -+ pattern_len = buffer_string_length(rule->value); - -- if ((n = pcre_exec(match, NULL, p->match_buf->ptr, p->match_buf->used - 1, 0, 0, ovec, 3 * N)) < 0) { -+ if ((n = pcre_exec(match, NULL, CONST_BUF_LEN(p->match_buf), 0, 0, ovec, 3 * N)) < 0) { - if (n != PCRE_ERROR_NOMATCH) { - log_error_write(srv, __FILE__, __LINE__, "sd", - "execution error while matching: ", n); -diff --git a/src/mod_rrdtool.c b/src/mod_rrdtool.c -index 5eb0d9d..0532e4d 100644 ---- a/src/mod_rrdtool.c -+++ b/src/mod_rrdtool.c -@@ -264,7 +264,7 @@ static int mod_rrdtool_create_rrd(server *srv, plugin_data *p, plugin_config *s) - "RRA:MIN:0.5:24:775 " - "RRA:MIN:0.5:288:797\n")); - -- if (-1 == (safe_write(p->write_fd, p->cmd->ptr, p->cmd->used - 1))) { -+ if (-1 == (safe_write(p->write_fd, CONST_BUF_LEN(p->cmd)))) { - log_error_write(srv, __FILE__, __LINE__, "ss", - "rrdtool-write: failed", strerror(errno)); - -@@ -279,8 +279,7 @@ static int mod_rrdtool_create_rrd(server *srv, plugin_data *p, plugin_config *s) - return HANDLER_ERROR; - } - -- p->resp->used = r; -- p->resp->ptr[p->resp->used++] = '\0'; -+ buffer_commit(p->resp, r); - - if (p->resp->ptr[0] != 'O' || - p->resp->ptr[1] != 'K') { -@@ -426,7 +425,7 @@ TRIGGER_FUNC(mod_rrd_trigger) { - buffer_append_int(p->cmd, s->requests); - buffer_append_string_len(p->cmd, CONST_STR_LEN("\n")); - -- if (-1 == (r = safe_write(p->write_fd, p->cmd->ptr, p->cmd->used - 1))) { -+ if (-1 == (r = safe_write(p->write_fd, CONST_BUF_LEN(p->cmd)))) { - p->rrdtool_running = 0; - - log_error_write(srv, __FILE__, __LINE__, "ss", -@@ -435,7 +434,7 @@ TRIGGER_FUNC(mod_rrd_trigger) { - return HANDLER_ERROR; - } - -- buffer_string_prepare_copy(p->resp, 4096); -+ buffer_string_prepare_copy(p->resp, 4095); - if (-1 == (r = safe_read(p->read_fd, p->resp->ptr, p->resp->size - 1))) { - p->rrdtool_running = 0; - -@@ -445,8 +444,7 @@ TRIGGER_FUNC(mod_rrd_trigger) { - return HANDLER_ERROR; - } - -- p->resp->used = r; -- p->resp->ptr[p->resp->used++] = '\0'; -+ buffer_commit(p->resp, r); - - if (p->resp->ptr[0] != 'O' || - p->resp->ptr[1] != 'K') { -diff --git a/src/mod_scgi.c b/src/mod_scgi.c -index 9ea16a4..9e88de3 100644 ---- a/src/mod_scgi.c -+++ b/src/mod_scgi.c -@@ -664,19 +664,19 @@ static int scgi_spawn_connection(server *srv, - - #ifdef HAVE_SYS_UN_H - scgi_addr_un.sun_family = AF_UNIX; -- if (proc->socket->used > sizeof(scgi_addr_un.sun_path)) { -+ if (buffer_string_length(proc->socket) + 1 > sizeof(scgi_addr_un.sun_path)) { - log_error_write(srv, __FILE__, __LINE__, "sB", - "ERROR: Unix Domain socket filename too long:", - proc->socket); - return -1; - } -- memcpy(scgi_addr_un.sun_path, proc->socket->ptr, proc->socket->used); -+ memcpy(scgi_addr_un.sun_path, proc->socket->ptr, buffer_string_length(proc->socket) + 1); - - #ifdef SUN_LEN - servlen = SUN_LEN(&scgi_addr_un); - #else - /* stevens says: */ -- servlen = proc->socket->used + sizeof(scgi_addr_un.sun_family); -+ servlen = buffer_string_length(proc->socket) + 1 + sizeof(scgi_addr_un.sun_family); - #endif - socket_type = AF_UNIX; - scgi_addr = (struct sockaddr *) &scgi_addr_un; -@@ -1072,7 +1072,7 @@ SETDEFAULTS_FUNC(mod_scgi_set_defaults) { - /* unix domain socket */ - struct sockaddr_un un; - -- if (df->unixsocket->used > sizeof(un.sun_path) - 2) { -+ if (buffer_string_length(df->unixsocket) + 1 > sizeof(un.sun_path) - 2) { - log_error_write(srv, __FILE__, __LINE__, "s", - "path of the unixdomain socket is too large"); - goto error; -@@ -1338,19 +1338,19 @@ static int scgi_establish_connection(server *srv, handler_ctx *hctx) { - #ifdef HAVE_SYS_UN_H - /* use the unix domain socket */ - scgi_addr_un.sun_family = AF_UNIX; -- if (proc->socket->used > sizeof(scgi_addr_un.sun_path)) { -+ if (buffer_string_length(proc->socket) + 1 > sizeof(scgi_addr_un.sun_path)) { - log_error_write(srv, __FILE__, __LINE__, "sB", - "ERROR: Unix Domain socket filename too long:", - proc->socket); - return -1; - } -- memcpy(scgi_addr_un.sun_path, proc->socket->ptr, proc->socket->used); -+ memcpy(scgi_addr_un.sun_path, proc->socket->ptr, buffer_string_length(proc->socket) + 1); - - #ifdef SUN_LEN - servlen = SUN_LEN(&scgi_addr_un); - #else - /* stevens says: */ -- servlen = proc->socket->used + sizeof(scgi_addr_un.sun_family); -+ servlen = buffer_string_length(proc->socket) + 1 + sizeof(scgi_addr_un.sun_family); - #endif - scgi_addr = (struct sockaddr *) &scgi_addr_un; - #else -@@ -1416,7 +1416,7 @@ static int scgi_env_add_request_headers(server *srv, connection *con, plugin_dat - - ds = (data_string *)con->request.headers->data[i]; - -- if (ds->value->used && ds->key->used) { -+ if (!buffer_is_empty(ds->value) && !buffer_is_empty(ds->key)) { - buffer_copy_string_encoded_cgi_varnames(srv->tmp_buf, CONST_BUF_LEN(ds->key), 1); - - scgi_env_add(p->scgi_env, CONST_BUF_LEN(srv->tmp_buf), CONST_BUF_LEN(ds->value)); -@@ -1428,7 +1428,7 @@ static int scgi_env_add_request_headers(server *srv, connection *con, plugin_dat - - ds = (data_string *)con->environment->data[i]; - -- if (ds->value->used && ds->key->used) { -+ if (!buffer_is_empty(ds->value) && !buffer_is_empty(ds->key)) { - buffer_copy_string_encoded_cgi_varnames(srv->tmp_buf, CONST_BUF_LEN(ds->key), 0); - - scgi_env_add(p->scgi_env, CONST_BUF_LEN(srv->tmp_buf), CONST_BUF_LEN(ds->value)); -@@ -1471,8 +1471,8 @@ static int scgi_create_env(server *srv, handler_ctx *hctx) { - scgi_env_add(p->scgi_env, CONST_STR_LEN("SERVER_SOFTWARE"), CONST_BUF_LEN(con->conf.server_tag)); - } - -- if (con->server_name->used) { -- size_t len = con->server_name->used - 1; -+ if (!buffer_is_empty(con->server_name)) { -+ size_t len = buffer_string_length(con->server_name); - - if (con->server_name->ptr[0] == '[') { - const char *colon = strstr(con->server_name->ptr, "]:"); -@@ -1611,7 +1611,7 @@ static int scgi_create_env(server *srv, handler_ctx *hctx) { - buffer_append_string_buffer(b, p->scgi_env); - buffer_append_string_len(b, CONST_STR_LEN(",")); - -- hctx->wb->bytes_in += b->used - 1; -+ hctx->wb->bytes_in += buffer_string_length(b); - chunkqueue_append_buffer(hctx->wb, b); - buffer_free(b); - -@@ -1757,8 +1757,7 @@ static int scgi_demux_response(server *srv, handler_ctx *hctx) { - return 1; - } - -- hctx->response->ptr[n] = '\0'; -- hctx->response->used = n+1; -+ buffer_commit(hctx->response, n); - - /* split header from body */ - -@@ -1776,7 +1775,7 @@ static int scgi_demux_response(server *srv, handler_ctx *hctx) { - if (0 == strncmp(hctx->response_header->ptr, "HTTP/1.", 7)) in_header = 1; - - /* search for the \r\n\r\n or \n\n in the string */ -- for (c = hctx->response_header->ptr, cp = 0, used = hctx->response_header->used - 1; used; c++, cp++, used--) { -+ for (c = hctx->response_header->ptr, cp = 0, used = buffer_string_length(hctx->response_header); used; c++, cp++, used--) { - if (*c == ':') in_header = 1; - else if (*c == '\n') { - if (in_header == 0) { -@@ -1832,11 +1831,10 @@ static int scgi_demux_response(server *srv, handler_ctx *hctx) { - http_chunk_append_buffer(srv, con, hctx->response_header); - joblist_append(srv, con); - } else { -- size_t blen = hctx->response_header->used - hlen - 1; -+ size_t blen = buffer_string_length(hctx->response_header) - hlen; - - /* a small hack: terminate after at the second \r */ -- hctx->response_header->used = hlen; -- hctx->response_header->ptr[hlen - 1] = '\0'; -+ buffer_string_set_length(hctx->response_header, hlen - 1); - - /* parse the response header */ - scgi_response_parse(srv, con, p, hctx->response_header, eol); -@@ -1847,7 +1845,7 @@ static int scgi_demux_response(server *srv, handler_ctx *hctx) { - con->response.transfer_encoding = HTTP_TRANSFER_ENCODING_CHUNKED; - } - -- if ((hctx->response->used != hlen) && blen > 0) { -+ if (blen > 0) { - http_chunk_append_mem(srv, con, hctx->response_header->ptr + hlen, blen); - joblist_append(srv, con); - } -@@ -2110,20 +2108,20 @@ static handler_t scgi_write_request(server *srv, handler_ctx *hctx) { - log_error_write(srv, __FILE__, __LINE__, "s", "fatal error: host = NULL"); - return HANDLER_ERROR; - } -- if (((!host->host->used || !host->port) && !host->unixsocket->used)) { -+ if (((buffer_string_is_empty(host->host) || !host->port) && buffer_string_is_empty(host->unixsocket))) { - log_error_write(srv, __FILE__, __LINE__, "sxddd", - "write-req: error", - host, -- host->host->used, -+ buffer_string_length(host->host), - host->port, -- host->unixsocket->used); -+ buffer_string_length(host->unixsocket)); - return HANDLER_ERROR; - } - - - switch(hctx->state) { - case FCGI_STATE_INIT: -- ret = host->unixsocket->used ? AF_UNIX : AF_INET; -+ ret = buffer_string_is_empty(host->unixsocket) ? AF_INET : AF_UNIX; - - if (-1 == (hctx->fd = socket(ret, SOCK_STREAM, 0))) { - if (errno == EMFILE || -@@ -2653,7 +2651,7 @@ static handler_t scgi_check_extension(server *srv, connection *con, void *p_d, i - - if (buffer_string_is_empty(fn)) return HANDLER_GO_ON; - -- s_len = fn->used - 1; -+ s_len = buffer_string_length(fn); - - scgi_patch_connection(srv, con, p); - -@@ -2662,9 +2660,9 @@ static handler_t scgi_check_extension(server *srv, connection *con, void *p_d, i - size_t ct_len; - scgi_extension *ext = p->conf.exts->exts[k]; - -- if (ext->key->used == 0) continue; -+ if (buffer_is_empty(ext->key)) continue; - -- ct_len = ext->key->used - 1; -+ ct_len = buffer_string_length(ext->key); - - if (s_len < ct_len) continue; - -@@ -2778,17 +2776,14 @@ static handler_t scgi_check_extension(server *srv, connection *con, void *p_d, i - /* the rewrite is only done for /prefix/? matches */ - if (host->fix_root_path_name && extension->key->ptr[0] == '/' && extension->key->ptr[1] == '\0') { - buffer_copy_string(con->request.pathinfo, con->uri.path->ptr); -- con->uri.path->used = 1; -- con->uri.path->ptr[con->uri.path->used - 1] = '\0'; -+ buffer_string_set_length(con->uri.path, 0); - } else if (extension->key->ptr[0] == '/' && -- con->uri.path->used > extension->key->used && -- NULL != (pathinfo = strchr(con->uri.path->ptr + extension->key->used - 1, '/'))) { -+ buffer_string_length(con->uri.path) > buffer_string_length(extension->key) && -+ NULL != (pathinfo = strchr(con->uri.path->ptr + buffer_string_length(extension->key), '/'))) { - /* rewrite uri.path and pathinfo */ - - buffer_copy_string(con->request.pathinfo, pathinfo); -- -- con->uri.path->used -= con->request.pathinfo->used - 1; -- con->uri.path->ptr[con->uri.path->used - 1] = '\0'; -+ buffer_string_set_length(con->uri.path, buffer_string_length(con->uri.path) - buffer_string_length(con->request.pathinfo)); - } - } - } else { -diff --git a/src/mod_secure_download.c b/src/mod_secure_download.c -index d94482e..da98b61 100644 ---- a/src/mod_secure_download.c -+++ b/src/mod_secure_download.c -@@ -198,7 +198,7 @@ URIHANDLER_FUNC(mod_secdownload_uri_handler) { - - if (con->mode != DIRECT) return HANDLER_GO_ON; - -- if (con->uri.path->used == 0) return HANDLER_GO_ON; -+ if (buffer_is_empty(con->uri.path)) return HANDLER_GO_ON; - - mod_secdownload_patch_connection(srv, con, p); - -@@ -220,9 +220,9 @@ URIHANDLER_FUNC(mod_secdownload_uri_handler) { - * /<uri-prefix>[a-f0-9]{32}/[a-f0-9]{8}/<rel-path> - */ - -- if (0 != strncmp(con->uri.path->ptr, p->conf.uri_prefix->ptr, p->conf.uri_prefix->used - 1)) return HANDLER_GO_ON; -+ if (0 != strncmp(con->uri.path->ptr, p->conf.uri_prefix->ptr, buffer_string_length(p->conf.uri_prefix))) return HANDLER_GO_ON; - -- md5_str = con->uri.path->ptr + p->conf.uri_prefix->used - 1; -+ md5_str = con->uri.path->ptr + buffer_string_length(p->conf.uri_prefix); - - if (!is_hex_len(md5_str, 32)) return HANDLER_GO_ON; - if (*(md5_str + 32) != '/') return HANDLER_GO_ON; -@@ -255,10 +255,9 @@ URIHANDLER_FUNC(mod_secdownload_uri_handler) { - buffer_copy_buffer(p->md5, p->conf.secret); - buffer_append_string(p->md5, rel_uri); - buffer_append_string_len(p->md5, ts_str, 8); -- force_assert(p->md5->used > 0); - - li_MD5_Init(&Md5Ctx); -- li_MD5_Update(&Md5Ctx, (unsigned char *)p->md5->ptr, p->md5->used - 1); -+ li_MD5_Update(&Md5Ctx, CONST_BUF_LEN(p->md5)); - li_MD5_Final(HA1, &Md5Ctx); - - buffer_copy_string_hex(p->md5, (char *)HA1, 16); -diff --git a/src/mod_simple_vhost.c b/src/mod_simple_vhost.c -index 6bb850f..fec8d54 100644 ---- a/src/mod_simple_vhost.c -+++ b/src/mod_simple_vhost.c -@@ -124,12 +124,12 @@ SETDEFAULTS_FUNC(mod_simple_vhost_set_defaults) { - - static int build_doc_root(server *srv, connection *con, plugin_data *p, buffer *out, buffer *host) { - stat_cache_entry *sce = NULL; -- force_assert(p->conf.server_root->used > 1); -+ force_assert(!buffer_string_is_empty(p->conf.server_root)); - - buffer_string_prepare_copy(out, 127); - buffer_copy_buffer(out, p->conf.server_root); - -- if (host->used) { -+ if (!buffer_string_is_empty(host)) { - /* a hostname has to start with a alpha-numerical character - * and must not contain a slash "/" - */ -@@ -145,8 +145,8 @@ static int build_doc_root(server *srv, connection *con, plugin_data *p, buffer * - } - buffer_append_slash(out); - -- if (p->conf.document_root->used > 2 && p->conf.document_root->ptr[0] == '/') { -- buffer_append_string_len(out, p->conf.document_root->ptr + 1, p->conf.document_root->used - 2); -+ if (buffer_string_length(p->conf.document_root) > 1 && p->conf.document_root->ptr[0] == '/') { -+ buffer_append_string_len(out, p->conf.document_root->ptr + 1, buffer_string_length(p->conf.document_root) - 1); - } else { - buffer_append_string_buffer(out, p->conf.document_root); - buffer_append_slash(out); -@@ -227,17 +227,17 @@ static handler_t mod_simple_vhost_docroot(server *srv, connection *con, void *p_ - /* build_doc_root() requires a server_root; skip module if simple-vhost.server-root is not set - * or set to an empty string (especially don't cache any results!) - */ -- if (p->conf.server_root->used < 2) return HANDLER_GO_ON; -+ if (buffer_string_is_empty(p->conf.server_root)) return HANDLER_GO_ON; - -- if (p->conf.docroot_cache_key->used && -- con->uri.authority->used && -+ if (!buffer_string_is_empty(p->conf.docroot_cache_key) && -+ !buffer_string_is_empty(con->uri.authority) && - buffer_is_equal(p->conf.docroot_cache_key, con->uri.authority)) { - /* cache hit */ - buffer_copy_buffer(con->server_name, p->conf.docroot_cache_servername); - buffer_copy_buffer(con->physical.doc_root, p->conf.docroot_cache_value); - } else { - /* build document-root */ -- if ((con->uri.authority->used == 0) || -+ if (buffer_string_is_empty(con->uri.authority) || - build_doc_root(srv, con, p, p->doc_root, con->uri.authority)) { - /* not found, fallback the default-host */ - if (0 == build_doc_root(srv, con, p, -diff --git a/src/mod_ssi.c b/src/mod_ssi.c -index 981fd76..ed3b75c 100644 ---- a/src/mod_ssi.c -+++ b/src/mod_ssi.c -@@ -172,7 +172,7 @@ static int ssi_env_add_request_headers(server *srv, connection *con, plugin_data - - ds = (data_string *)con->request.headers->data[i]; - -- if (ds->value->used && ds->key->used) { -+ if (!buffer_is_empty(ds->value) && !buffer_is_empty(ds->key)) { - /* don't forward the Authorization: Header */ - if (0 == strcasecmp(ds->key->ptr, "AUTHORIZATION")) { - continue; -@@ -189,7 +189,7 @@ static int ssi_env_add_request_headers(server *srv, connection *con, plugin_data - - ds = (data_string *)con->environment->data[i]; - -- if (ds->value->used && ds->key->used) { -+ if (!buffer_is_empty(ds->value) && !buffer_is_empty(ds->key)) { - buffer_copy_string_encoded_cgi_varnames(srv->tmp_buf, CONST_BUF_LEN(ds->key), 0); - - ssi_env_add(p->ssi_cgi_env, srv->tmp_buf->ptr, ds->value->ptr); -@@ -264,7 +264,7 @@ static int build_ssi_cgi_vars(server *srv, connection *con, plugin_data *p) { - * parameter. - */ - -- if (con->request.pathinfo->used) { -+ if (!buffer_string_is_empty(con->request.pathinfo)) { - ssi_env_add(p->ssi_cgi_env, CONST_STRING("PATH_INFO"), con->request.pathinfo->ptr); - } - -@@ -272,7 +272,7 @@ static int build_ssi_cgi_vars(server *srv, connection *con, plugin_data *p) { - ssi_env_add(p->ssi_cgi_env, CONST_STRING("DOCUMENT_ROOT"), con->physical.doc_root->ptr); - - ssi_env_add(p->ssi_cgi_env, CONST_STRING("REQUEST_URI"), con->request.uri->ptr); -- ssi_env_add(p->ssi_cgi_env, CONST_STRING("QUERY_STRING"), con->uri.query->used ? con->uri.query->ptr : ""); -+ ssi_env_add(p->ssi_cgi_env, CONST_STRING("QUERY_STRING"), buffer_is_empty(con->uri.query) ? "" : con->uri.query->ptr); - ssi_env_add(p->ssi_cgi_env, CONST_STRING("REQUEST_METHOD"), get_http_method_name(con->request.http_method)); - ssi_env_add(p->ssi_cgi_env, CONST_STRING("REDIRECT_STATUS"), "200"); - ssi_env_add(p->ssi_cgi_env, CONST_STRING("SERVER_PROTOCOL"), get_http_version_name(con->request.http_version)); -@@ -1029,7 +1029,7 @@ static int mod_ssi_handle_request(server *srv, connection *con, plugin_data *p) - con->file_finished = 1; - con->mode = p->id; - -- if (p->conf.content_type->used <= 1) { -+ if (buffer_string_is_empty(p->conf.content_type)) { - response_header_overwrite(srv, con, CONST_STR_LEN("Content-Type"), CONST_STR_LEN("text/html")); - } else { - response_header_overwrite(srv, con, CONST_STR_LEN("Content-Type"), CONST_BUF_LEN(p->conf.content_type)); -@@ -1100,16 +1100,16 @@ URIHANDLER_FUNC(mod_ssi_physical_path) { - - if (con->mode != DIRECT) return HANDLER_GO_ON; - -- if (con->physical.path->used == 0) return HANDLER_GO_ON; -+ if (buffer_is_empty(con->physical.path)) return HANDLER_GO_ON; - - mod_ssi_patch_connection(srv, con, p); - - for (k = 0; k < p->conf.ssi_extension->used; k++) { - data_string *ds = (data_string *)p->conf.ssi_extension->data[k]; - -- if (ds->value->used == 0) continue; -+ if (buffer_is_empty(ds->value)) continue; - -- if (buffer_is_equal_right_len(con->physical.path, ds->value, ds->value->used - 1)) { -+ if (buffer_is_equal_right_len(con->physical.path, ds->value, buffer_string_length(ds->value))) { - /* handle ssi-request */ - - if (mod_ssi_handle_request(srv, con, p)) { -diff --git a/src/mod_ssi_expr.c b/src/mod_ssi_expr.c -index 140d086..489fde4 100644 ---- a/src/mod_ssi_expr.c -+++ b/src/mod_ssi_expr.c -@@ -35,7 +35,7 @@ void ssi_val_free(ssi_val_t *s) { - - int ssi_val_tobool(ssi_val_t *B) { - if (B->type == SSI_TYPE_STRING) { -- return B->str->used > 1 ? 1 : 0; -+ return !buffer_string_is_empty(B->str); - } else { - return B->bo; - } -diff --git a/src/mod_staticfile.c b/src/mod_staticfile.c -index e36c697..d40aa31 100644 ---- a/src/mod_staticfile.c -+++ b/src/mod_staticfile.c -@@ -304,7 +304,7 @@ static int http_response_parse_range(server *srv, connection *con, plugin_data * - /* write END-OF-HEADER */ - buffer_append_string_len(b, CONST_STR_LEN("\r\n\r\n")); - -- con->response.content_length += b->used - 1; -+ con->response.content_length += buffer_string_length(b); - chunkqueue_append_buffer(con->write_queue, b); - buffer_free(b); - } -@@ -325,7 +325,7 @@ static int http_response_parse_range(server *srv, connection *con, plugin_data * - buffer_append_string(b, boundary); - buffer_append_string_len(b, "--\r\n", 4); - -- con->response.content_length += b->used - 1; -+ con->response.content_length += buffer_string_length(b); - chunkqueue_append_buffer(con->write_queue, b); - buffer_free(b); - -@@ -363,8 +363,8 @@ URIHANDLER_FUNC(mod_staticfile_subrequest) { - - /* someone else has done a decision for us */ - if (con->http_status != 0) return HANDLER_GO_ON; -- if (con->uri.path->used == 0) return HANDLER_GO_ON; -- if (con->physical.path->used == 0) return HANDLER_GO_ON; -+ if (buffer_is_empty(con->uri.path)) return HANDLER_GO_ON; -+ if (buffer_is_empty(con->physical.path)) return HANDLER_GO_ON; - - /* someone else has handled this request */ - if (con->mode != DIRECT) return HANDLER_GO_ON; -@@ -381,7 +381,7 @@ URIHANDLER_FUNC(mod_staticfile_subrequest) { - - mod_staticfile_patch_connection(srv, con, p); - -- if (p->conf.disable_pathinfo && 0 != con->request.pathinfo->used) { -+ if (p->conf.disable_pathinfo && !buffer_string_is_empty(con->request.pathinfo)) { - if (con->conf.log_request_handling) { - log_error_write(srv, __FILE__, __LINE__, "s", "-- NOT handling file as static file, pathinfo forbidden"); - } -@@ -392,9 +392,9 @@ URIHANDLER_FUNC(mod_staticfile_subrequest) { - for (k = 0; k < p->conf.exclude_ext->used; k++) { - ds = (data_string *)p->conf.exclude_ext->data[k]; - -- if (ds->value->used == 0) continue; -+ if (buffer_is_empty(ds->value)) continue; - -- if (buffer_is_equal_right_len(con->physical.path, ds->value, ds->value->used - 1)) { -+ if (buffer_is_equal_right_len(con->physical.path, ds->value, buffer_string_length(ds->value))) { - if (con->conf.log_request_handling) { - log_error_write(srv, __FILE__, __LINE__, "s", "-- NOT handling file as static file, extension forbidden"); - } -diff --git a/src/mod_status.c b/src/mod_status.c -index 99b332a..daecb08 100644 ---- a/src/mod_status.c -+++ b/src/mod_status.c -@@ -449,7 +449,7 @@ static handler_t mod_status_handle_server_status_html(server *srv, connection *c - connection *c = srv->conns->ptr[j]; - const char *state; - -- if (CON_STATE_READ == c->state && c->request.orig_uri->used > 0) { -+ if (CON_STATE_READ == c->state && !buffer_string_is_empty(c->request.orig_uri)) { - state = "k"; - } else { - state = connection_get_short_state(c->state); -@@ -501,7 +501,7 @@ static handler_t mod_status_handle_server_status_html(server *srv, connection *c - - buffer_append_string_len(b, CONST_STR_LEN("</td><td class=\"string\">")); - -- if (CON_STATE_READ == c->state && c->request.orig_uri->used > 0) { -+ if (CON_STATE_READ == c->state && !buffer_string_is_empty(c->request.orig_uri)) { - buffer_append_string_len(b, CONST_STR_LEN("keep-alive")); - } else { - buffer_append_string(b, connection_get_state(c->state)); -diff --git a/src/mod_trigger_b4_dl.c b/src/mod_trigger_b4_dl.c -index cff125c..e1fa993 100644 ---- a/src/mod_trigger_b4_dl.c -+++ b/src/mod_trigger_b4_dl.c -@@ -320,7 +320,7 @@ URIHANDLER_FUNC(mod_trigger_b4_dl_uri_handler) { - - if (con->mode != DIRECT) return HANDLER_GO_ON; - -- if (con->uri.path->used == 0) return HANDLER_GO_ON; -+ if (buffer_is_empty(con->uri.path)) return HANDLER_GO_ON; - - mod_trigger_b4_dl_patch_connection(srv, con, p); - -@@ -356,7 +356,7 @@ URIHANDLER_FUNC(mod_trigger_b4_dl_uri_handler) { - } - - /* check if URL is a trigger -> insert IP into DB */ -- if ((n = pcre_exec(p->conf.trigger_regex, NULL, con->uri.path->ptr, con->uri.path->used - 1, 0, 0, ovec, 3 * N)) < 0) { -+ if ((n = pcre_exec(p->conf.trigger_regex, NULL, CONST_BUF_LEN(con->uri.path), 0, 0, ovec, 3 * N)) < 0) { - if (n != PCRE_ERROR_NOMATCH) { - log_error_write(srv, __FILE__, __LINE__, "sd", - "execution error while matching:", n); -@@ -383,11 +383,12 @@ URIHANDLER_FUNC(mod_trigger_b4_dl_uri_handler) { - # endif - # if defined(HAVE_MEMCACHE_H) - if (p->conf.mc) { -- size_t i; -+ size_t i, len; - buffer_copy_buffer(p->tmp_buf, p->conf.mc_namespace); - buffer_append_string(p->tmp_buf, remote_ip); - -- for (i = 0; i < p->tmp_buf->used - 1; i++) { -+ len = buffer_string_length(p->tmp_buf); -+ for (i = 0; i < len; i++) { - if (p->tmp_buf->ptr[i] == ' ') p->tmp_buf->ptr[i] = '-'; - } - -@@ -407,7 +408,7 @@ URIHANDLER_FUNC(mod_trigger_b4_dl_uri_handler) { - } - - /* check if URL is a download -> check IP in DB, update timestamp */ -- if ((n = pcre_exec(p->conf.download_regex, NULL, con->uri.path->ptr, con->uri.path->used - 1, 0, 0, ovec, 3 * N)) < 0) { -+ if ((n = pcre_exec(p->conf.download_regex, NULL, CONST_BUF_LEN(con->uri.path), 0, 0, ovec, 3 * N)) < 0) { - if (n != PCRE_ERROR_NOMATCH) { - log_error_write(srv, __FILE__, __LINE__, "sd", - "execution error while matching: ", n); -@@ -469,12 +470,13 @@ URIHANDLER_FUNC(mod_trigger_b4_dl_uri_handler) { - # if defined(HAVE_MEMCACHE_H) - if (p->conf.mc) { - void *r; -- size_t i; -+ size_t i, len; - - buffer_copy_buffer(p->tmp_buf, p->conf.mc_namespace); - buffer_append_string(p->tmp_buf, remote_ip); - -- for (i = 0; i < p->tmp_buf->used - 1; i++) { -+ len = buffer_string_length(p->tmp_buf); -+ for (i = 0; i < len; i++) { - if (p->tmp_buf->ptr[i] == ' ') p->tmp_buf->ptr[i] = '-'; - } - -diff --git a/src/mod_userdir.c b/src/mod_userdir.c -index 392f4b2..682f950 100644 ---- a/src/mod_userdir.c -+++ b/src/mod_userdir.c -@@ -181,14 +181,14 @@ URIHANDLER_FUNC(mod_userdir_docroot_handler) { - struct passwd *pwd = NULL; - #endif - -- if (con->uri.path->used == 0) return HANDLER_GO_ON; -+ if (buffer_is_empty(con->uri.path)) return HANDLER_GO_ON; - - mod_userdir_patch_connection(srv, con, p); - - /* enforce the userdir.path to be set in the config, ugly fix for #1587; - * should be replaced with a clean .enabled option in 1.5 - */ -- if (!p->conf.active || p->conf.path->used == 0) return HANDLER_GO_ON; -+ if (!p->conf.active || buffer_is_empty(p->conf.path)) return HANDLER_GO_ON; - - /* /~user/foo.html -> /home/user/public_html/foo.html */ - -diff --git a/src/mod_usertrack.c b/src/mod_usertrack.c -index 29e9fdf..11aad95 100644 ---- a/src/mod_usertrack.c -+++ b/src/mod_usertrack.c -@@ -101,8 +101,8 @@ SETDEFAULTS_FUNC(mod_usertrack_set_defaults) { - if (buffer_string_is_empty(s->cookie_name)) { - buffer_copy_string_len(s->cookie_name, CONST_STR_LEN("TRACKID")); - } else { -- size_t j; -- for (j = 0; j < s->cookie_name->used - 1; j++) { -+ size_t j, len = buffer_string_length(s->cookie_name); -+ for (j = 0; j < len; j++) { - char c = s->cookie_name->ptr[j] | 32; - if (c < 'a' || c > 'z') { - log_error_write(srv, __FILE__, __LINE__, "sb", -@@ -115,8 +115,8 @@ SETDEFAULTS_FUNC(mod_usertrack_set_defaults) { - } - - if (!buffer_string_is_empty(s->cookie_domain)) { -- size_t j; -- for (j = 0; j < s->cookie_domain->used - 1; j++) { -+ size_t j, len = buffer_string_length(s->cookie_domain); -+ for (j = 0; j < len; j++) { - char c = s->cookie_domain->ptr[j]; - if (c <= 32 || c >= 127 || c == '"' || c == '\\') { - log_error_write(srv, __FILE__, __LINE__, "sb", -@@ -175,7 +175,7 @@ URIHANDLER_FUNC(mod_usertrack_uri_handler) { - li_MD5_CTX Md5Ctx; - char hh[LI_ITOSTRING_LENGTH]; - -- if (con->uri.path->used == 0) return HANDLER_GO_ON; -+ if (buffer_is_empty(con->uri.path)) return HANDLER_GO_ON; - - mod_usertrack_patch_connection(srv, con, p); - -@@ -193,7 +193,7 @@ URIHANDLER_FUNC(mod_usertrack_uri_handler) { - char *nc; - - /* skip WS */ -- for (nc = g + p->conf.cookie_name->used-1; *nc == ' ' || *nc == '\t'; nc++); -+ for (nc = g + buffer_string_length(p->conf.cookie_name); *nc == ' ' || *nc == '\t'; nc++); - - if (*nc == '=') { - /* ok, found the key of our own cookie */ -@@ -219,8 +219,8 @@ URIHANDLER_FUNC(mod_usertrack_uri_handler) { - - /* generate shared-secret */ - li_MD5_Init(&Md5Ctx); -- li_MD5_Update(&Md5Ctx, (unsigned char *)con->uri.path->ptr, con->uri.path->used - 1); -- li_MD5_Update(&Md5Ctx, (unsigned char *)"+", 1); -+ li_MD5_Update(&Md5Ctx, CONST_BUF_LEN(con->uri.path)); -+ li_MD5_Update(&Md5Ctx, CONST_STR_LEN("+")); - - /* we assume sizeof(time_t) == 4 here, but if not it ain't a problem at all */ - li_itostr(hh, srv->cur_ts); -diff --git a/src/mod_webdav.c b/src/mod_webdav.c -index 433b904..654108a 100644 ---- a/src/mod_webdav.c -+++ b/src/mod_webdav.c -@@ -446,7 +446,7 @@ URIHANDLER_FUNC(mod_webdav_uri_handler) { - - UNUSED(srv); - -- if (con->uri.path->used == 0) return HANDLER_GO_ON; -+ if (buffer_is_empty(con->uri.path)) return HANDLER_GO_ON; - - mod_webdav_patch_connection(srv, con, p); - -@@ -558,9 +558,8 @@ static int webdav_delete_file(server *srv, connection *con, plugin_data *p, phys - /* bind the values to the insert */ - - sqlite3_bind_text(stmt, 1, -- dst->rel_path->ptr, -- dst->rel_path->used - 1, -- SQLITE_TRANSIENT); -+ CONST_BUF_LEN(dst->rel_path), -+ SQLITE_TRANSIENT); - - if (SQLITE_DONE != sqlite3_step(stmt)) { - /* */ -@@ -590,7 +589,7 @@ static int webdav_delete_dir(server *srv, connection *con, plugin_data *p, physi - int status = 0; - - if ((de->d_name[0] == '.' && de->d_name[1] == '\0') || -- (de->d_name[0] == '.' && de->d_name[1] == '.' && de->d_name[2] == '\0')) { -+ (de->d_name[0] == '.' && de->d_name[1] == '.' && de->d_name[2] == '\0')) { - continue; - /* ignore the parent dir */ - } -@@ -636,9 +635,8 @@ static int webdav_delete_dir(server *srv, connection *con, plugin_data *p, physi - /* bind the values to the insert */ - - sqlite3_bind_text(stmt, 1, -- d.rel_path->ptr, -- d.rel_path->used - 1, -- SQLITE_TRANSIENT); -+ CONST_BUF_LEN(d.rel_path), -+ SQLITE_TRANSIENT); - - if (SQLITE_DONE != sqlite3_step(stmt)) { - /* */ -@@ -714,14 +712,12 @@ static int webdav_copy_file(server *srv, connection *con, plugin_data *p, physic - - /* bind the values to the insert */ - sqlite3_bind_text(stmt, 1, -- dst->rel_path->ptr, -- dst->rel_path->used - 1, -- SQLITE_TRANSIENT); -+ CONST_BUF_LEN(dst->rel_path), -+ SQLITE_TRANSIENT); - - sqlite3_bind_text(stmt, 2, -- src->rel_path->ptr, -- src->rel_path->used - 1, -- SQLITE_TRANSIENT); -+ CONST_BUF_LEN(src->rel_path), -+ SQLITE_TRANSIENT); - - if (SQLITE_DONE != sqlite3_step(stmt)) { - /* */ -@@ -751,8 +747,8 @@ static int webdav_copy_dir(server *srv, connection *con, plugin_data *p, physica - while (NULL != (de = readdir(srcdir))) { - struct stat st; - -- if ((de->d_name[0] == '.' && de->d_name[1] == '\0') || -- (de->d_name[0] == '.' && de->d_name[1] == '.' && de->d_name[2] == '\0')) { -+ if ((de->d_name[0] == '.' && de->d_name[1] == '\0') -+ || (de->d_name[0] == '.' && de->d_name[1] == '.' && de->d_name[2] == '\0')) { - continue; - } - -@@ -793,14 +789,12 @@ static int webdav_copy_dir(server *srv, connection *con, plugin_data *p, physica - - /* bind the values to the insert */ - sqlite3_bind_text(stmt, 1, -- dst->rel_path->ptr, -- dst->rel_path->used - 1, -- SQLITE_TRANSIENT); -+ CONST_BUF_LEN(dst->rel_path), -+ SQLITE_TRANSIENT); - - sqlite3_bind_text(stmt, 2, -- src->rel_path->ptr, -- src->rel_path->used - 1, -- SQLITE_TRANSIENT); -+ CONST_BUF_LEN(src->rel_path), -+ SQLITE_TRANSIENT); - - if (SQLITE_DONE != sqlite3_step(stmt)) { - /* */ -@@ -851,9 +845,9 @@ static int webdav_get_live_property(server *srv, connection *con, plugin_data *p - for (k = 0; k < con->conf.mimetypes->used; k++) { - data_string *ds = (data_string *)con->conf.mimetypes->data[k]; - -- if (ds->key->used == 0) continue; -+ if (buffer_is_empty(ds->key)) continue; - -- if (buffer_is_equal_right_len(dst->path, ds->key, ds->key->used - 1)) { -+ if (buffer_is_equal_right_len(dst->path, ds->key, buffer_string_length(ds->key))) { - buffer_append_string_len(b,CONST_STR_LEN("<D:getcontenttype>")); - buffer_append_string_buffer(b, ds->value); - buffer_append_string_len(b, CONST_STR_LEN("</D:getcontenttype>")); -@@ -907,17 +901,16 @@ static int webdav_get_property(server *srv, connection *con, plugin_data *p, phy - /* bind the values to the insert */ - - sqlite3_bind_text(stmt, 1, -- dst->rel_path->ptr, -- dst->rel_path->used - 1, -- SQLITE_TRANSIENT); -+ CONST_BUF_LEN(dst->rel_path), -+ SQLITE_TRANSIENT); - sqlite3_bind_text(stmt, 2, -- prop_name, -- strlen(prop_name), -- SQLITE_TRANSIENT); -+ prop_name, -+ strlen(prop_name), -+ SQLITE_TRANSIENT); - sqlite3_bind_text(stmt, 3, -- prop_ns, -- strlen(prop_ns), -- SQLITE_TRANSIENT); -+ prop_ns, -+ strlen(prop_ns), -+ SQLITE_TRANSIENT); - - /* it is the PK */ - while (SQLITE_ROW == sqlite3_step(stmt)) { -@@ -1046,7 +1039,7 @@ static int webdav_parse_chunkqueue(server *srv, connection *con, plugin_data *p, - break; - case MEM_CHUNK: - /* append to the buffer */ -- weHave = c->mem->used - 1 - c->offset; -+ weHave = buffer_string_length(c->mem) - c->offset; - - if (weHave > weWant) weHave = weWant; - -@@ -1190,8 +1183,8 @@ static int webdav_has_lock(server *srv, connection *con, plugin_data *p, buffer - sqlite3_reset(stmt); - - sqlite3_bind_text(stmt, 1, -- CONST_BUF_LEN(uri), -- SQLITE_TRANSIENT); -+ CONST_BUF_LEN(uri), -+ SQLITE_TRANSIENT); - - while (SQLITE_ROW == sqlite3_step(stmt)) { - has_lock = 0; -@@ -1223,7 +1216,7 @@ URIHANDLER_FUNC(mod_webdav_subrequest_handler) { - - if (!p->conf.enabled) return HANDLER_GO_ON; - /* physical path is setup */ -- if (con->physical.path->used == 0) return HANDLER_GO_ON; -+ if (buffer_is_empty(con->physical.path)) return HANDLER_GO_ON; - - /* PROPFIND need them */ - if (NULL != (ds = (data_string *)array_get_element(con->request.headers, "Depth"))) { -@@ -1274,7 +1267,7 @@ URIHANDLER_FUNC(mod_webdav_subrequest_handler) { - if (prop->type == XML_TEXT_NODE) continue; /* ignore WS */ - - if (prop->ns && -- (0 == xmlStrcmp(prop->ns->href, BAD_CAST "")) && -+ (0 == xmlStrcmp(prop->ns->href, BAD_CAST "")) && - (0 != xmlStrcmp(prop->ns->prefix, BAD_CAST ""))) { - size_t i; - log_error_write(srv, __FILE__, __LINE__, "ss", -@@ -1318,9 +1311,8 @@ URIHANDLER_FUNC(mod_webdav_subrequest_handler) { - /* bind the values to the insert */ - - sqlite3_bind_text(stmt, 1, -- con->uri.path->ptr, -- con->uri.path->used - 1, -- SQLITE_TRANSIENT); -+ CONST_BUF_LEN(con->uri.path), -+ SQLITE_TRANSIENT); - - if (SQLITE_DONE != sqlite3_step(stmt)) { - } -@@ -1757,7 +1749,7 @@ URIHANDLER_FUNC(mod_webdav_subrequest_handler) { - } - break; - case MEM_CHUNK: -- if ((r = write(fd, c->mem->ptr + c->offset, c->mem->used - c->offset - 1)) < 0) { -+ if ((r = write(fd, c->mem->ptr + c->offset, buffer_string_length(c->mem) - c->offset)) < 0) { - switch(errno) { - case ENOSPC: - con->http_status = 507; -@@ -1810,7 +1802,7 @@ URIHANDLER_FUNC(mod_webdav_subrequest_handler) { - } - - if (NULL != (ds = (data_string *)array_get_element(con->request.headers, "Overwrite"))) { -- if (ds->value->used != 2 || -+ if (buffer_string_length(ds->value) != 1 || - (ds->value->ptr[0] != 'F' && - ds->value->ptr[0] != 'T') ) { - con->http_status = 400; -@@ -1884,7 +1876,7 @@ URIHANDLER_FUNC(mod_webdav_subrequest_handler) { - - /* don't add a second / */ - if (p->physical.rel_path->ptr[0] == '/') { -- buffer_append_string_len(p->physical.path, p->physical.rel_path->ptr + 1, p->physical.rel_path->used - 2); -+ buffer_append_string_len(p->physical.path, p->physical.rel_path->ptr + 1, buffer_string_length(p->physical.rel_path) - 1); - } else { - buffer_append_string_buffer(p->physical.path, p->physical.rel_path); - } -@@ -1993,9 +1985,8 @@ URIHANDLER_FUNC(mod_webdav_subrequest_handler) { - - /* bind the values to the insert */ - sqlite3_bind_text(stmt, 1, -- con->uri.path->ptr, -- con->uri.path->used - 1, -- SQLITE_TRANSIENT); -+ CONST_BUF_LEN(con->uri.path), -+ SQLITE_TRANSIENT); - - if (SQLITE_DONE != sqlite3_step(stmt)) { - log_error_write(srv, __FILE__, __LINE__, "ss", "sql-move(delete old) failed:", sqlite3_errmsg(p->conf.sql)); -@@ -2009,14 +2000,12 @@ URIHANDLER_FUNC(mod_webdav_subrequest_handler) { - - /* bind the values to the insert */ - sqlite3_bind_text(stmt, 1, -- p->uri.path->ptr, -- p->uri.path->used - 1, -- SQLITE_TRANSIENT); -+ CONST_BUF_LEN(p->uri.path), -+ SQLITE_TRANSIENT); - - sqlite3_bind_text(stmt, 2, -- con->uri.path->ptr, -- con->uri.path->used - 1, -- SQLITE_TRANSIENT); -+ CONST_BUF_LEN(con->uri.path), -+ SQLITE_TRANSIENT); - - if (SQLITE_DONE != sqlite3_step(stmt)) { - log_error_write(srv, __FILE__, __LINE__, "ss", "sql-move failed:", sqlite3_errmsg(p->conf.sql)); -@@ -2121,29 +2110,28 @@ URIHANDLER_FUNC(mod_webdav_subrequest_handler) { - /* bind the values to the insert */ - - sqlite3_bind_text(stmt, 1, -- con->uri.path->ptr, -- con->uri.path->used - 1, -- SQLITE_TRANSIENT); -+ CONST_BUF_LEN(con->uri.path), -+ SQLITE_TRANSIENT); - sqlite3_bind_text(stmt, 2, -- (char *)prop->name, -- strlen((char *)prop->name), -- SQLITE_TRANSIENT); -+ (char *)prop->name, -+ strlen((char *)prop->name), -+ SQLITE_TRANSIENT); - if (prop->ns) { - sqlite3_bind_text(stmt, 3, -- (char *)prop->ns->href, -- strlen((char *)prop->ns->href), -- SQLITE_TRANSIENT); -+ (char *)prop->ns->href, -+ strlen((char *)prop->ns->href), -+ SQLITE_TRANSIENT); - } else { - sqlite3_bind_text(stmt, 3, -- "", -- 0, -- SQLITE_TRANSIENT); -+ "", -+ 0, -+ SQLITE_TRANSIENT); - } - if (stmt == p->conf.stmt_update_prop) { - sqlite3_bind_text(stmt, 4, -- (char *)xmlNodeGetContent(prop), -- strlen((char *)xmlNodeGetContent(prop)), -- SQLITE_TRANSIENT); -+ (char *)xmlNodeGetContent(prop), -+ strlen((char *)xmlNodeGetContent(prop)), -+ SQLITE_TRANSIENT); - } - - if (SQLITE_DONE != (r = sqlite3_step(stmt))) { -@@ -2290,9 +2278,8 @@ propmatch_cleanup: - sqlite3_reset(stmt); - - sqlite3_bind_text(stmt, 1, -- p->uri.path->ptr, -- p->uri.path->used - 1, -- SQLITE_TRANSIENT); -+ CONST_BUF_LEN(p->uri.path), -+ SQLITE_TRANSIENT); - - /* it is the PK */ - while (SQLITE_ROW == sqlite3_step(stmt)) { -@@ -2339,32 +2326,32 @@ propmatch_cleanup: - sqlite3_reset(stmt); - - sqlite3_bind_text(stmt, 1, -- CONST_BUF_LEN(p->tmp_buf), -- SQLITE_TRANSIENT); -+ CONST_BUF_LEN(p->tmp_buf), -+ SQLITE_TRANSIENT); - - sqlite3_bind_text(stmt, 2, -- CONST_BUF_LEN(con->uri.path), -- SQLITE_TRANSIENT); -+ CONST_BUF_LEN(con->uri.path), -+ SQLITE_TRANSIENT); - - sqlite3_bind_text(stmt, 3, -- (const char *)lockscope, -- xmlStrlen(lockscope), -- SQLITE_TRANSIENT); -+ (const char *)lockscope, -+ xmlStrlen(lockscope), -+ SQLITE_TRANSIENT); - - sqlite3_bind_text(stmt, 4, -- (const char *)locktype, -- xmlStrlen(locktype), -- SQLITE_TRANSIENT); -+ (const char *)locktype, -+ xmlStrlen(locktype), -+ SQLITE_TRANSIENT); - - /* owner */ - sqlite3_bind_text(stmt, 5, -- "", -- 0, -- SQLITE_TRANSIENT); -+ "", -+ 0, -+ SQLITE_TRANSIENT); - - /* depth */ - sqlite3_bind_int(stmt, 6, -- depth); -+ depth); - - - if (SQLITE_DONE != sqlite3_step(stmt)) { -@@ -2394,19 +2381,19 @@ propmatch_cleanup: - sqlite3_stmt *stmt = p->conf.stmt_refresh_lock; - - /* remove the < > around the token */ -- if (locktoken->used < 6) { -+ if (buffer_string_length(locktoken) < 5) { - con->http_status = 400; - - return HANDLER_FINISHED; - } - -- buffer_copy_string_len(p->tmp_buf, locktoken->ptr + 2, locktoken->used - 5); -+ buffer_copy_string_len(p->tmp_buf, locktoken->ptr + 2, buffer_string_length(locktoken) - 4); - - sqlite3_reset(stmt); - - sqlite3_bind_text(stmt, 1, -- CONST_BUF_LEN(p->tmp_buf), -- SQLITE_TRANSIENT); -+ CONST_BUF_LEN(p->tmp_buf), -+ SQLITE_TRANSIENT); - - if (SQLITE_DONE != sqlite3_step(stmt)) { - log_error_write(srv, __FILE__, __LINE__, "ss", -@@ -2437,7 +2424,7 @@ propmatch_cleanup: - sqlite3_stmt *stmt = p->conf.stmt_remove_lock; - - /* remove the < > around the token */ -- if (locktoken->used < 4) { -+ if (buffer_string_length(locktoken) < 3) { - con->http_status = 400; - - return HANDLER_FINISHED; -@@ -2453,17 +2440,17 @@ propmatch_cleanup: - * - 412 - * */ - -- buffer_copy_string_len(p->tmp_buf, locktoken->ptr + 1, locktoken->used - 3); -+ buffer_copy_string_len(p->tmp_buf, locktoken->ptr + 1, buffer_string_length(locktoken) - 2); - - sqlite3_reset(stmt); - - sqlite3_bind_text(stmt, 1, -- CONST_BUF_LEN(p->tmp_buf), -- SQLITE_TRANSIENT); -+ CONST_BUF_LEN(p->tmp_buf), -+ SQLITE_TRANSIENT); - - sqlite3_bind_text(stmt, 2, -- CONST_BUF_LEN(con->uri.path), -- SQLITE_TRANSIENT); -+ CONST_BUF_LEN(con->uri.path), -+ SQLITE_TRANSIENT); - - if (SQLITE_DONE != sqlite3_step(stmt)) { - log_error_write(srv, __FILE__, __LINE__, "ss", -diff --git a/src/network_linux_sendfile.c b/src/network_linux_sendfile.c -index 8d7598a..b967f3c 100644 ---- a/src/network_linux_sendfile.c -+++ b/src/network_linux_sendfile.c -@@ -54,12 +54,12 @@ int network_write_chunkqueue_linuxsendfile(server *srv, connection *con, int fd, - tc = tc->next, num_chunks++); - - for (tc = c, i = 0; i < num_chunks; tc = tc->next, i++) { -- if (tc->mem->used == 0) { -+ if (buffer_string_is_empty(tc->mem)) { - chunks[i].iov_base = tc->mem->ptr; - chunks[i].iov_len = 0; - } else { - offset = tc->mem->ptr + tc->offset; -- toSend = tc->mem->used - 1 - tc->offset; -+ toSend = buffer_string_length(tc->mem) - tc->offset; - - chunks[i].iov_base = offset; - -diff --git a/src/network_openssl.c b/src/network_openssl.c -index 04c29c0..d9ae33c 100644 ---- a/src/network_openssl.c -+++ b/src/network_openssl.c -@@ -67,13 +67,13 @@ int network_write_chunkqueue_openssl(server *srv, connection *con, SSL *ssl, chu - off_t toSend; - ssize_t r; - -- if (c->mem->used == 0 || c->mem->used == 1) { -+ if (buffer_string_is_empty(c->mem)) { - chunk_finished = 1; - break; - } - - offset = c->mem->ptr + c->offset; -- toSend = c->mem->used - 1 - c->offset; -+ toSend = buffer_string_length(c->mem) - c->offset; - if (toSend > max_bytes) toSend = max_bytes; - - /** -@@ -149,7 +149,7 @@ int network_write_chunkqueue_openssl(server *srv, connection *con, SSL *ssl, chu - max_bytes -= r; - } - -- if (c->offset == (off_t)c->mem->used - 1) { -+ if (c->offset == (off_t)buffer_string_length(c->mem)) { - chunk_finished = 1; - } - -diff --git a/src/network_write.c b/src/network_write.c -index d46649b..6a89b50 100644 ---- a/src/network_write.c -+++ b/src/network_write.c -@@ -36,13 +36,13 @@ int network_write_chunkqueue_write(server *srv, connection *con, int fd, chunkqu - off_t toSend; - ssize_t r; - -- if (c->mem->used == 0) { -+ if (buffer_string_is_empty(c->mem)) { - chunk_finished = 1; - break; - } - - offset = c->mem->ptr + c->offset; -- toSend = c->mem->used - 1 - c->offset; -+ toSend = buffer_string_length(c->mem) - c->offset; - if (toSend > max_bytes) toSend = max_bytes; - - #ifdef __WIN32 -@@ -75,7 +75,7 @@ int network_write_chunkqueue_write(server *srv, connection *con, int fd, chunkqu - cq->bytes_out += r; - max_bytes -= r; - -- if (c->offset == (off_t)c->mem->used - 1) { -+ if (c->offset == (off_t)buffer_string_length(c->mem)) { - chunk_finished = 1; - } - -diff --git a/src/network_writev.c b/src/network_writev.c -index 1b93547..895336c 100644 ---- a/src/network_writev.c -+++ b/src/network_writev.c -@@ -69,12 +69,12 @@ int network_write_chunkqueue_writev(server *srv, connection *con, int fd, chunkq - chunks = calloc(num_chunks, sizeof(*chunks)); - - for(tc = c, i = 0; i < num_chunks; tc = tc->next, i++) { -- if (tc->mem->used == 0) { -+ if (buffer_string_is_empty(tc->mem)) { - chunks[i].iov_base = tc->mem->ptr; - chunks[i].iov_len = 0; - } else { - offset = tc->mem->ptr + tc->offset; -- toSend = tc->mem->used - 1 - tc->offset; -+ toSend = buffer_string_length(tc->mem) - tc->offset; - - chunks[i].iov_base = offset; - -diff --git a/src/proc_open.c b/src/proc_open.c -index c29b9c6..167027a 100644 ---- a/src/proc_open.c -+++ b/src/proc_open.c -@@ -284,8 +284,7 @@ static void proc_read_fd_to_buffer(int fd, buffer *b) { - if ((s = read(fd, (void *)(b->ptr + buffer_string_length(b)), buffer_string_space(b))) <= 0) { - break; - } -- b->used += s; -- b->ptr[b->used-1] = '\0'; -+ buffer_commit(b, s); - } - } - /* }}} */ -@@ -298,7 +297,7 @@ int proc_open_buffer(const char *command, buffer *in, buffer *out, buffer *err) - } - - if (in) { -- if (write(proc.in.fd, (void *)in->ptr, in->used) < 0) { -+ if (write(proc.in.fd, CONST_BUF_LEN(in)) < 0) { - perror("error writing pipe"); - return -1; - } -@@ -315,7 +314,7 @@ int proc_open_buffer(const char *command, buffer *in, buffer *out, buffer *err) - } else { - buffer *tmp = buffer_init(); - proc_read_fd_to_buffer(proc.err.fd, tmp); -- if (tmp->used > 0 && write(2, (void*)tmp->ptr, tmp->used) < 0) { -+ if (!buffer_string_is_empty(tmp) && write(2, CONST_BUF_LEN(tmp)) < 0) { - perror("error writing pipe"); - buffer_free(tmp); - return -1; -diff --git a/src/request.c b/src/request.c -index 65d0a0e..993cb28 100644 ---- a/src/request.c -+++ b/src/request.c -@@ -34,9 +34,9 @@ static int request_check_hostname(server *srv, connection *con, buffer *host) { - */ - - /* no Host: */ -- if (!host || host->used == 0) return 0; -+ if (buffer_is_empty(host)) return 0; - -- host_len = host->used - 1; -+ host_len = buffer_string_length(host); - - /* IPv6 adress */ - if (host->ptr[0] == '[') { -@@ -92,10 +92,9 @@ static int request_check_hostname(server *srv, connection *con, buffer *host) { - /* if the hostname ends in a "." strip it */ - if (host->ptr[host_len-1] == '.') { - /* shift port info one left */ -- if (NULL != colon) memmove(colon-1, colon, host->used - host_len); -- else host->ptr[host_len-1] = '\0'; -+ if (NULL != colon) memmove(colon-1, colon, buffer_string_length(host) - host_len); -+ buffer_string_set_length(host, buffer_string_length(host) - 1); - host_len -= 1; -- host->used -= 1; - } - - if (host_len == 0) return -1; -@@ -213,7 +212,7 @@ static int request_check_hostname(server *srv, connection *con, buffer *host) { - #endif - - static int http_request_split_value(array *vals, buffer *b) { -- size_t i; -+ size_t i, len; - int state = 0; - - const char *current; -@@ -226,10 +225,11 @@ static int http_request_split_value(array *vals, buffer *b) { - * into a array (more or less a explode() incl. striping of whitespaces - */ - -- if (b->used == 0) return 0; -+ if (buffer_string_is_empty(b)) return 0; - - current = b->ptr; -- for (i = 0; i < b->used; ++i, ++current) { -+ len = buffer_string_length(b); -+ for (i = 0; i <= len; ++i, ++current) { - data_string *ds; - - switch (state) { -@@ -297,7 +297,7 @@ int http_request_parse(server *srv, connection *con) { - int line = 0; - - int request_line_stage = 0; -- size_t i, first; -+ size_t i, first, ilen; - - int done = 0; - -@@ -310,7 +310,7 @@ int http_request_parse(server *srv, connection *con) { - if (con->conf.log_request_header) { - log_error_write(srv, __FILE__, __LINE__, "sdsdSb", - "fd:", con->fd, -- "request-len:", con->request.request->used, -+ "request-len:", buffer_string_length(con->request.request), - "\n", con->request.request); - } - -@@ -319,7 +319,7 @@ int http_request_parse(server *srv, connection *con) { - con->request.request->ptr[1] == '\n') { - /* we are in keep-alive and might get \r\n after a previous POST request.*/ - -- buffer_copy_string_len(con->parse_request, con->request.request->ptr + 2, con->request.request->used - 1 - 2); -+ buffer_copy_string_len(con->parse_request, con->request.request->ptr + 2, buffer_string_length(con->request.request) - 2); - } else { - /* fill the local request buffer */ - buffer_copy_buffer(con->parse_request, con->request.request); -@@ -334,15 +334,14 @@ int http_request_parse(server *srv, connection *con) { - * - * <method> <uri> <protocol>\r\n - * */ -- for (i = 0, first = 0; i < con->parse_request->used && line == 0; i++) { -- char *cur = con->parse_request->ptr + i; -- -- switch(*cur) { -+ ilen = buffer_string_length(con->parse_request); -+ for (i = 0, first = 0; i < ilen && line == 0; i++) { -+ switch(con->parse_request->ptr[i]) { - case '\r': - if (con->parse_request->ptr[i+1] == '\n') { - http_method_t r; - char *nuri = NULL; -- size_t j; -+ size_t j, jlen; - - /* \r\n -> \0\0 */ - con->parse_request->ptr[i] = '\0'; -@@ -476,7 +475,8 @@ int http_request_parse(server *srv, connection *con) { - } - - /* check uri for invalid characters */ -- for (j = 0; j < con->request.uri->used - 1; j++) { -+ jlen = buffer_string_length(con->request.uri); -+ for (j = 0; j < jlen; j++) { - if (!request_uri_is_valid_char(con->request.uri->ptr[j])) { - unsigned char buf[2]; - con->http_status = 400; -@@ -551,7 +551,7 @@ int http_request_parse(server *srv, connection *con) { - - in_folding = 0; - -- if (con->request.uri->used == 1) { -+ if (buffer_string_is_empty(con->request.uri)) { - con->http_status = 400; - con->response.keep_alive = 0; - con->keep_alive = 0; -@@ -579,7 +579,7 @@ int http_request_parse(server *srv, connection *con) { - con->request.http_host = ds->value; - } - -- for (; i < con->parse_request->used && !done; i++) { -+ for (; i <= ilen && !done; i++) { - char *cur = con->parse_request->ptr + i; - - if (is_key) { -@@ -825,7 +825,7 @@ int http_request_parse(server *srv, connection *con) { - } else if (cmp > 0 && 0 == (cmp = buffer_caseless_compare(CONST_BUF_LEN(ds->key), CONST_STR_LEN("Content-Length")))) { - char *err; - unsigned long int r; -- size_t j; -+ size_t j, jlen; - - if (con_length_set) { - con->http_status = 400; -@@ -842,9 +842,8 @@ int http_request_parse(server *srv, connection *con) { - return 0; - } - -- if (ds->value->used == 0) SEGFAULT(); -- -- for (j = 0; j < ds->value->used - 1; j++) { -+ jlen = buffer_string_length(ds->value); -+ for (j = 0; j < jlen; j++) { - char c = ds->value->ptr[j]; - if (!isdigit((unsigned char)c)) { - log_error_write(srv, __FILE__, __LINE__, "sbs", -@@ -1177,9 +1176,9 @@ int http_request_parse(server *srv, connection *con) { - int http_request_header_finished(server *srv, connection *con) { - UNUSED(srv); - -- if (con->request.request->used < 5) return 0; -+ if (buffer_string_length(con->request.request) < 4) return 0; - -- if (0 == memcmp(con->request.request->ptr + con->request.request->used - 5, "\r\n\r\n", 4)) return 1; -+ if (0 == memcmp(con->request.request->ptr + buffer_string_length(con->request.request) - 4, CONST_STR_LEN("\r\n\r\n"))) return 1; - if (NULL != strstr(con->request.request->ptr, "\r\n\r\n")) return 1; - - return 0; -diff --git a/src/response.c b/src/response.c -index 5072d05..357f43b 100644 ---- a/src/response.c -+++ b/src/response.c -@@ -70,7 +70,7 @@ int http_response_write_header(server *srv, connection *con) { - - ds = (data_string *)con->response.headers->data[i]; - -- if (ds->value->used && ds->key->used && -+ if (!buffer_is_empty(ds->value) && !buffer_is_empty(ds->key) && - 0 != strncasecmp(ds->key->ptr, CONST_STR_LEN("X-LIGHTTPD-")) && - 0 != strncasecmp(ds->key->ptr, CONST_STR_LEN("X-Sendfile"))) { - if (0 == strcasecmp(ds->key->ptr, "Date")) have_date = 1; -@@ -99,10 +99,7 @@ int http_response_write_header(server *srv, connection *con) { - if (srv->cur_ts != srv->last_generated_date_ts) { - buffer_string_prepare_copy(srv->ts_date_str, 255); - -- strftime(srv->ts_date_str->ptr, srv->ts_date_str->size - 1, -- "%a, %d %b %Y %H:%M:%S GMT", gmtime(&(srv->cur_ts))); -- -- srv->ts_date_str->used = strlen(srv->ts_date_str->ptr) + 1; -+ buffer_append_strftime(srv->ts_date_str, "%a, %d %b %Y %H:%M:%S GMT", gmtime(&(srv->cur_ts))); - - srv->last_generated_date_ts = srv->cur_ts; - } -@@ -113,7 +110,7 @@ int http_response_write_header(server *srv, connection *con) { - if (!have_server) { - if (buffer_is_empty(con->conf.server_tag)) { - buffer_append_string_len(b, CONST_STR_LEN("\r\nServer: " PACKAGE_DESC)); -- } else if (con->conf.server_tag->used > 1) { -+ } else if (!buffer_string_is_empty(con->conf.server_tag)) { - buffer_append_string_len(b, CONST_STR_LEN("\r\nServer: ")); - buffer_append_string_encoded(b, CONST_BUF_LEN(con->conf.server_tag), ENCODING_HTTP_HEADER); - } -@@ -121,7 +118,7 @@ int http_response_write_header(server *srv, connection *con) { - - buffer_append_string_len(b, CONST_STR_LEN("\r\n\r\n")); - -- con->bytes_header = b->used - 1; -+ con->bytes_header = buffer_string_length(b); - - if (con->conf.log_response_header) { - log_error_write(srv, __FILE__, __LINE__, "sSb", "Response-Header:", "\n", b); -@@ -204,8 +201,7 @@ static void https_add_ssl_entries(connection *con) { - buffer_string_prepare_copy(envds->value, n); - BIO_read(bio, envds->value->ptr, n); - BIO_free(bio); -- envds->value->ptr[n] = '\0'; -- envds->value->used = n+1; -+ buffer_commit(envds->value, n); - array_insert_unique(con->environment, (data_unset *)envds); - } - } -@@ -229,7 +225,7 @@ handler_t http_response_prepare(server *srv, connection *con) { - } - - /* no decision yet, build conf->filename */ -- if (con->mode == DIRECT && con->physical.path->used == 0) { -+ if (con->mode == DIRECT && buffer_is_empty(con->physical.path)) { - char *qstr; - - /* we only come here when we have the parse the full request again -@@ -294,8 +290,7 @@ handler_t http_response_prepare(server *srv, connection *con) { - - /** their might be a fragment which has to be cut away */ - if (NULL != (qstr = strchr(con->request.uri->ptr, '#'))) { -- con->request.uri->used = qstr - con->request.uri->ptr; -- con->request.uri->ptr[con->request.uri->used++] = '\0'; -+ buffer_string_set_length(con->request.uri, qstr - con->request.uri->ptr); - } - - /** extract query string from request.uri */ -@@ -451,23 +446,18 @@ handler_t http_response_prepare(server *srv, connection *con) { - - if (con->physical.rel_path->used > 1) { - buffer *b = con->physical.rel_path; -+ size_t len = buffer_string_length(b); - size_t i; - -- if (b->used > 2 && -- b->ptr[b->used-2] == '/' && -- (b->ptr[b->used-3] == ' ' || -- b->ptr[b->used-3] == '.')) { -- b->ptr[b->used--] = '\0'; -- } -- -- for (i = b->used - 2; b->used > 1; i--) { -- if (b->ptr[i] == ' ' || -- b->ptr[i] == '.') { -- b->ptr[b->used--] = '\0'; -- } else { -- break; -- } -+ /* strip trailing " /" or "./" once */ -+ if (len > 1 && -+ b->ptr[len - 1] == '/' && -+ (b->ptr[len - 2] == ' ' || b->ptr[len - 2] == '.')) { -+ len -= 2; - } -+ /* strip all trailing " " and "." */ -+ while (len > 0 && ( ' ' == b->ptr[len-1] || '.' == b->ptr[len-1] ) ) --len; -+ buffer_string_set_length(b, len); - } - #endif - -@@ -515,9 +505,9 @@ handler_t http_response_prepare(server *srv, connection *con) { - buffer_copy_buffer(con->physical.basedir, con->physical.doc_root); - buffer_copy_buffer(con->physical.path, con->physical.doc_root); - buffer_append_slash(con->physical.path); -- if (con->physical.rel_path->used && -+ if (!buffer_string_is_empty(con->physical.rel_path) && - con->physical.rel_path->ptr[0] == '/') { -- buffer_append_string_len(con->physical.path, con->physical.rel_path->ptr + 1, con->physical.rel_path->used - 2); -+ buffer_append_string_len(con->physical.path, con->physical.rel_path->ptr + 1, buffer_string_length(con->physical.rel_path) - 1); - } else { - buffer_append_string_buffer(con->physical.path, con->physical.rel_path); - } -@@ -589,7 +579,7 @@ handler_t http_response_prepare(server *srv, connection *con) { - }; - #endif - if (S_ISDIR(sce->st.st_mode)) { -- if (con->uri.path->ptr[con->uri.path->used - 2] != '/') { -+ if (con->uri.path->ptr[buffer_string_length(con->uri.path) - 1] != '/') { - /* redirect to .../ */ - - http_response_redirect_to_directory(srv, con); -@@ -672,7 +662,7 @@ handler_t http_response_prepare(server *srv, connection *con) { - } - - if (slash) pathinfo = slash; -- } while ((found == 0) && (slash != NULL) && ((size_t)(slash - srv->tmp_buf->ptr) > (con->physical.basedir->used - 2))); -+ } while ((found == 0) && (slash != NULL) && ((size_t)(slash - srv->tmp_buf->ptr) > (buffer_string_length(con->physical.basedir) - 1))); - - if (found == 0) { - /* no it really doesn't exists */ -@@ -711,8 +701,7 @@ handler_t http_response_prepare(server *srv, connection *con) { - * shorten uri.path - */ - -- con->uri.path->used -= strlen(pathinfo); -- con->uri.path->ptr[con->uri.path->used - 1] = '\0'; -+ buffer_string_set_length(con->uri.path, buffer_string_length(con->uri.path) - strlen(pathinfo)); - } - - if (con->conf.log_request_handling) { -diff --git a/src/server.c b/src/server.c -index 71d3538..5089375 100644 ---- a/src/server.c -+++ b/src/server.c -@@ -666,7 +666,7 @@ int main (int argc, char **argv) { - #endif - - /* check document-root */ -- if (srv->config_storage[0]->document_root->used <= 1) { -+ if (buffer_string_is_empty(srv->config_storage[0]->document_root)) { - log_error_write(srv, __FILE__, __LINE__, "s", - "document-root is not set\n"); - -@@ -686,7 +686,7 @@ int main (int argc, char **argv) { - } - - /* open pid file BEFORE chroot */ -- if (srv->srvconf.pid_file->used) { -+ if (!buffer_string_is_empty(srv->srvconf.pid_file)) { - if (-1 == (pid_fd = open(srv->srvconf.pid_file->ptr, O_WRONLY | O_CREAT | O_EXCL | O_TRUNC, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH))) { - struct stat st; - if (errno != EEXIST) { -@@ -780,7 +780,7 @@ int main (int argc, char **argv) { - - #ifdef HAVE_PWD_H - /* set user and group */ -- if (srv->srvconf.username->used) { -+ if (!buffer_string_is_empty(srv->srvconf.username)) { - if (NULL == (pwd = getpwnam(srv->srvconf.username->ptr))) { - log_error_write(srv, __FILE__, __LINE__, "sb", - "can't find username", srv->srvconf.username); -@@ -794,7 +794,7 @@ int main (int argc, char **argv) { - } - } - -- if (srv->srvconf.groupname->used) { -+ if (!buffer_string_is_empty(srv->srvconf.groupname)) { - if (NULL == (grp = getgrnam(srv->srvconf.groupname->ptr))) { - log_error_write(srv, __FILE__, __LINE__, "sb", - "can't find groupname", srv->srvconf.groupname); -@@ -828,13 +828,13 @@ int main (int argc, char **argv) { - log_error_write(srv, __FILE__, __LINE__, "ss", "setgroups failed: ", strerror(errno)); - return -1; - } -- if (srv->srvconf.username->used) { -+ if (!buffer_string_is_empty(srv->srvconf.username)) { - initgroups(srv->srvconf.username->ptr, grp->gr_gid); - } - } - #endif - #ifdef HAVE_CHROOT -- if (srv->srvconf.changeroot->used) { -+ if (!buffer_string_is_empty(srv->srvconf.changeroot)) { - tzset(); - - if (-1 == chroot(srv->srvconf.changeroot->ptr)) { -@@ -1001,8 +1001,7 @@ int main (int argc, char **argv) { - if (pid_fd != -1) { - buffer_copy_int(srv->tmp_buf, getpid()); - buffer_append_string_len(srv->tmp_buf, CONST_STR_LEN("\n")); -- force_assert(srv->tmp_buf->used > 0); -- write(pid_fd, srv->tmp_buf->ptr, srv->tmp_buf->used - 1); -+ write(pid_fd, CONST_BUF_LEN(srv->tmp_buf)); - close(pid_fd); - pid_fd = -1; - } -@@ -1425,8 +1424,8 @@ int main (int argc, char **argv) { - - /* network_close() will cleanup after us */ - -- if (srv->srvconf.pid_file->used && -- srv->srvconf.changeroot->used == 0) { -+ if (!buffer_string_is_empty(srv->srvconf.pid_file) && -+ buffer_string_is_empty(srv->srvconf.changeroot)) { - if (0 != unlink(srv->srvconf.pid_file->ptr)) { - if (errno != EACCES && errno != EPERM) { - log_error_write(srv, __FILE__, __LINE__, "sbds", -@@ -1542,8 +1541,8 @@ int main (int argc, char **argv) { - srv->joblist->used = 0; - } - -- if (srv->srvconf.pid_file->used && -- srv->srvconf.changeroot->used == 0 && -+ if (!buffer_string_is_empty(srv->srvconf.pid_file) && -+ buffer_string_is_empty(srv->srvconf.changeroot) && - 0 == graceful_shutdown) { - if (0 != unlink(srv->srvconf.pid_file->ptr)) { - if (errno != EACCES && errno != EPERM) { -diff --git a/src/stat_cache.c b/src/stat_cache.c -index b63140e..dedea4b 100644 ---- a/src/stat_cache.c -+++ b/src/stat_cache.c -@@ -222,8 +222,7 @@ static int stat_cache_attr_get(buffer *buf, char *name) { - buffer_string_prepare_copy(buf, 1023); - attrlen = buf->size - 1; - if(0 == (ret = attr_get(name, "Content-Type", buf->ptr, &attrlen, 0))) { -- buf->used = attrlen + 1; -- buf->ptr[attrlen] = '\0'; -+ buffer_commit(buf, attrlen); - } - return ret; - } -@@ -332,7 +331,7 @@ static int buffer_copy_dirname(buffer *dst, buffer *file) { - - if (buffer_string_is_empty(file)) return -1; - -- for (i = file->used - 1; i+1 > 0; i--) { -+ for (i = buffer_string_length(file); i > 0; i--) { - if (file->ptr[i] == '/') { - buffer_copy_string_len(dst, file->ptr, i); - return 0; -@@ -499,7 +498,7 @@ handler_t stat_cache_get_entry(server *srv, connection *con, buffer *name, stat_ - - if (S_ISREG(st.st_mode)) { - /* fix broken stat/open for symlinks to reg files with appended slash on freebsd,osx */ -- if (name->ptr[name->used-2] == '/') { -+ if (name->ptr[buffer_string_length(name) - 1] == '/') { - errno = ENOTDIR; - return HANDLER_ERROR; - } -@@ -571,16 +570,15 @@ handler_t stat_cache_get_entry(server *srv, connection *con, buffer *name, stat_ - * we assume "/" can not be symlink, so - * skip the symlink stuff if our path is / - **/ -- else if ((name->used > 2)) { -+ else if (buffer_string_length(name) > 1) { - buffer *dname; - char *s_cur; - - dname = buffer_init(); - buffer_copy_buffer(dname, name); - -- while ((s_cur = strrchr(dname->ptr,'/'))) { -- *s_cur = '\0'; -- dname->used = s_cur - dname->ptr + 1; -+ while ((s_cur = strrchr(dname->ptr, '/'))) { -+ buffer_string_set_length(dname, s_cur - dname->ptr); - if (dname->ptr == s_cur) { - #ifdef DEBUG_STAT_CACHE - log_error_write(srv, __FILE__, __LINE__, "s", "reached /"); -@@ -615,16 +613,19 @@ handler_t stat_cache_get_entry(server *srv, connection *con, buffer *name, stat_ - #endif - /* xattr did not set a content-type. ask the config */ - if (buffer_string_is_empty(sce->content_type)) { -+ size_t namelen = buffer_string_length(name); -+ - for (k = 0; k < con->conf.mimetypes->used; k++) { - data_string *ds = (data_string *)con->conf.mimetypes->data[k]; - buffer *type = ds->key; -+ size_t typelen = buffer_string_length(type); - -- if (type->used == 0) continue; -+ if (buffer_is_empty(type)) continue; - - /* check if the right side is the same */ -- if (type->used > name->used) continue; -+ if (typelen > namelen) continue; - -- if (0 == strncasecmp(name->ptr + name->used - type->used, type->ptr, type->used - 1)) { -+ if (0 == strncasecmp(name->ptr + namelen - typelen, type->ptr, typelen)) { - buffer_copy_buffer(sce->content_type, ds->value); - break; - } --- -2.4.5 - |