diff --git a/contrib/hpack/decode.c b/contrib/hpack/decode.c index 2fd43b8a8..6f575eb07 100644 --- a/contrib/hpack/decode.c +++ b/contrib/hpack/decode.c @@ -29,8 +29,8 @@ uint8_t buf[MAX_RQ_SIZE]; char trash_buf[MAX_RQ_SIZE]; char tmp_buf[MAX_RQ_SIZE]; -struct chunk trash = { .str = trash_buf, .len = 0, .size = sizeof(trash_buf) }; -struct chunk tmp = { .str = tmp_buf, .len = 0, .size = sizeof(tmp_buf) }; +struct chunk trash = { .area = trash_buf, .data = 0, .size = sizeof(trash_buf) }; +struct chunk tmp = { .area = tmp_buf, .data = 0, .size = sizeof(tmp_buf) }; /* displays a long memory block at , assuming first byte of * has address . String may be placed as a prefix in front of @@ -193,10 +193,11 @@ int main(int argc, char **argv) //printf("\e[1;35m%s\e[0m\n", istpad(trash.str, list[idx].v).ptr); printf(" %s: ", list[idx].n.ptr ? - istpad(trash.str, list[idx].n).ptr : + istpad(trash.area, list[idx].n).ptr : h2_phdr_to_str(list[idx].n.len)); - printf("%s [n=(%p,%d) v=(%p,%d)]\n", istpad(trash.str, list[idx].v).ptr, + printf("%s [n=(%p,%d) v=(%p,%d)]\n", + istpad(trash.area, list[idx].v).ptr, list[idx].n.ptr, (int)list[idx].n.len, list[idx].v.ptr, (int)list[idx].v.len); } puts(">>>"); diff --git a/contrib/mod_defender/defender.c b/contrib/mod_defender/defender.c index 17341760c..789db71d4 100644 --- a/contrib/mod_defender/defender.c +++ b/contrib/mod_defender/defender.c @@ -83,8 +83,8 @@ static apr_status_t defender_bucket_read(apr_bucket *b, const char **str, { struct apr_bucket_defender *d = b->data; - *str = d->buf.str; - *len = d->buf.len; + *str = d->buf.area; + *len = d->buf.data; return APR_SUCCESS; } @@ -103,11 +103,11 @@ static apr_bucket *defender_bucket_make(apr_bucket *b, const struct chunk *buf) d = apr_bucket_alloc(sizeof(*d), b->list); - d->buf.str = buf->str; - d->buf.len = buf->len; + d->buf.area = buf->area; + d->buf.data = buf->data; d->buf.size = 0; - b = apr_bucket_shared_make(b, d, 0, buf->len); + b = apr_bucket_shared_make(b, d, 0, buf->data); b->type = &apr_bucket_type_defender; return b; } @@ -487,10 +487,10 @@ int defender_process_request(struct worker *worker, struct defender_request *req if (!(r->useragent_ip = defender_addr2str(r->pool, &request->clientip))) goto out; - if (request->id.data.u.str.str && request->id.data.u.str.len > 0) { + if (request->id.data.u.str.area && request->id.data.u.str.data > 0) { apr_table_setn(r->subprocess_env, "UNIQUE_ID", - defender_strdup(r->pool, request->id.data.u.str.str, - request->id.data.u.str.len)); + defender_strdup(r->pool, request->id.data.u.str.area, + request->id.data.u.str.data)); } else { apr_table_setn(r->subprocess_env, "UNIQUE_ID", @@ -502,37 +502,37 @@ int defender_process_request(struct worker *worker, struct defender_request *req query = &request->query.data.u.str; version = &request->version.data.u.str; - r->method_number = lookup_builtin_method(method->str, method->len); - if (!(r->method = defender_strdup(r->pool, method->str, method->len))) + r->method_number = lookup_builtin_method(method->area, method->data); + if (!(r->method = defender_strdup(r->pool, method->area, method->data))) goto out; r->unparsed_uri = defender_printf(r->pool, "%.*s%s%.*s", - path->len, path->str, - query->len > 0 ? "?" : "", - query->len, query->str); + path->data, path->area, + query->data > 0 ? "?" : "", + query->data, query->area); if (!r->unparsed_uri) goto out; - if (!(r->uri = defender_strdup(r->pool, path->str, path->len))) + if (!(r->uri = defender_strdup(r->pool, path->area, path->data))) goto out; r->parsed_uri.path = r->filename = r->uri; - if (!(r->args = defender_strdup(r->pool, query->str, query->len))) + if (!(r->args = defender_strdup(r->pool, query->area, query->data))) goto out; r->parsed_uri.query = r->args; r->protocol = defender_printf(r->pool, "%s%.*s", - version->len > 0 ? "HTTP/" : "", - version->len, version->str); + version->data > 0 ? "HTTP/" : "", + version->data, version->area); if (!r->protocol) goto out; r->the_request = defender_printf(r->pool, "%.*s %s%s%s", - method->len, method->str, + method->data, method->area, r->unparsed_uri, - version->len > 0 ? " " : "", + version->data > 0 ? " " : "", r->protocol); if (!r->the_request) goto out; @@ -541,8 +541,8 @@ int defender_process_request(struct worker *worker, struct defender_request *req if (request->headers.data.type != SMP_T_BIN) goto misc; - hdr_ptr = request->headers.data.u.str.str; - hdr_end = hdr_ptr + request->headers.data.u.str.len; + hdr_ptr = request->headers.data.u.str.area; + hdr_end = hdr_ptr + request->headers.data.u.str.data; while (1) { memset(&hdr, 0, sizeof(hdr)); diff --git a/contrib/modsecurity/modsec_wrapper.c b/contrib/modsecurity/modsec_wrapper.c index 271ec15d1..b3f67ecd4 100644 --- a/contrib/modsecurity/modsec_wrapper.c +++ b/contrib/modsecurity/modsec_wrapper.c @@ -218,28 +218,28 @@ int modsecurity_process(struct worker *worker, struct modsecurity_parameters *pa int return_code = -1; /* Decode uniqueid. */ - uniqueid = params->uniqueid.data.u.str.str; - uniqueid_len = params->uniqueid.data.u.str.len; + uniqueid = params->uniqueid.data.u.str.area; + uniqueid_len = params->uniqueid.data.u.str.data; /* Decode method. */ - meth = params->method.data.u.str.str; - meth_len = params->method.data.u.str.len; + meth = params->method.data.u.str.area; + meth_len = params->method.data.u.str.data; /* Decode path. */ - path = params->path.data.u.str.str; - path_len = params->path.data.u.str.len; + path = params->path.data.u.str.area; + path_len = params->path.data.u.str.data; /* Decode query string. */ - qs = params->query.data.u.str.str; - qs_len = params->query.data.u.str.len; + qs = params->query.data.u.str.area; + qs_len = params->query.data.u.str.data; /* Decode version. */ - vers = params->vers.data.u.str.str; - vers_len = params->vers.data.u.str.len; + vers = params->vers.data.u.str.area; + vers_len = params->vers.data.u.str.data; /* Decode header binary block. */ - buf = params->hdrs_bin.data.u.str.str; - end = buf + params->hdrs_bin.data.u.str.len; + buf = params->hdrs_bin.data.u.str.area; + end = buf + params->hdrs_bin.data.u.str.data; /* Decode each header. */ hdr_nb = 0; @@ -289,8 +289,8 @@ int modsecurity_process(struct worker *worker, struct modsecurity_parameters *pa return -1; /* Decode body. */ - body = params->body.data.u.str.str; - body_len = params->body.data.u.str.len; + body = params->body.data.u.str.area; + body_len = params->body.data.u.str.data; fail = 1; diff --git a/include/common/chunk.h b/include/common/chunk.h index a511a5940..b9c1d2066 100644 --- a/include/common/chunk.h +++ b/include/common/chunk.h @@ -31,9 +31,9 @@ /* describes a chunk of string */ struct chunk { - char *str; /* beginning of the string itself. Might not be 0-terminated */ - int size; /* total size of the buffer, 0 if the *str is read-only */ - int len; /* current size of the string from first to last char. <0 = uninit. */ + char *area; /* points to bytes */ + size_t size; /* buffer size in bytes */ + size_t data; /* amount of data after head including wrapping */ }; struct pool_head *pool_head_trash; @@ -66,13 +66,13 @@ static inline void free_trash_chunk(struct chunk *chunk) static inline void chunk_reset(struct chunk *chk) { - chk->len = 0; + chk->data = 0; } static inline void chunk_init(struct chunk *chk, char *str, size_t size) { - chk->str = str; - chk->len = 0; + chk->area = str; + chk->data = 0; chk->size = size; } @@ -83,8 +83,8 @@ static inline int chunk_initlen(struct chunk *chk, char *str, size_t size, int l if (len < 0 || (size && len > size)) return 0; - chk->str = str; - chk->len = len; + chk->area = str; + chk->data = len; chk->size = size; return 1; @@ -93,8 +93,8 @@ static inline int chunk_initlen(struct chunk *chk, char *str, size_t size, int l /* this is only for temporary manipulation, the chunk is read-only */ static inline void chunk_initstr(struct chunk *chk, const char *str) { - chk->str = (char *)str; - chk->len = strlen(str); + chk->area = (char *)str; + chk->data = strlen(str); chk->size = 0; /* mark it read-only */ } @@ -106,8 +106,8 @@ static inline int chunk_memcpy(struct chunk *chk, const char *src, size_t len) if (unlikely(len >= chk->size)) return 0; - chk->len = len; - memcpy(chk->str, src, len); + chk->data = len; + memcpy(chk->area, src, len); return 1; } @@ -117,11 +117,11 @@ static inline int chunk_memcpy(struct chunk *chk, const char *src, size_t len) */ static inline int chunk_memcat(struct chunk *chk, const char *src, size_t len) { - if (unlikely(chk->len < 0 || chk->len + len >= chk->size)) + if (unlikely(chk->data < 0 || chk->data + len >= chk->size)) return 0; - memcpy(chk->str + chk->len, src, len); - chk->len += len; + memcpy(chk->area + chk->data, src, len); + chk->data += len; return 1; } @@ -137,8 +137,8 @@ static inline int chunk_strcpy(struct chunk *chk, const char *str) if (unlikely(len >= chk->size)) return 0; - chk->len = len; - memcpy(chk->str, str, len + 1); + chk->data = len; + memcpy(chk->area, str, len + 1); return 1; } @@ -152,11 +152,11 @@ static inline int chunk_strcat(struct chunk *chk, const char *str) len = strlen(str); - if (unlikely(chk->len < 0 || chk->len + len >= chk->size)) + if (unlikely(chk->data < 0 || chk->data + len >= chk->size)) return 0; - memcpy(chk->str + chk->len, str, len + 1); - chk->len += len; + memcpy(chk->area + chk->data, str, len + 1); + chk->data += len; return 1; } @@ -165,11 +165,11 @@ static inline int chunk_strcat(struct chunk *chk, const char *str) */ static inline int chunk_strncat(struct chunk *chk, const char *str, int nb) { - if (unlikely(chk->len < 0 || chk->len + nb >= chk->size)) + if (unlikely(chk->data < 0 || chk->data + nb >= chk->size)) return 0; - memcpy(chk->str + chk->len, str, nb); - chk->len += nb; + memcpy(chk->area + chk->data, str, nb); + chk->data += nb; return 1; } @@ -187,17 +187,17 @@ static inline int chunk_strncat(struct chunk *chk, const char *str, int nb) */ static inline char *chunk_newstr(struct chunk *chk) { - if (chk->len < 0 || chk->len + 1 >= chk->size) + if (chk->data < 0 || chk->data + 1 >= chk->size) return NULL; - chk->str[chk->len++] = 0; - return chk->str + chk->len; + chk->area[chk->data++] = 0; + return chk->area + chk->data; } static inline void chunk_drop(struct chunk *chk) { - chk->str = NULL; - chk->len = -1; + chk->area = NULL; + chk->data = -1; chk->size = 0; } @@ -206,7 +206,7 @@ static inline void chunk_destroy(struct chunk *chk) if (!chk->size) return; - free(chk->str); + free(chk->area); chunk_drop(chk); } @@ -219,28 +219,28 @@ static inline void chunk_destroy(struct chunk *chk) */ static inline char *chunk_dup(struct chunk *dst, const struct chunk *src) { - if (!dst || !src || src->len < 0 || !src->str) + if (!dst || !src || src->data < 0 || !src->area) return NULL; if (dst->size) - free(dst->str); - dst->len = src->len; - dst->size = src->len; + free(dst->area); + dst->data = src->data; + dst->size = src->data; if (dst->size < src->size || !src->size) dst->size++; - dst->str = (char *)malloc(dst->size); - if (!dst->str) { - dst->len = 0; + dst->area = (char *)malloc(dst->size); + if (!dst->area) { + dst->data = 0; dst->size = 0; return NULL; } - memcpy(dst->str, src->str, dst->len); - if (dst->len < dst->size) - dst->str[dst->len] = 0; + memcpy(dst->area, src->area, dst->data); + if (dst->data < dst->size) + dst->area[dst->data] = 0; - return dst->str; + return dst->area; } #endif /* _TYPES_CHUNK_H */ diff --git a/include/proto/action.h b/include/proto/action.h index e3015ec11..dcfdeacca 100644 --- a/include/proto/action.h +++ b/include/proto/action.h @@ -52,7 +52,7 @@ static inline void action_build_list(struct list *keywords, struct chunk *chk) char *end; int l; - p = chk->str; + p = chk->area; end = p + chk->size - 1; list_for_each_entry(kw_list, keywords, list) { for (i = 0; kw_list->kw[i].kw != NULL; i++) { @@ -62,7 +62,7 @@ static inline void action_build_list(struct list *keywords, struct chunk *chk) p += l; } } - if (p > chk->str) + if (p > chk->area) *(p-2) = '\0'; else *p = '\0'; diff --git a/include/proto/channel.h b/include/proto/channel.h index d831fcc6b..10e3602db 100644 --- a/include/proto/channel.h +++ b/include/proto/channel.h @@ -788,9 +788,9 @@ static inline int ci_putchk(struct channel *chn, struct chunk *chunk) { int ret; - ret = ci_putblk(chn, chunk->str, chunk->len); + ret = ci_putblk(chn, chunk->area, chunk->data); if (ret > 0) - chunk->len -= ret; + chunk->data -= ret; return ret; } diff --git a/include/proto/proto_http.h b/include/proto/proto_http.h index 07301608d..d3b1f439e 100644 --- a/include/proto/proto_http.h +++ b/include/proto/proto_http.h @@ -87,7 +87,7 @@ int http_find_next_header(char *sol, struct hdr_idx *idx, struct hdr_ctx *ctx); char *find_hdr_value_end(char *s, const char *e); char *extract_cookie_value(char *hdr, const char *hdr_end, char *cookie_name, - size_t cookie_name_l, int list, char **value, int *value_l); + size_t cookie_name_l, int list, char **value, size_t *value_l); int http_header_match2(const char *hdr, const char *end, const char *name, int len); int http_remove_header2(struct http_msg *msg, struct hdr_idx *idx, struct hdr_ctx *ctx); int http_header_add_tail2(struct http_msg *msg, struct hdr_idx *hdr_idx, const char *text, int len); @@ -104,7 +104,7 @@ void http_capture_bad_message(struct proxy *proxy, struct error_snapshot *es, st enum h1_state state, struct proxy *other_end); unsigned int http_get_hdr(const struct http_msg *msg, const char *hname, int hlen, struct hdr_idx *idx, int occ, - struct hdr_ctx *ctx, char **vptr, int *vlen); + struct hdr_ctx *ctx, char **vptr, size_t *vlen); char *http_get_path(struct http_txn *txn); const char *get_reason(unsigned int status); diff --git a/include/proto/sample.h b/include/proto/sample.h index 94226d2d5..6cca99a6a 100644 --- a/include/proto/sample.h +++ b/include/proto/sample.h @@ -92,22 +92,22 @@ int smp_is_safe(struct sample *smp) /* Fall through */ case SMP_T_STR: - if ((smp->data.u.str.len < 0) || - (smp->data.u.str.size && smp->data.u.str.len >= smp->data.u.str.size)) + if ((smp->data.u.str.data < 0) || + (smp->data.u.str.size && smp->data.u.str.data >= smp->data.u.str.size)) return 0; - if (smp->data.u.str.str[smp->data.u.str.len] == 0) + if (smp->data.u.str.area[smp->data.u.str.data] == 0) return 1; if (!smp->data.u.str.size || (smp->flags & SMP_F_CONST)) return 0; - smp->data.u.str.str[smp->data.u.str.len] = 0; + smp->data.u.str.area[smp->data.u.str.data] = 0; return 1; case SMP_T_BIN: - return (smp->data.u.str.len >= 0) && - (!smp->data.u.str.size || smp->data.u.str.len <= smp->data.u.str.size); + return (smp->data.u.str.data >= 0) && + (!smp->data.u.str.size || smp->data.u.str.data <= smp->data.u.str.size); default: return 1; @@ -145,18 +145,18 @@ int smp_is_rw(struct sample *smp) case SMP_T_STR: if (!smp->data.u.str.size || - smp->data.u.str.len < 0 || - smp->data.u.str.len >= smp->data.u.str.size) + smp->data.u.str.data < 0 || + smp->data.u.str.data >= smp->data.u.str.size) return 0; - if (smp->data.u.str.str[smp->data.u.str.len] != 0) - smp->data.u.str.str[smp->data.u.str.len] = 0; + if (smp->data.u.str.area[smp->data.u.str.data] != 0) + smp->data.u.str.area[smp->data.u.str.data] = 0; return 1; case SMP_T_BIN: return smp->data.u.str.size && - smp->data.u.str.len >= 0 && - smp->data.u.str.len <= smp->data.u.str.size; + smp->data.u.str.data >= 0 && + smp->data.u.str.data <= smp->data.u.str.size; default: return 1; diff --git a/include/proto/spoe.h b/include/proto/spoe.h index 002cf7d76..299836bb0 100644 --- a/include/proto/spoe.h +++ b/include/proto/spoe.h @@ -180,18 +180,20 @@ spoe_encode_data(struct sample *smp, unsigned int *off, char **buf, char *end) *p++ = (smp->data.type == SMP_T_STR) ? SPOE_DATA_T_STR : SPOE_DATA_T_BIN; - ret = spoe_encode_frag_buffer(chk->str, chk->len, &p, end); + ret = spoe_encode_frag_buffer(chk->area, + chk->data, &p, + end); if (ret == -1) return -1; } else { /* The sample has been fragmented, encode remaining data */ - ret = MIN(chk->len - *off, end - p); - memcpy(p, chk->str + *off, ret); + ret = MIN(chk->data - *off, end - p); + memcpy(p, chk->area + *off, ret); p += ret; } /* Now update <*off> */ - if (ret + *off != chk->len) + if (ret + *off != chk->data) *off += ret; else *off = 0; @@ -214,8 +216,8 @@ spoe_encode_data(struct sample *smp, unsigned int *off, char **buf, char *end) case HTTP_METH_CONNECT: m = "CONNECT"; len = 7; break; default : - m = smp->data.u.meth.str.str; - len = smp->data.u.meth.str.len; + m = smp->data.u.meth.str.area; + len = smp->data.u.meth.str.data; } if (spoe_encode_buffer(m, len, &p, end) == -1) return -1; @@ -333,8 +335,8 @@ spoe_decode_data(char **buf, char *end, struct sample *smp) /* All the buffer must be decoded */ if (spoe_decode_buffer(&p, end, &str, &sz) == -1) return -1; - smp->data.u.str.str = str; - smp->data.u.str.len = sz; + smp->data.u.str.area = str; + smp->data.u.str.data = sz; smp->data.type = (type == SPOE_DATA_T_STR) ? SMP_T_STR : SMP_T_BIN; break; } diff --git a/src/51d.c b/src/51d.c index a36333ef5..4ad82fe56 100644 --- a/src/51d.c +++ b/src/51d.c @@ -160,7 +160,7 @@ static void _51d_lru_free(void *cache_entry) if (!ptr) return; - free(ptr->str); + free(ptr->area); free(ptr); } @@ -189,15 +189,15 @@ static void _51d_insert_cache_entry(struct sample *smp, struct lru64 *lru, void* if (!cache_entry) return; - cache_entry->str = _51d_malloc(smp->data.u.str.len + 1); - if (!cache_entry->str) { + cache_entry->area = _51d_malloc(smp->data.u.str.data + 1); + if (!cache_entry->area) { free(cache_entry); return; } - memcpy(cache_entry->str, smp->data.u.str.str, smp->data.u.str.len); - cache_entry->str[smp->data.u.str.len] = 0; - cache_entry->len = smp->data.u.str.len; + memcpy(cache_entry->area, smp->data.u.str.area, smp->data.u.str.data); + cache_entry->area[smp->data.u.str.data] = 0; + cache_entry->data = smp->data.u.str.data; lru64_commit(lru, cache_entry, domain, 0, _51d_lru_free); } @@ -206,8 +206,8 @@ static void _51d_insert_cache_entry(struct sample *smp, struct lru64 *lru, void* static void _51d_retrieve_cache_entry(struct sample *smp, struct lru64 *lru) { struct chunk *cache_entry = lru->data; - smp->data.u.str.str = cache_entry->str; - smp->data.u.str.len = cache_entry->len; + smp->data.u.str.area = cache_entry->area; + smp->data.u.str.data = cache_entry->data; } #endif @@ -228,10 +228,9 @@ static void _51d_set_headers(struct sample *smp, fiftyoneDegreesWorkset *ws) for (i = 0; i < global_51degrees.header_count; i++) { ctx.idx = 0; - if (http_find_full_header2( - (global_51degrees.header_names + i)->str, - (global_51degrees.header_names + i)->len, - msg->chn->buf->p, idx, &ctx) == 1) { + if (http_find_full_header2((global_51degrees.header_names + i)->area, + (global_51degrees.header_names + i)->data, + msg->chn->buf->p, idx, &ctx) == 1) { ws->importantHeaders[ws->importantHeadersCount].header = ws->dataSet->httpHeaders + i; ws->importantHeaders[ws->importantHeadersCount].headerValue = ctx.line + ctx.val; ws->importantHeaders[ws->importantHeadersCount].headerValueLength = ctx.vlen; @@ -256,10 +255,9 @@ static void _51d_set_device_offsets(struct sample *smp) for (index = 0; index < global_51degrees.header_count; index++) { ctx.idx = 0; - if (http_find_full_header2( - (global_51degrees.header_names + index)->str, - (global_51degrees.header_names + index)->len, - msg->chn->buf->p, idx, &ctx) == 1) { + if (http_find_full_header2((global_51degrees.header_names + index)->area, + (global_51degrees.header_names + index)->data, + msg->chn->buf->p, idx, &ctx) == 1) { (offsets->firstOffset + offsets->size)->httpHeaderOffset = *(global_51degrees.header_offsets + index); (offsets->firstOffset + offsets->size)->deviceOffset = fiftyoneDegreesGetDeviceOffset(&global_51degrees.data_set, ctx.line + ctx.val); offsets->size++; @@ -307,11 +305,11 @@ static void _51d_process_match(const struct arg *args, struct sample *smp) const char* property_name; /* Loop through property names passed to the filter and fetch them from the dataset. */ - while (args[i].data.str.str) { + while (args[i].data.str.area) { /* Try to find request property in dataset. */ found = 0; #ifdef FIFTYONEDEGREES_H_PATTERN_INCLUDED - if (strcmp("Method", args[i].data.str.str) == 0) { + if (strcmp("Method", args[i].data.str.area) == 0) { switch(ws->method) { case EXACT: methodName = "Exact"; break; case NUMERIC: methodName = "Numeric"; break; @@ -323,18 +321,18 @@ static void _51d_process_match(const struct arg *args, struct sample *smp) chunk_appendf(temp, "%s", methodName); found = 1; } - else if (strcmp("Difference", args[i].data.str.str) == 0) { + else if (strcmp("Difference", args[i].data.str.area) == 0) { chunk_appendf(temp, "%d", ws->difference); found = 1; } - else if (strcmp("Rank", args[i].data.str.str) == 0) { + else if (strcmp("Rank", args[i].data.str.area) == 0) { chunk_appendf(temp, "%d", fiftyoneDegreesGetSignatureRank(ws)); found = 1; } else { for (j = 0; j < ws->dataSet->requiredPropertyCount; j++) { property_name = fiftyoneDegreesGetPropertyName(ws->dataSet, ws->dataSet->requiredProperties[j]); - if (strcmp(property_name, args[i].data.str.str) == 0) { + if (strcmp(property_name, args[i].data.str.area) == 0) { found = 1; fiftyoneDegreesSetValues(ws, j); chunk_appendf(temp, "%s", fiftyoneDegreesGetValueName(ws->dataSet, *ws->values)); @@ -347,7 +345,7 @@ static void _51d_process_match(const struct arg *args, struct sample *smp) found = 0; for (j = 0; j < requiredPropertiesCount; j++) { property_name = requiredProperties[j]; - if (strcmp(property_name, args[i].data.str.str) == 0 && + if (strcmp(property_name, args[i].data.str.area) == 0 && fiftyoneDegreesGetValueFromOffsets(&global_51degrees.data_set, deviceOffsets, j, valuesBuffer, 1024) > 0) { found = 1; chunk_appendf(temp, "%s", valuesBuffer); @@ -363,13 +361,13 @@ static void _51d_process_match(const struct arg *args, struct sample *smp) ++i; } - if (temp->len) { - --temp->len; - temp->str[temp->len] = '\0'; + if (temp->data) { + --temp->data; + temp->area[temp->data] = '\0'; } - smp->data.u.str.str = temp->str; - smp->data.u.str.len = temp->len; + smp->data.u.str.area = temp->area; + smp->data.u.str.data = temp->data; } static int _51d_fetch(const struct arg *args, struct sample *smp, const char *kw, void *private) @@ -457,7 +455,7 @@ static int _51d_conv(const struct arg *args, struct sample *smp, void *private) if (_51d_lru_tree) { unsigned long long seed = _51d_lru_seed ^ (long)args; - lru = lru64_get(XXH64(smp->data.u.str.str, smp->data.u.str.len, seed), + lru = lru64_get(XXH64(smp->data.u.str.area, smp->data.u.str.data, seed), _51d_lru_tree, (void*)args, 0); if (lru && lru->domain) { _51d_retrieve_cache_entry(smp, lru); @@ -475,15 +473,16 @@ static int _51d_conv(const struct arg *args, struct sample *smp, void *private) if (!smp_dup(smp)) return 0; - smp->data.u.str.str[smp->data.u.str.len] = '\0'; + smp->data.u.str.area[smp->data.u.str.data] = '\0'; /* Perform detection. */ #ifdef FIFTYONEDEGREES_H_PATTERN_INCLUDED - fiftyoneDegreesMatch(ws, smp->data.u.str.str); + fiftyoneDegreesMatch(ws, smp->data.u.str.area); _51d_process_match(args, smp, ws); #endif #ifdef FIFTYONEDEGREES_H_TRIE_INCLUDED - global_51degrees.device_offsets.firstOffset->deviceOffset = fiftyoneDegreesGetDeviceOffset(&global_51degrees.data_set, smp->data.u.str.str); + global_51degrees.device_offsets.firstOffset->deviceOffset = fiftyoneDegreesGetDeviceOffset(&global_51degrees.data_set, + smp->data.u.str.area); global_51degrees.device_offsets.size = 1; _51d_process_match(args, smp); #endif @@ -507,9 +506,9 @@ void _51d_init_http_headers() global_51degrees.header_names = malloc(global_51degrees.header_count * sizeof(struct chunk)); for (index = 0; index < global_51degrees.header_count; index++) { headerName = fiftyoneDegreesGetString(ds, ds->httpHeaders[index].headerNameOffset); - (global_51degrees.header_names + index)->str = (char*)&headerName->firstByte; - (global_51degrees.header_names + index)->len = headerName->length - 1; - (global_51degrees.header_names + index)->size = (global_51degrees.header_names + index)->len; + (global_51degrees.header_names + index)->area = (char*)&headerName->firstByte; + (global_51degrees.header_names + index)->data = headerName->length - 1; + (global_51degrees.header_names + index)->size = (global_51degrees.header_names + index)->data; } } #endif @@ -526,9 +525,9 @@ void _51d_init_http_headers() global_51degrees.header_offsets = malloc(global_51degrees.header_count * sizeof(int32_t)); for (index = 0; index < global_51degrees.header_count; index++) { global_51degrees.header_offsets[index] = fiftyoneDegreesGetHttpHeaderNameOffset(ds, index); - global_51degrees.header_names[index].str = (char*)fiftyoneDegreesGetHttpHeaderNamePointer(ds, index); - global_51degrees.header_names[index].len = strlen(global_51degrees.header_names[index].str); - global_51degrees.header_names[index].size = global_51degrees.header_names[index].len; + global_51degrees.header_names->area = (char*)fiftyoneDegreesGetHttpHeaderNamePointer(ds, index); + global_51degrees.header_names->data = strlen(global_51degrees.header_names->area); + global_51degrees.header_names[index].size = global_51degrees.header_names->data; } } #endif @@ -615,8 +614,9 @@ static int init_51degrees(void) break; } if (_51d_dataset_status != DATA_SET_INIT_STATUS_SUCCESS) { - if (temp->len) - ha_alert("51Degrees Setup - Error reading 51Degrees data file. %s\n", temp->str); + if (temp->data) + ha_alert("51Degrees Setup - Error reading 51Degrees data file. %s\n", + temp->area); else ha_alert("51Degrees Setup - Error reading 51Degrees data file.\n"); return ERR_ALERT | ERR_FATAL; diff --git a/src/acl.c b/src/acl.c index f19b2d201..afb48ad71 100644 --- a/src/acl.c +++ b/src/acl.c @@ -113,9 +113,9 @@ static struct acl_expr *prune_acl_expr(struct acl_expr *expr) if (arg->type == ARGT_STOP) break; if (arg->type == ARGT_STR || arg->unresolved) { - free(arg->data.str.str); - arg->data.str.str = NULL; - arg->data.str.len = 0; + free(arg->data.str.area); + arg->data.str.area = NULL; + arg->data.str.data = 0; unresolved |= arg->unresolved; arg->unresolved = 0; } @@ -525,11 +525,12 @@ struct acl_expr *parse_acl_expr(const char **args, char **err, struct arg_list * } /* Create displayed reference */ - snprintf(trash.str, trash.size, "acl '%s' file '%s' line %d", expr->kw, file, line); - trash.str[trash.size - 1] = '\0'; + snprintf(trash.area, trash.size, "acl '%s' file '%s' line %d", + expr->kw, file, line); + trash.area[trash.size - 1] = '\0'; /* Create new patern reference. */ - ref = pat_ref_newid(unique_id, trash.str, PAT_REF_ACL); + ref = pat_ref_newid(unique_id, trash.area, PAT_REF_ACL); if (!ref) { memprintf(err, "memory error"); goto out_free_expr; @@ -1272,7 +1273,8 @@ int acl_find_targets(struct proxy *p) */ if (expr->smp->arg_p->unresolved) { ha_alert("Internal bug in proxy %s: %sacl %s %s() makes use of unresolved userlist '%s'. Please report this.\n", - p->id, *acl->name ? "" : "anonymous ", acl->name, expr->kw, expr->smp->arg_p->data.str.str); + p->id, *acl->name ? "" : "anonymous ", acl->name, expr->kw, + expr->smp->arg_p->data.str.area); cfgerr++; continue; } diff --git a/src/arg.c b/src/arg.c index b31858d3b..8e71dcca2 100644 --- a/src/arg.c +++ b/src/arg.c @@ -174,9 +174,9 @@ int make_arg_list(const char *in, int len, uint64_t mask, struct arg **argp, * during the parsing. The caller must at one point resolve * them and free the string. */ - arg->data.str.str = word; - arg->data.str.len = in - beg; - arg->data.str.size = arg->data.str.len + 1; + arg->data.str.area = word; + arg->data.str.data = in - beg; + arg->data.str.size = arg->data.str.data + 1; word = NULL; break; diff --git a/src/auth.c b/src/auth.c index a2c689f76..3dd3a1de0 100644 --- a/src/auth.c +++ b/src/auth.c @@ -277,7 +277,7 @@ pat_match_auth(struct sample *smp, struct pattern_expr *expr, int fill) /* Browse the userlist for searching user. */ for (u = ul->users; u; u = u->next) { - if (strcmp(smp->data.u.str.str, u->user) == 0) + if (strcmp(smp->data.u.str.area, u->user) == 0) break; } if (!u) diff --git a/src/backend.c b/src/backend.c index b82ecbbf9..e94c4c9b3 100644 --- a/src/backend.c +++ b/src/backend.c @@ -489,7 +489,7 @@ static struct server *get_server_rch(struct stream *s) c_rew(&s->req, rewind); ret = fetch_rdp_cookie_name(s, &smp, px->hh_name, px->hh_len); - len = smp.data.u.str.len; + len = smp.data.u.str.data; c_adv(&s->req, rewind); @@ -503,7 +503,7 @@ static struct server *get_server_rch(struct stream *s) /* Found a the hh_name in the headers. * we will compute the hash based on this value ctx.val. */ - hash = gen_hash(px, smp.data.u.str.str, len); + hash = gen_hash(px, smp.data.u.str.area, len); if ((px->lbprm.algo & BE_LB_HASH_MOD) == BE_LB_HMOD_AVAL) hash = full_hash(hash); @@ -1013,7 +1013,7 @@ static void assign_tproxy_address(struct stream *s) case CO_SRC_TPROXY_DYN: if (src->bind_hdr_occ && s->txn) { char *vptr; - int vlen; + size_t vlen; int rewind; /* bind to the IP in a header */ @@ -1270,7 +1270,8 @@ int connect_server(struct stream *s) c_adv(&s->req, rewind); if (smp_make_safe(smp)) { - ssl_sock_set_servername(srv_conn, smp->data.u.str.str); + ssl_sock_set_servername(srv_conn, + smp->data.u.str.area); srv_conn->flags |= CO_FL_PRIVATE; } } @@ -1413,7 +1414,7 @@ int tcp_persist_rdp_cookie(struct stream *s, struct channel *req, int an_bit) memset(&smp, 0, sizeof(smp)); ret = fetch_rdp_cookie_name(s, &smp, s->be->rdp_cookie_name, s->be->rdp_cookie_len); - if (ret == 0 || (smp.flags & SMP_F_MAY_CHANGE) || smp.data.u.str.len == 0) + if (ret == 0 || (smp.flags & SMP_F_MAY_CHANGE) || smp.data.u.str.data == 0) goto no_cookie; /* Considering an rdp cookie detected using acl, str ended with and should return. @@ -1421,7 +1422,7 @@ int tcp_persist_rdp_cookie(struct stream *s, struct channel *req, int an_bit) * server's IP address in network order, and "port" is the integer corresponding to the * server's port in network order. Comments please Emeric. */ - addr = strtoul(smp.data.u.str.str, &p, 10); + addr = strtoul(smp.data.u.str.area, &p, 10); if (*p != '.') goto no_cookie; p++; @@ -1741,13 +1742,13 @@ smp_fetch_be_name(const struct arg *args, struct sample *smp, const char *kw, vo if (!smp->strm) return 0; - smp->data.u.str.str = (char *)smp->strm->be->id; - if (!smp->data.u.str.str) + smp->data.u.str.area = (char *)smp->strm->be->id; + if (!smp->data.u.str.area) return 0; smp->data.type = SMP_T_STR; smp->flags = SMP_F_CONST; - smp->data.u.str.len = strlen(smp->data.u.str.str); + smp->data.u.str.data = strlen(smp->data.u.str.area); return 1; } @@ -1882,7 +1883,7 @@ static int sample_conv_nbsrv(const struct arg *args, struct sample *smp, void *p if (!smp_make_safe(smp)) return 0; - px = proxy_find_by_name(smp->data.u.str.str, PR_CAP_BE, 0); + px = proxy_find_by_name(smp->data.u.str.area, PR_CAP_BE, 0); if (!px) return 0; diff --git a/src/cache.c b/src/cache.c index 6e7a87af4..4143edc03 100644 --- a/src/cache.c +++ b/src/cache.c @@ -349,7 +349,7 @@ int http_calc_maxage(struct stream *s, struct cache *cache) chunk_strncat(chk, value, ctx.vlen - 8 + 1); chunk_strncat(chk, "", 1); - maxage = atoi(chk->str); + maxage = atoi(chk->area); } value = directive_value(ctx.line + ctx.val, ctx.vlen, "max-age", 7); @@ -358,7 +358,7 @@ int http_calc_maxage(struct stream *s, struct cache *cache) chunk_strncat(chk, value, ctx.vlen - 7 + 1); chunk_strncat(chk, "", 1); - smaxage = atoi(chk->str); + smaxage = atoi(chk->area); } } @@ -657,7 +657,7 @@ int sha1_hosturi(struct http_txn *txn) /* hash everything */ blk_SHA1_Init(&sha1_ctx); - blk_SHA1_Update(&sha1_ctx, trash->str, trash->len); + blk_SHA1_Update(&sha1_ctx, trash->area, trash->data); blk_SHA1_Final((unsigned char *)txn->cache_hash, &sha1_ctx); return 1; diff --git a/src/cfgparse.c b/src/cfgparse.c index f3c2be499..b44e6fa88 100644 --- a/src/cfgparse.c +++ b/src/cfgparse.c @@ -1778,10 +1778,10 @@ int cfg_parse_global(const char *file, int linenum, char **args, int kwm) goto out; } - memcpy(trash.str, *env, delim - *env); - trash.str[delim - *env] = 0; + memcpy(trash.area, *env, delim - *env); + trash.area[delim - *env] = 0; - if (unsetenv(trash.str) != 0) { + if (unsetenv(trash.area) != 0) { ha_alert("parsing [%s:%d]: '%s' failed to unset variable '%s' : %s.\n", file, linenum, args[0], *env, strerror(errno)); err_code |= ERR_ALERT | ERR_FATAL; goto out; diff --git a/src/checks.c b/src/checks.c index 6db077a3b..5100c7ec5 100644 --- a/src/checks.c +++ b/src/checks.c @@ -289,9 +289,9 @@ static void set_server_check_status(struct check *check, short status, const cha (check->health >= check->rise) ? check->fall : check->rise, (check->health >= check->rise) ? (s->uweight ? "UP" : "DRAIN") : "DOWN"); - ha_warning("%s.\n", trash.str); - send_log(s->proxy, LOG_NOTICE, "%s.\n", trash.str); - send_email_alert(s, LOG_INFO, "%s", trash.str); + ha_warning("%s.\n", trash.area); + send_log(s->proxy, LOG_NOTICE, "%s.\n", trash.area); + send_email_alert(s, LOG_INFO, "%s", trash.area); } } @@ -434,14 +434,16 @@ void __health_adjust(struct server *s, short status) case HANA_ONERR_FAILCHK: /* simulate a failed health check */ - set_server_check_status(&s->check, HCHK_STATUS_HANA, trash.str); + set_server_check_status(&s->check, HCHK_STATUS_HANA, + trash.area); check_notify_failure(&s->check); break; case HANA_ONERR_MARKDWN: /* mark server down */ s->check.health = s->check.rise; - set_server_check_status(&s->check, HCHK_STATUS_HANA, trash.str); + set_server_check_status(&s->check, HCHK_STATUS_HANA, + trash.area); check_notify_failure(&s->check); break; @@ -638,18 +640,21 @@ static void chk_report_conn_err(struct check *check, int errno_bck, int expired) if (conn && conn->err_code) { if (errno && errno != EAGAIN) - chunk_printf(&trash, "%s (%s)%s", conn_err_code_str(conn), strerror(errno), chk->str); + chunk_printf(&trash, "%s (%s)%s", conn_err_code_str(conn), strerror(errno), + chk->area); else - chunk_printf(&trash, "%s%s", conn_err_code_str(conn), chk->str); - err_msg = trash.str; + chunk_printf(&trash, "%s%s", conn_err_code_str(conn), + chk->area); + err_msg = trash.area; } else { if (errno && errno != EAGAIN) { - chunk_printf(&trash, "%s%s", strerror(errno), chk->str); - err_msg = trash.str; + chunk_printf(&trash, "%s%s", strerror(errno), + chk->area); + err_msg = trash.area; } else { - err_msg = chk->str; + err_msg = chk->area; } } @@ -1112,14 +1117,15 @@ static void event_srv_chk_r(struct conn_stream *cs) hs, *msg ? " (" : "", msg, *msg ? ")" : ""); - set_server_check_status(check, status, t->str); + set_server_check_status(check, status, t->area); } else if (err && *err) { /* No status change but we'd like to report something odd. * Just report the current state and copy the message. */ chunk_printf(&trash, "agent reports an error : %s", err); - set_server_check_status(check, status/*check->status*/, trash.str); + set_server_check_status(check, status/*check->status*/, + trash.area); } else if (wrn && *wrn) { @@ -1127,7 +1133,8 @@ static void event_srv_chk_r(struct conn_stream *cs) * Just report the current state and copy the message. */ chunk_printf(&trash, "agent warns : %s", wrn); - set_server_check_status(check, status/*check->status*/, trash.str); + set_server_check_status(check, status/*check->status*/, + trash.area); } else set_server_check_status(check, status, NULL); @@ -1530,7 +1537,8 @@ static int connect_conn_chk(struct task *t) } else if ((check->type) == PR_O2_HTTP_CHK) { if (s->proxy->options2 & PR_O2_CHK_SNDST) - b_putblk(&check->bo, trash.str, httpchk_build_status_header(s, trash.str, trash.size)); + b_putblk(&check->bo, trash.area, + httpchk_build_status_header(s, trash.area, trash.size)); /* prevent HTTP keep-alive when "http-check expect" is used */ if (s->proxy->options2 & PR_O2_EXP_TYPE) b_putist(&check->bo, ist("Connection: close\r\n")); @@ -2729,7 +2737,8 @@ static int tcpcheck_main(struct check *check) comment = tcpcheck_get_step_comment(check, step); if (comment) chunk_appendf(&trash, " comment: '%s'", comment); - set_server_check_status(check, HCHK_STATUS_SOCKERR, trash.str); + set_server_check_status(check, HCHK_STATUS_SOCKERR, + trash.area); check->current_step = NULL; goto out; } @@ -2814,7 +2823,8 @@ static int tcpcheck_main(struct check *check) comment = tcpcheck_get_step_comment(check, step); if (comment) chunk_appendf(&trash, " comment: '%s'", comment); - set_server_check_status(check, HCHK_STATUS_L4CON, trash.str); + set_server_check_status(check, HCHK_STATUS_L4CON, + trash.area); goto out_end_tcpcheck; case SF_ERR_PRXCOND: case SF_ERR_RESOURCE: @@ -2824,7 +2834,8 @@ static int tcpcheck_main(struct check *check) comment = tcpcheck_get_step_comment(check, step); if (comment) chunk_appendf(&trash, " comment: '%s'", comment); - set_server_check_status(check, HCHK_STATUS_SOCKERR, trash.str); + set_server_check_status(check, HCHK_STATUS_SOCKERR, + trash.area); goto out_end_tcpcheck; } @@ -2860,7 +2871,8 @@ static int tcpcheck_main(struct check *check) chunk_printf(&trash, "tcp-check send : string too large (%d) for buffer size (%u) at step %d", check->current_step->string_len, (unsigned int)b_size(&check->bo), tcpcheck_get_step_id(check)); - set_server_check_status(check, HCHK_STATUS_L7RSP, trash.str); + set_server_check_status(check, HCHK_STATUS_L7RSP, + trash.area); goto out_end_tcpcheck; } @@ -2930,7 +2942,8 @@ static int tcpcheck_main(struct check *check) comment = tcpcheck_get_step_comment(check, step); if (comment) chunk_appendf(&trash, " comment: '%s'", comment); - set_server_check_status(check, HCHK_STATUS_L7RSP, trash.str); + set_server_check_status(check, HCHK_STATUS_L7RSP, + trash.area); goto out_end_tcpcheck; } @@ -2964,7 +2977,8 @@ static int tcpcheck_main(struct check *check) comment = tcpcheck_get_step_comment(check, step); if (comment) chunk_appendf(&trash, " comment: '%s'", comment); - set_server_check_status(check, HCHK_STATUS_L7RSP, trash.str); + set_server_check_status(check, HCHK_STATUS_L7RSP, + trash.area); goto out_end_tcpcheck; } /* matched and was supposed to => OK, next step */ @@ -3019,7 +3033,8 @@ static int tcpcheck_main(struct check *check) comment = tcpcheck_get_step_comment(check, step); if (comment) chunk_appendf(&trash, " comment: '%s'", comment); - set_server_check_status(check, HCHK_STATUS_L7RSP, trash.str); + set_server_check_status(check, HCHK_STATUS_L7RSP, + trash.area); goto out_end_tcpcheck; } } diff --git a/src/chunk.c b/src/chunk.c index f1a86d31e..f655277d5 100644 --- a/src/chunk.c +++ b/src/chunk.c @@ -35,7 +35,7 @@ static THREAD_LOCAL char *trash_buf2; struct pool_head *pool_head_trash = NULL; /* this is used to drain data, and as a temporary buffer for sprintf()... */ -THREAD_LOCAL struct chunk trash = { .str = NULL }; +THREAD_LOCAL struct chunk trash = { }; /* * Returns a pre-allocated and initialized trash chunk that can be used for any @@ -68,11 +68,11 @@ struct chunk *get_trash_chunk(void) */ static int alloc_trash_buffers(int bufsize) { - chunk_init(&trash, my_realloc2(trash.str, bufsize), bufsize); + chunk_init(&trash, my_realloc2(trash.area, bufsize), bufsize); trash_size = bufsize; trash_buf1 = (char *)my_realloc2(trash_buf1, bufsize); trash_buf2 = (char *)my_realloc2(trash_buf2, bufsize); - return trash.str && trash_buf1 && trash_buf2; + return trash.area && trash_buf1 && trash_buf2; } static int init_trash_buffers_per_thread() @@ -140,19 +140,19 @@ int chunk_printf(struct chunk *chk, const char *fmt, ...) va_list argp; int ret; - if (!chk->str || !chk->size) + if (!chk->area || !chk->size) return 0; va_start(argp, fmt); - ret = vsnprintf(chk->str, chk->size, fmt, argp); + ret = vsnprintf(chk->area, chk->size, fmt, argp); va_end(argp); - chk->len = ret; + chk->data = ret; if (ret >= chk->size) ret = -1; - chk->len = ret; - return chk->len; + chk->data = ret; + return chk->data; } /* @@ -165,18 +165,19 @@ int chunk_appendf(struct chunk *chk, const char *fmt, ...) va_list argp; int ret; - if (chk->len < 0 || !chk->str || !chk->size) + if (chk->data < 0 || !chk->area || !chk->size) return 0; va_start(argp, fmt); - ret = vsnprintf(chk->str + chk->len, chk->size - chk->len, fmt, argp); - if (ret >= chk->size - chk->len) + ret = vsnprintf(chk->area + chk->data, chk->size - chk->data, fmt, + argp); + if (ret >= chk->size - chk->data) /* do not copy anything in case of truncation */ - chk->str[chk->len] = 0; + chk->area[chk->data] = 0; else - chk->len += ret; + chk->data += ret; va_end(argp); - return chk->len; + return chk->data; } /* @@ -190,37 +191,38 @@ int chunk_htmlencode(struct chunk *dst, struct chunk *src) int olen, free; char c; - if (dst->len < 0) - return dst->len; + if (dst->data < 0) + return dst->data; - olen = dst->len; + olen = dst->data; - for (i = 0; i < src->len; i++) { - free = dst->size - dst->len; + for (i = 0; i < src->data; i++) { + free = dst->size - dst->data; if (!free) { - dst->len = olen; - return dst->len; + dst->data = olen; + return dst->data; } - c = src->str[i]; + c = src->area[i]; if (!isascii(c) || !isprint((unsigned char)c) || c == '&' || c == '"' || c == '\'' || c == '<' || c == '>') { - l = snprintf(dst->str + dst->len, free, "&#%u;", (unsigned char)c); + l = snprintf(dst->area + dst->data, free, "&#%u;", + (unsigned char)c); if (free < l) { - dst->len = olen; - return dst->len; + dst->data = olen; + return dst->data; } - dst->len += l; + dst->data += l; } else { - dst->str[dst->len] = c; - dst->len++; + dst->area[dst->data] = c; + dst->data++; } } - return dst->len; + return dst->data; } /* @@ -234,37 +236,38 @@ int chunk_asciiencode(struct chunk *dst, struct chunk *src, char qc) int olen, free; char c; - if (dst->len < 0) - return dst->len; + if (dst->data < 0) + return dst->data; - olen = dst->len; + olen = dst->data; - for (i = 0; i < src->len; i++) { - free = dst->size - dst->len; + for (i = 0; i < src->data; i++) { + free = dst->size - dst->data; if (!free) { - dst->len = olen; - return dst->len; + dst->data = olen; + return dst->data; } - c = src->str[i]; + c = src->area[i]; if (!isascii(c) || !isprint((unsigned char)c) || c == '<' || c == '>' || c == qc) { - l = snprintf(dst->str + dst->len, free, "<%02X>", (unsigned char)c); + l = snprintf(dst->area + dst->data, free, "<%02X>", + (unsigned char)c); if (free < l) { - dst->len = olen; - return dst->len; + dst->data = olen; + return dst->data; } - dst->len += l; + dst->data += l; } else { - dst->str[dst->len] = c; - dst->len++; + dst->area[dst->data] = c; + dst->data++; } } - return dst->len; + return dst->data; } /* Compares the string in chunk with the string in which must be @@ -273,8 +276,8 @@ int chunk_asciiencode(struct chunk *dst, struct chunk *src, char qc) */ int chunk_strcmp(const struct chunk *chk, const char *str) { - const char *s1 = chk->str; - int len = chk->len; + const char *s1 = chk->area; + int len = chk->data; int diff = 0; do { @@ -293,8 +296,8 @@ int chunk_strcmp(const struct chunk *chk, const char *str) */ int chunk_strcasecmp(const struct chunk *chk, const char *str) { - const char *s1 = chk->str; - int len = chk->len; + const char *s1 = chk->area; + int len = chk->data; int diff = 0; do { diff --git a/src/cli.c b/src/cli.c index 0bc4722bd..4440f2516 100644 --- a/src/cli.c +++ b/src/cli.c @@ -117,7 +117,7 @@ static char *cli_gen_usage_msg(struct appctx *appctx) } chunk_init(&out, NULL, 0); chunk_dup(&out, tmp); - dynamic_usage_msg = out.str; + dynamic_usage_msg = out.area; end: if (dynamic_usage_msg) { @@ -403,8 +403,8 @@ static int cli_parse_request(struct appctx *appctx) appctx->st2 = 0; memset(&appctx->ctx.cli, 0, sizeof(appctx->ctx.cli)); - p = appctx->chunk->str; - end = p + appctx->chunk->len; + p = appctx->chunk->area; + end = p + appctx->chunk->data; /* * Get the payload start if there is one. @@ -454,7 +454,7 @@ static int cli_parse_request(struct appctx *appctx) i++; } /* fill unused slots */ - p = appctx->chunk->str + appctx->chunk->len; + p = appctx->chunk->area + appctx->chunk->data; for (; i < MAX_STATS_ARGS + 1; i++) args[i] = p; @@ -500,7 +500,7 @@ static int cli_output_msg(struct channel *chn, const char *msg, int severity, in } chunk_appendf(tmp, "%s", msg); - return ci_putblk(chn, tmp->str, strlen(tmp->str)); + return ci_putblk(chn, tmp->area, strlen(tmp->area)); } /* This I/O handler runs as an applet embedded in a stream interface. It is @@ -557,7 +557,7 @@ static void cli_io_handler(struct appctx *appctx) } } - str = appctx->chunk->str + appctx->chunk->len; + str = appctx->chunk->area + appctx->chunk->data; /* ensure we have some output room left in the event we * would want to return some info right after parsing. @@ -568,7 +568,8 @@ static void cli_io_handler(struct appctx *appctx) } /* '- 1' is to ensure a null byte can always be inserted at the end */ - reql = co_getline(si_oc(si), str, appctx->chunk->size - appctx->chunk->len - 1); + reql = co_getline(si_oc(si), str, + appctx->chunk->size - appctx->chunk->data - 1); if (reql <= 0) { /* closed or EOL not found */ if (reql == 0) break; @@ -607,12 +608,12 @@ static void cli_io_handler(struct appctx *appctx) len--; str[len] = '\0'; - appctx->chunk->len += len; + appctx->chunk->data += len; if (appctx->st1 & APPCTX_CLI_ST1_PAYLOAD) { - appctx->chunk->str[appctx->chunk->len] = '\n'; - appctx->chunk->str[appctx->chunk->len + 1] = 0; - appctx->chunk->len++; + appctx->chunk->area[appctx->chunk->data] = '\n'; + appctx->chunk->area[appctx->chunk->data + 1] = 0; + appctx->chunk->data++; } appctx->st0 = CLI_ST_PROMPT; @@ -621,8 +622,8 @@ static void cli_io_handler(struct appctx *appctx) /* empty line */ if (!len) { /* remove the last two \n */ - appctx->chunk->len -= 2; - appctx->chunk->str[appctx->chunk->len] = 0; + appctx->chunk->data -= 2; + appctx->chunk->area[appctx->chunk->data] = 0; if (!cli_parse_request(appctx)) cli_gen_usage_msg(appctx); @@ -641,7 +642,7 @@ static void cli_io_handler(struct appctx *appctx) * Its location is not remembered here, this is just to switch * to a gathering mode. */ - if (!strcmp(appctx->chunk->str + appctx->chunk->len - strlen(PAYLOAD_PATTERN), PAYLOAD_PATTERN)) + if (!strcmp(appctx->chunk->area + appctx->chunk->data - strlen(PAYLOAD_PATTERN), PAYLOAD_PATTERN)) appctx->st1 |= APPCTX_CLI_ST1_PAYLOAD; else { /* no payload, the command is complete: parse the request */ @@ -705,7 +706,7 @@ static void cli_io_handler(struct appctx *appctx) * when entering a payload with interactive mode, change the prompt * to emphasize that more data can still be sent */ - if (appctx->chunk->len && appctx->st1 & APPCTX_CLI_ST1_PAYLOAD) + if (appctx->chunk->data && appctx->st1 & APPCTX_CLI_ST1_PAYLOAD) prompt = "+ "; else prompt = "\n> "; @@ -1053,7 +1054,7 @@ static int cli_io_handler_show_cli_sock(struct appctx *appctx) } } /* replace the latest comma by a newline */ - trash.str[trash.len-1] = '\n'; + trash.area[trash.data-1] = '\n'; } else { chunk_appendf(&trash, "all\n"); diff --git a/src/connection.c b/src/connection.c index 1ea96ae3d..ca9a8ca2f 100644 --- a/src/connection.c +++ b/src/connection.c @@ -409,8 +409,9 @@ int conn_recv_proxy(struct connection *conn, int flag) return 0; do { - trash.len = recv(conn->handle.fd, trash.str, trash.size, MSG_PEEK); - if (trash.len < 0) { + trash.data = recv(conn->handle.fd, trash.area, trash.size, + MSG_PEEK); + if (trash.data < 0) { if (errno == EINTR) continue; if (errno == EAGAIN) { @@ -421,24 +422,24 @@ int conn_recv_proxy(struct connection *conn, int flag) } } while (0); - if (!trash.len) { + if (!trash.data) { /* client shutdown */ conn->err_code = CO_ER_PRX_EMPTY; goto fail; } - if (trash.len < 6) + if (trash.data < 6) goto missing; - line = trash.str; - end = trash.str + trash.len; + line = trash.area; + end = trash.area + trash.data; /* Decode a possible proxy request, fail early if it does not match */ if (strncmp(line, "PROXY ", 6) != 0) goto not_v1; line += 6; - if (trash.len < 9) /* shortest possible line */ + if (trash.data < 9) /* shortest possible line */ goto missing; if (memcmp(line, "TCP4 ", 5) == 0) { @@ -553,15 +554,15 @@ int conn_recv_proxy(struct connection *conn, int flag) goto fail; } - trash.len = line - trash.str; + trash.data = line - trash.area; goto eat_header; not_v1: /* try PPv2 */ - if (trash.len < PP2_HEADER_LEN) + if (trash.data < PP2_HEADER_LEN) goto missing; - hdr_v2 = (struct proxy_hdr_v2 *)trash.str; + hdr_v2 = (struct proxy_hdr_v2 *) trash.area; if (memcmp(hdr_v2->sig, v2sig, PP2_SIGNATURE_LEN) != 0 || (hdr_v2->ver_cmd & PP2_VERSION_MASK) != PP2_VERSION) { @@ -569,7 +570,7 @@ int conn_recv_proxy(struct connection *conn, int flag) goto fail; } - if (trash.len < PP2_HEADER_LEN + ntohs(hdr_v2->len)) + if (trash.data < PP2_HEADER_LEN + ntohs(hdr_v2->len)) goto missing; switch (hdr_v2->ver_cmd & PP2_CMD_MASK) { @@ -607,8 +608,8 @@ int conn_recv_proxy(struct connection *conn, int flag) /* TLV parsing */ if (tlv_length > 0) { - while (tlv_offset + TLV_HEADER_SIZE <= trash.len) { - const struct tlv *tlv_packet = (struct tlv *) &trash.str[tlv_offset]; + while (tlv_offset + TLV_HEADER_SIZE <= trash.data) { + const struct tlv *tlv_packet = (struct tlv *) &trash.area[tlv_offset]; const int tlv_len = get_tlv_length(tlv_packet); tlv_offset += tlv_len + TLV_HEADER_SIZE; @@ -617,7 +618,7 @@ int conn_recv_proxy(struct connection *conn, int flag) void *tlv_crc32c_p = (void *)tlv_packet->value; uint32_t n_crc32c = ntohl(read_u32(tlv_crc32c_p)); write_u32(tlv_crc32c_p, 0); - if (hash_crc32c(trash.str, PP2_HEADER_LEN + ntohs(hdr_v2->len)) != n_crc32c) + if (hash_crc32c(trash.area, PP2_HEADER_LEN + ntohs(hdr_v2->len)) != n_crc32c) goto bad_header; break; } @@ -645,7 +646,7 @@ int conn_recv_proxy(struct connection *conn, int flag) goto bad_header; /* not a supported command */ } - trash.len = PP2_HEADER_LEN + ntohs(hdr_v2->len); + trash.data = PP2_HEADER_LEN + ntohs(hdr_v2->len); goto eat_header; eat_header: @@ -654,10 +655,10 @@ int conn_recv_proxy(struct connection *conn, int flag) * fail. */ do { - int len2 = recv(conn->handle.fd, trash.str, trash.len, 0); + int len2 = recv(conn->handle.fd, trash.area, trash.data, 0); if (len2 < 0 && errno == EINTR) continue; - if (len2 != trash.len) + if (len2 != trash.data) goto recv_abort; } while (0); @@ -722,8 +723,9 @@ int conn_recv_netscaler_cip(struct connection *conn, int flag) return 0; do { - trash.len = recv(conn->handle.fd, trash.str, trash.size, MSG_PEEK); - if (trash.len < 0) { + trash.data = recv(conn->handle.fd, trash.area, trash.size, + MSG_PEEK); + if (trash.data < 0) { if (errno == EINTR) continue; if (errno == EAGAIN) { @@ -734,7 +736,7 @@ int conn_recv_netscaler_cip(struct connection *conn, int flag) } } while (0); - if (!trash.len) { + if (!trash.data) { /* client shutdown */ conn->err_code = CO_ER_CIP_EMPTY; goto fail; @@ -743,10 +745,10 @@ int conn_recv_netscaler_cip(struct connection *conn, int flag) /* Fail if buffer length is not large enough to contain * CIP magic, header length or * CIP magic, CIP length, CIP type, header length */ - if (trash.len < 12) + if (trash.data < 12) goto missing; - line = trash.str; + line = trash.area; /* Decode a possible NetScaler Client IP request, fail early if * it does not match */ @@ -754,12 +756,12 @@ int conn_recv_netscaler_cip(struct connection *conn, int flag) goto bad_magic; /* Legacy CIP protocol */ - if ((trash.str[8] & 0xD0) == 0x40) { + if ((trash.area[8] & 0xD0) == 0x40) { hdr_len = ntohl(*(uint32_t *)(line+4)); line += 8; } /* Standard CIP protocol */ - else if (trash.str[8] == 0x00) { + else if (trash.area[8] == 0x00) { hdr_len = ntohs(*(uint32_t *)(line+10)); line += 12; } @@ -771,7 +773,7 @@ int conn_recv_netscaler_cip(struct connection *conn, int flag) /* Fail if buffer length is not large enough to contain * a minimal IP header */ - if (trash.len < 20) + if (trash.data < 20) goto missing; /* Get IP version from the first four bits */ @@ -783,7 +785,7 @@ int conn_recv_netscaler_cip(struct connection *conn, int flag) hdr_ip4 = (struct ip *)line; - if (trash.len < 40 || trash.len < hdr_len) { + if (trash.data < 40 || trash.data < hdr_len) { /* Fail if buffer length is not large enough to contain * IPv4 header, TCP header */ goto missing; @@ -813,7 +815,7 @@ int conn_recv_netscaler_cip(struct connection *conn, int flag) hdr_ip6 = (struct ip6_hdr *)line; - if (trash.len < 60 || trash.len < hdr_len) { + if (trash.data < 60 || trash.data < hdr_len) { /* Fail if buffer length is not large enough to contain * IPv6 header, TCP header */ goto missing; @@ -844,17 +846,17 @@ int conn_recv_netscaler_cip(struct connection *conn, int flag) } line += hdr_len; - trash.len = line - trash.str; + trash.data = line - trash.area; /* remove the NetScaler Client IP header from the request. For this * we re-read the exact line at once. If we don't get the exact same * result, we fail. */ do { - int len2 = recv(conn->handle.fd, trash.str, trash.len, 0); + int len2 = recv(conn->handle.fd, trash.area, trash.data, 0); if (len2 < 0 && errno == EINTR) continue; - if (len2 != trash.len) + if (len2 != trash.data) goto recv_abort; } while (0); @@ -1096,13 +1098,17 @@ int make_proxy_line_v2(char *buf, int buf_len, struct server *srv, struct connec if (srv->pp_opts & SRV_PP_V2_SSL_CN) { struct chunk *cn_trash = get_trash_chunk(); if (ssl_sock_get_remote_common_name(remote, cn_trash) > 0) { - ssl_tlv_len += make_tlv(&buf[ret+ssl_tlv_len], (buf_len - ret - ssl_tlv_len), PP2_SUBTYPE_SSL_CN, cn_trash->len, cn_trash->str); + ssl_tlv_len += make_tlv(&buf[ret+ssl_tlv_len], (buf_len - ret - ssl_tlv_len), PP2_SUBTYPE_SSL_CN, + cn_trash->data, + cn_trash->area); } } if (srv->pp_opts & SRV_PP_V2_SSL_KEY_ALG) { struct chunk *pkey_trash = get_trash_chunk(); if (ssl_sock_get_pkey_algo(remote, pkey_trash) > 0) { - ssl_tlv_len += make_tlv(&buf[ret+ssl_tlv_len], (buf_len - ret - ssl_tlv_len), PP2_SUBTYPE_SSL_KEY_ALG, pkey_trash->len, pkey_trash->str); + ssl_tlv_len += make_tlv(&buf[ret+ssl_tlv_len], (buf_len - ret - ssl_tlv_len), PP2_SUBTYPE_SSL_KEY_ALG, + pkey_trash->data, + pkey_trash->area); } } if (srv->pp_opts & SRV_PP_V2_SSL_SIG_ALG) { diff --git a/src/da.c b/src/da.c index 685a79d19..b21159ce4 100644 --- a/src/da.c +++ b/src/da.c @@ -193,10 +193,11 @@ static int da_haproxy(const struct arg *args, struct sample *smp, da_deviceinfo_ tmp = get_trash_chunk(); chunk_reset(tmp); - propname = (const char *)args[0].data.str.str; + propname = (const char *) args[0].data.str.area; i = 0; - for (; propname != 0; i ++, propname = (const char *)args[i].data.str.str) { + for (; propname != 0; i ++, + propname = (const char *) args[i].data.str.area) { status = da_atlas_getpropid(&global_deviceatlas.atlas, propname, &prop); if (status != DA_OK) { @@ -241,13 +242,13 @@ static int da_haproxy(const struct arg *args, struct sample *smp, da_deviceinfo_ da_close(devinfo); - if (tmp->len) { - --tmp->len; - tmp->str[tmp->len] = 0; + if (tmp->data) { + --tmp->data; + tmp->area[tmp->data] = 0; } - smp->data.u.str.str = tmp->str; - smp->data.u.str.len = tmp->len; + smp->data.u.str.area = tmp->area; + smp->data.u.str.data = tmp->data; return 1; } @@ -260,12 +261,12 @@ static int da_haproxy_conv(const struct arg *args, struct sample *smp, void *pri char useragentbuf[1024] = { 0 }; int i; - if (global_deviceatlas.daset == 0 || smp->data.u.str.len == 0) { + if (global_deviceatlas.daset == 0 || smp->data.u.str.data == 0) { return 1; } - i = smp->data.u.str.len > sizeof(useragentbuf) ? sizeof(useragentbuf) : smp->data.u.str.len; - memcpy(useragentbuf, smp->data.u.str.str, i - 1); + i = smp->data.u.str.data > sizeof(useragentbuf) ? sizeof(useragentbuf) : smp->data.u.str.data; + memcpy(useragentbuf, smp->data.u.str.area, i - 1); useragentbuf[i - 1] = 0; useragent = (const char *)useragentbuf; diff --git a/src/dns.c b/src/dns.c index 77bf5c004..985ed0f33 100644 --- a/src/dns.c +++ b/src/dns.c @@ -87,7 +87,8 @@ struct dns_srvrq *new_dns_srvrq(struct server *srv, char *fqdn) int fqdn_len, hostname_dn_len; fqdn_len = strlen(fqdn); - hostname_dn_len = dns_str_to_dn_label(fqdn, fqdn_len + 1, trash.str, trash.size); + hostname_dn_len = dns_str_to_dn_label(fqdn, fqdn_len + 1, trash.area, + trash.size); if (hostname_dn_len == -1) { ha_alert("config : %s '%s', server '%s': failed to parse FQDN '%s'\n", proxy_type_str(px), px->id, srv->id, fqdn); @@ -102,7 +103,7 @@ struct dns_srvrq *new_dns_srvrq(struct server *srv, char *fqdn) srvrq->obj_type = OBJ_TYPE_SRVRQ; srvrq->proxy = px; srvrq->name = strdup(fqdn); - srvrq->hostname_dn = strdup(trash.str); + srvrq->hostname_dn = strdup(trash.area); srvrq->hostname_dn_len = hostname_dn_len; if (!srvrq->name || !srvrq->hostname_dn) { ha_alert("config : %s '%s', server '%s': out of memory\n", @@ -1678,15 +1679,15 @@ static void dns_resolve_send(struct dgram_conn *dgram) if (res->nb_queries == resolvers->nb_nameservers) continue; - trash.len = dns_build_query(res->query_id, res->query_type, + trash.data = dns_build_query(res->query_id, res->query_type, resolvers->accepted_payload_size, res->hostname_dn, res->hostname_dn_len, - trash.str, trash.size); - if (trash.len == -1) + trash.area, trash.size); + if (trash.data == -1) goto snd_error; - ret = send(fd, trash.str, trash.len, 0); - if (ret != trash.len) + ret = send(fd, trash.area, trash.data, 0); + if (ret != trash.data) goto snd_error; ns->counters.sent++; diff --git a/src/flt_http_comp.c b/src/flt_http_comp.c index 86d0866b2..bf8f81ae5 100644 --- a/src/flt_http_comp.c +++ b/src/flt_http_comp.c @@ -565,12 +565,14 @@ select_compression_response_header(struct comp_state *st, struct stream *s, stru * header. */ if (st->comp_algo->cfg_name_len != 8 || memcmp(st->comp_algo->cfg_name, "identity", 8) != 0) { - trash.len = 18; - memcpy(trash.str, "Content-Encoding: ", trash.len); - memcpy(trash.str + trash.len, st->comp_algo->ua_name, st->comp_algo->ua_name_len); - trash.len += st->comp_algo->ua_name_len; - trash.str[trash.len] = '\0'; - http_header_add_tail2(&txn->rsp, &txn->hdr_idx, trash.str, trash.len); + trash.data = 18; + memcpy(trash.area, "Content-Encoding: ", trash.data); + memcpy(trash.area + trash.data, st->comp_algo->ua_name, + st->comp_algo->ua_name_len); + trash.data += st->comp_algo->ua_name_len; + trash.area[trash.data] = '\0'; + http_header_add_tail2(&txn->rsp, &txn->hdr_idx, trash.area, + trash.data); } msg->flags |= HTTP_MSGF_COMPRESSING; return 1; @@ -977,8 +979,8 @@ smp_fetch_res_comp_algo(const struct arg *args, struct sample *smp, smp->data.type = SMP_T_STR; smp->flags = SMP_F_CONST; - smp->data.u.str.str = st->comp_algo->cfg_name; - smp->data.u.str.len = st->comp_algo->cfg_name_len; + smp->data.u.str.area = st->comp_algo->cfg_name; + smp->data.u.str.data = st->comp_algo->cfg_name_len; return 1; } return 0; diff --git a/src/flt_spoe.c b/src/flt_spoe.c index b0f25faf0..06125e208 100644 --- a/src/flt_spoe.c +++ b/src/flt_spoe.c @@ -437,20 +437,20 @@ spoe_prepare_hahello_frame(struct appctx *appctx, char *frame, size_t size) *p++ = SPOE_DATA_T_STR; chk = get_trash_chunk(); if (agent != NULL && (agent->flags & SPOE_FL_PIPELINING)) { - memcpy(chk->str, "pipelining", 10); - chk->len += 10; + memcpy(chk->area, "pipelining", 10); + chk->data += 10; } if (agent != NULL && (agent->flags & SPOE_FL_ASYNC)) { - if (chk->len) chk->str[chk->len++] = ','; - memcpy(chk->str+chk->len, "async", 5); - chk->len += 5; + if (chk->data) chk->area[chk->data++] = ','; + memcpy(chk->area+chk->data, "async", 5); + chk->data += 5; } if (agent != NULL && (agent->flags & SPOE_FL_RCV_FRAGMENTATION)) { - if (chk->len) chk->str[chk->len++] = ','; - memcpy(chk->str+chk->len, "fragmentation", 13); - chk->len += 5; + if (chk->data) chk->area[chk->data++] = ','; + memcpy(chk->area+chk->data, "fragmentation", 13); + chk->data += 5; } - if (spoe_encode_buffer(chk->str, chk->len, &p, end) == -1) + if (spoe_encode_buffer(chk->area, chk->data, &p, end) == -1) goto too_big; /* (optionnal) "engine-id" K/V item, if present */ @@ -1361,7 +1361,7 @@ spoe_handle_connect_appctx(struct appctx *appctx) /* 4 bytes are reserved at the beginning of to store the frame * length. */ - buf = trash.str; frame = buf+4; + buf = trash.area; frame = buf+4; ret = spoe_prepare_hahello_frame(appctx, frame, SPOE_APPCTX(appctx)->max_frame_size); if (ret > 1) @@ -1414,7 +1414,7 @@ spoe_handle_connecting_appctx(struct appctx *appctx) goto exit; } - frame = trash.str; trash.len = 0; + frame = trash.area; trash.data = 0; ret = spoe_recv_frame(appctx, frame, SPOE_APPCTX(appctx)->max_frame_size); if (ret > 1) { @@ -1422,7 +1422,7 @@ spoe_handle_connecting_appctx(struct appctx *appctx) appctx->st0 = SPOE_APPCTX_ST_DISCONNECTING; goto next; } - trash.len = ret + 4; + trash.data = ret + 4; ret = spoe_handle_agenthello_frame(appctx, frame, ret); } @@ -1450,8 +1450,8 @@ spoe_handle_connecting_appctx(struct appctx *appctx) next: /* Do not forget to remove processed frame from the output buffer */ - if (trash.len) - co_skip(si_oc(si), trash.len); + if (trash.data) + co_skip(si_oc(si), trash.data); SPOE_APPCTX(appctx)->task->expire = tick_add_ifset(now_ms, agent->timeout.idle); @@ -1474,7 +1474,7 @@ spoe_handle_sending_frame_appctx(struct appctx *appctx, int *skip) /* 4 bytes are reserved at the beginning of to store the frame * length. */ - buf = trash.str; frame = buf+4; + buf = trash.area; frame = buf+4; if (appctx->st0 == SPOE_APPCTX_ST_SENDING_FRAG_NOTIFY) { ctx = SPOE_APPCTX(appctx)->frag_ctx.ctx; @@ -1592,7 +1592,7 @@ spoe_handle_receiving_frame_appctx(struct appctx *appctx, int *skip) char *frame; int ret; - frame = trash.str; trash.len = 0; + frame = trash.area; trash.data = 0; ret = spoe_recv_frame(appctx, frame, SPOE_APPCTX(appctx)->max_frame_size); if (ret > 1) { @@ -1601,7 +1601,7 @@ spoe_handle_receiving_frame_appctx(struct appctx *appctx, int *skip) ret = -1; goto end; } - trash.len = ret + 4; + trash.data = ret + 4; ret = spoe_handle_agentack_frame(appctx, &ctx, frame, ret); } switch (ret) { @@ -1640,8 +1640,8 @@ spoe_handle_receiving_frame_appctx(struct appctx *appctx, int *skip) } /* Do not forget to remove processed frame from the output buffer */ - if (trash.len) - co_skip(si_oc(appctx->owner), trash.len); + if (trash.data) + co_skip(si_oc(appctx->owner), trash.data); end: return ret; } @@ -1756,7 +1756,7 @@ spoe_handle_disconnect_appctx(struct appctx *appctx) /* 4 bytes are reserved at the beginning of to store the frame * length. */ - buf = trash.str; frame = buf+4; + buf = trash.area; frame = buf+4; ret = spoe_prepare_hadiscon_frame(appctx, frame, SPOE_APPCTX(appctx)->max_frame_size); if (ret > 1) @@ -1810,11 +1810,11 @@ spoe_handle_disconnecting_appctx(struct appctx *appctx) goto exit; } - frame = trash.str; trash.len = 0; + frame = trash.area; trash.data = 0; ret = spoe_recv_frame(appctx, frame, SPOE_APPCTX(appctx)->max_frame_size); if (ret > 1) { - trash.len = ret + 4; + trash.data = ret + 4; ret = spoe_handle_agentdiscon_frame(appctx, frame, ret); } @@ -1846,8 +1846,8 @@ spoe_handle_disconnecting_appctx(struct appctx *appctx) next: /* Do not forget to remove processed frame from the output buffer */ - if (trash.len) - co_skip(si_oc(appctx->owner), trash.len); + if (trash.data) + co_skip(si_oc(appctx->owner), trash.data); return 0; stop: @@ -4141,12 +4141,12 @@ parse_spoe_flt(char **args, int *cur_arg, struct proxy *px, if (curagent->var_on_error) { struct arg arg; - trash.len = snprintf(trash.str, trash.size, "txn.%s.%s", + trash.data = snprintf(trash.area, trash.size, "txn.%s.%s", curagent->var_pfx, curagent->var_on_error); arg.type = ARGT_STR; - arg.data.str.str = trash.str; - arg.data.str.len = trash.len; + arg.data.str.area = trash.area; + arg.data.str.data = trash.data; if (!vars_check_arg(&arg, err)) { memprintf(err, "SPOE agent '%s': failed to register variable %s.%s (%s)", curagent->id, curagent->var_pfx, curagent->var_on_error, *err); @@ -4157,12 +4157,12 @@ parse_spoe_flt(char **args, int *cur_arg, struct proxy *px, if (curagent->var_t_process) { struct arg arg; - trash.len = snprintf(trash.str, trash.size, "txn.%s.%s", + trash.data = snprintf(trash.area, trash.size, "txn.%s.%s", curagent->var_pfx, curagent->var_t_process); arg.type = ARGT_STR; - arg.data.str.str = trash.str; - arg.data.str.len = trash.len; + arg.data.str.area = trash.area; + arg.data.str.data = trash.data; if (!vars_check_arg(&arg, err)) { memprintf(err, "SPOE agent '%s': failed to register variable %s.%s (%s)", curagent->id, curagent->var_pfx, curagent->var_t_process, *err); @@ -4173,12 +4173,12 @@ parse_spoe_flt(char **args, int *cur_arg, struct proxy *px, if (curagent->var_t_total) { struct arg arg; - trash.len = snprintf(trash.str, trash.size, "txn.%s.%s", + trash.data = snprintf(trash.area, trash.size, "txn.%s.%s", curagent->var_pfx, curagent->var_t_total); arg.type = ARGT_STR; - arg.data.str.str = trash.str; - arg.data.str.len = trash.len; + arg.data.str.area = trash.area; + arg.data.str.data = trash.data; if (!vars_check_arg(&arg, err)) { memprintf(err, "SPOE agent '%s': failed to register variable %s.%s (%s)", curagent->id, curagent->var_pfx, curagent->var_t_process, *err); @@ -4378,12 +4378,12 @@ parse_spoe_flt(char **args, int *cur_arg, struct proxy *px, list_for_each_entry_safe(vph, vphback, &curvars, list) { struct arg arg; - trash.len = snprintf(trash.str, trash.size, "proc.%s.%s", + trash.data = snprintf(trash.area, trash.size, "proc.%s.%s", curagent->var_pfx, vph->name); arg.type = ARGT_STR; - arg.data.str.str = trash.str; - arg.data.str.len = trash.len; + arg.data.str.area = trash.area; + arg.data.str.data = trash.data; if (!vars_check_arg(&arg, err)) { memprintf(err, "SPOE agent '%s': failed to register variable %s.%s (%s)", curagent->id, curagent->var_pfx, vph->name, *err); diff --git a/src/frontend.c b/src/frontend.c index 361499dba..65c696601 100644 --- a/src/frontend.c +++ b/src/frontend.c @@ -124,7 +124,7 @@ int frontend_accept(struct stream *s) break; } - shut_your_big_mouth_gcc(write(1, trash.str, trash.len)); + shut_your_big_mouth_gcc(write(1, trash.area, trash.data)); } if (fe->mode == PR_MODE_HTTP) @@ -184,13 +184,13 @@ smp_fetch_fe_id(const struct arg *args, struct sample *smp, const char *kw, void static int smp_fetch_fe_name(const struct arg *args, struct sample *smp, const char *kw, void *private) { - smp->data.u.str.str = (char *)smp->sess->fe->id; - if (!smp->data.u.str.str) + smp->data.u.str.area = (char *)smp->sess->fe->id; + if (!smp->data.u.str.area) return 0; smp->data.type = SMP_T_STR; smp->flags = SMP_F_CONST; - smp->data.u.str.len = strlen(smp->data.u.str.str); + smp->data.u.str.data = strlen(smp->data.u.str.area); return 1; } @@ -200,13 +200,13 @@ smp_fetch_fe_defbe(const struct arg *args, struct sample *smp, const char *kw, v { if (!smp->sess->fe->defbe.be) return 0; - smp->data.u.str.str = (char *)smp->sess->fe->defbe.be->id; - if (!smp->data.u.str.str) + smp->data.u.str.area = (char *)smp->sess->fe->defbe.be->id; + if (!smp->data.u.str.area) return 0; smp->data.type = SMP_T_STR; smp->flags = SMP_F_CONST; - smp->data.u.str.len = strlen(smp->data.u.str.str); + smp->data.u.str.data = strlen(smp->data.u.str.area); return 1; } diff --git a/src/haproxy.c b/src/haproxy.c index 768034ada..e0e8791f0 100644 --- a/src/haproxy.c +++ b/src/haproxy.c @@ -852,8 +852,8 @@ static void sig_dump_state(struct sig_handler *sh) p->id, s->id, (s->cur_state != SRV_ST_STOPPED) ? "UP" : "DOWN", s->cur_sess, s->nbpend, s->counters.cum_sess); - ha_warning("%s\n", trash.str); - send_log(p, LOG_NOTICE, "%s\n", trash.str); + ha_warning("%s\n", trash.area); + send_log(p, LOG_NOTICE, "%s\n", trash.area); s = s->next; } @@ -876,8 +876,8 @@ static void sig_dump_state(struct sig_handler *sh) p->id, p->srv_act, p->srv_bck, p->feconn, p->beconn, p->totpend, p->nbpend, p->fe_counters.cum_conn, p->be_counters.cum_conn); } - ha_warning("%s\n", trash.str); - send_log(p, LOG_NOTICE, "%s\n", trash.str); + ha_warning("%s\n", trash.area); + send_log(p, LOG_NOTICE, "%s\n", trash.area); p = p->next; } diff --git a/src/hlua.c b/src/hlua.c index 32cb66d13..9e43593b8 100644 --- a/src/hlua.c +++ b/src/hlua.c @@ -340,7 +340,7 @@ __LJMP static const char *hlua_traceback(lua_State *L) chunk_appendf(msg, " ..."); } - return msg->str; + return msg->area; } @@ -386,7 +386,7 @@ static int hlua_arg2lua(lua_State *L, const struct arg *arg) break; case ARGT_STR: - lua_pushlstring(L, arg->data.str.str, arg->data.str.len); + lua_pushlstring(L, arg->data.str.area, arg->data.str.data); break; case ARGT_IPV4: @@ -423,7 +423,7 @@ static int hlua_lua2arg(lua_State *L, int ud, struct arg *arg) case LUA_TSTRING: arg->type = ARGT_STR; - arg->data.str.str = (char *)lua_tolstring(L, ud, (size_t *)&arg->data.str.len); + arg->data.str.area = (char *)lua_tolstring(L, ud, (size_t *)&arg->data.str.data); break; case LUA_TUSERDATA: @@ -453,7 +453,7 @@ static int hlua_smp2lua(lua_State *L, struct sample *smp) case SMP_T_BIN: case SMP_T_STR: - lua_pushlstring(L, smp->data.u.str.str, smp->data.u.str.len); + lua_pushlstring(L, smp->data.u.str.area, smp->data.u.str.data); break; case SMP_T_METH: @@ -467,7 +467,7 @@ static int hlua_smp2lua(lua_State *L, struct sample *smp) case HTTP_METH_TRACE: lua_pushstring(L, "TRACE"); break; case HTTP_METH_CONNECT: lua_pushstring(L, "CONNECT"); break; case HTTP_METH_OTHER: - lua_pushlstring(L, smp->data.u.meth.str.str, smp->data.u.meth.str.len); + lua_pushlstring(L, smp->data.u.meth.str.area, smp->data.u.meth.str.data); break; default: lua_pushnil(L); @@ -480,7 +480,7 @@ static int hlua_smp2lua(lua_State *L, struct sample *smp) case SMP_T_ADDR: /* This type is never used to qualify a sample. */ if (sample_casts[smp->data.type][SMP_T_STR] && sample_casts[smp->data.type][SMP_T_STR](smp)) - lua_pushlstring(L, smp->data.u.str.str, smp->data.u.str.len); + lua_pushlstring(L, smp->data.u.str.area, smp->data.u.str.data); else lua_pushnil(L); break; @@ -501,7 +501,7 @@ static int hlua_smp2lua_str(lua_State *L, struct sample *smp) case SMP_T_BIN: case SMP_T_STR: - lua_pushlstring(L, smp->data.u.str.str, smp->data.u.str.len); + lua_pushlstring(L, smp->data.u.str.area, smp->data.u.str.data); break; case SMP_T_METH: @@ -515,7 +515,7 @@ static int hlua_smp2lua_str(lua_State *L, struct sample *smp) case HTTP_METH_TRACE: lua_pushstring(L, "TRACE"); break; case HTTP_METH_CONNECT: lua_pushstring(L, "CONNECT"); break; case HTTP_METH_OTHER: - lua_pushlstring(L, smp->data.u.meth.str.str, smp->data.u.meth.str.len); + lua_pushlstring(L, smp->data.u.meth.str.area, smp->data.u.meth.str.data); break; default: lua_pushstring(L, ""); @@ -530,7 +530,7 @@ static int hlua_smp2lua_str(lua_State *L, struct sample *smp) case SMP_T_ADDR: /* This type is never used to qualify a sample. */ if (sample_casts[smp->data.type][SMP_T_STR] && sample_casts[smp->data.type][SMP_T_STR](smp)) - lua_pushlstring(L, smp->data.u.str.str, smp->data.u.str.len); + lua_pushlstring(L, smp->data.u.str.area, smp->data.u.str.data); else lua_pushstring(L, ""); break; @@ -563,7 +563,7 @@ static int hlua_lua2smp(lua_State *L, int ud, struct sample *smp) case LUA_TSTRING: smp->data.type = SMP_T_STR; smp->flags |= SMP_F_CONST; - smp->data.u.str.str = (char *)lua_tolstring(L, ud, (size_t *)&smp->data.u.str.len); + smp->data.u.str.area = (char *)lua_tolstring(L, ud, (size_t *)&smp->data.u.str.data); break; case LUA_TUSERDATA: @@ -684,9 +684,10 @@ __LJMP int hlua_lua2arg_check(lua_State *L, int first, struct arg *argp, case ARGT_FE: if (argp[idx].type != ARGT_STR) WILL_LJMP(luaL_argerror(L, first + idx, "string expected")); - memcpy(trash.str, argp[idx].data.str.str, argp[idx].data.str.len); - trash.str[argp[idx].data.str.len] = 0; - argp[idx].data.prx = proxy_fe_by_name(trash.str); + memcpy(trash.area, argp[idx].data.str.area, + argp[idx].data.str.data); + trash.area[argp[idx].data.str.data] = 0; + argp[idx].data.prx = proxy_fe_by_name(trash.area); if (!argp[idx].data.prx) WILL_LJMP(luaL_argerror(L, first + idx, "frontend doesn't exist")); argp[idx].type = ARGT_FE; @@ -695,9 +696,10 @@ __LJMP int hlua_lua2arg_check(lua_State *L, int first, struct arg *argp, case ARGT_BE: if (argp[idx].type != ARGT_STR) WILL_LJMP(luaL_argerror(L, first + idx, "string expected")); - memcpy(trash.str, argp[idx].data.str.str, argp[idx].data.str.len); - trash.str[argp[idx].data.str.len] = 0; - argp[idx].data.prx = proxy_be_by_name(trash.str); + memcpy(trash.area, argp[idx].data.str.area, + argp[idx].data.str.data); + trash.area[argp[idx].data.str.data] = 0; + argp[idx].data.prx = proxy_be_by_name(trash.area); if (!argp[idx].data.prx) WILL_LJMP(luaL_argerror(L, first + idx, "backend doesn't exist")); argp[idx].type = ARGT_BE; @@ -706,9 +708,10 @@ __LJMP int hlua_lua2arg_check(lua_State *L, int first, struct arg *argp, case ARGT_TAB: if (argp[idx].type != ARGT_STR) WILL_LJMP(luaL_argerror(L, first + idx, "string expected")); - memcpy(trash.str, argp[idx].data.str.str, argp[idx].data.str.len); - trash.str[argp[idx].data.str.len] = 0; - argp[idx].data.prx = proxy_tbl_by_name(trash.str); + memcpy(trash.area, argp[idx].data.str.area, + argp[idx].data.str.data); + trash.area[argp[idx].data.str.data] = 0; + argp[idx].data.prx = proxy_tbl_by_name(trash.area); if (!argp[idx].data.prx) WILL_LJMP(luaL_argerror(L, first + idx, "table doesn't exist")); argp[idx].type = ARGT_TAB; @@ -717,18 +720,19 @@ __LJMP int hlua_lua2arg_check(lua_State *L, int first, struct arg *argp, case ARGT_SRV: if (argp[idx].type != ARGT_STR) WILL_LJMP(luaL_argerror(L, first + idx, "string expected")); - memcpy(trash.str, argp[idx].data.str.str, argp[idx].data.str.len); - trash.str[argp[idx].data.str.len] = 0; - sname = strrchr(trash.str, '/'); + memcpy(trash.area, argp[idx].data.str.area, + argp[idx].data.str.data); + trash.area[argp[idx].data.str.data] = 0; + sname = strrchr(trash.area, '/'); if (sname) { *sname++ = '\0'; - pname = trash.str; + pname = trash.area; px = proxy_be_by_name(pname); if (!px) WILL_LJMP(luaL_argerror(L, first + idx, "backend doesn't exist")); } else { - sname = trash.str; + sname = trash.area; px = p; } argp[idx].data.srv = findserver(px, sname); @@ -738,33 +742,37 @@ __LJMP int hlua_lua2arg_check(lua_State *L, int first, struct arg *argp, break; case ARGT_IPV4: - memcpy(trash.str, argp[idx].data.str.str, argp[idx].data.str.len); - trash.str[argp[idx].data.str.len] = 0; - if (inet_pton(AF_INET, trash.str, &argp[idx].data.ipv4)) + memcpy(trash.area, argp[idx].data.str.area, + argp[idx].data.str.data); + trash.area[argp[idx].data.str.data] = 0; + if (inet_pton(AF_INET, trash.area, &argp[idx].data.ipv4)) WILL_LJMP(luaL_argerror(L, first + idx, "invalid IPv4 address")); argp[idx].type = ARGT_IPV4; break; case ARGT_MSK4: - memcpy(trash.str, argp[idx].data.str.str, argp[idx].data.str.len); - trash.str[argp[idx].data.str.len] = 0; - if (!str2mask(trash.str, &argp[idx].data.ipv4)) + memcpy(trash.area, argp[idx].data.str.area, + argp[idx].data.str.data); + trash.area[argp[idx].data.str.data] = 0; + if (!str2mask(trash.area, &argp[idx].data.ipv4)) WILL_LJMP(luaL_argerror(L, first + idx, "invalid IPv4 mask")); argp[idx].type = ARGT_MSK4; break; case ARGT_IPV6: - memcpy(trash.str, argp[idx].data.str.str, argp[idx].data.str.len); - trash.str[argp[idx].data.str.len] = 0; - if (inet_pton(AF_INET6, trash.str, &argp[idx].data.ipv6)) + memcpy(trash.area, argp[idx].data.str.area, + argp[idx].data.str.data); + trash.area[argp[idx].data.str.data] = 0; + if (inet_pton(AF_INET6, trash.area, &argp[idx].data.ipv6)) WILL_LJMP(luaL_argerror(L, first + idx, "invalid IPv6 address")); argp[idx].type = ARGT_IPV6; break; case ARGT_MSK6: - memcpy(trash.str, argp[idx].data.str.str, argp[idx].data.str.len); - trash.str[argp[idx].data.str.len] = 0; - if (!str2mask6(trash.str, &argp[idx].data.ipv6)) + memcpy(trash.area, argp[idx].data.str.area, + argp[idx].data.str.data); + trash.area[argp[idx].data.str.data] = 0; + if (!str2mask6(trash.area, &argp[idx].data.ipv6)) WILL_LJMP(luaL_argerror(L, first + idx, "invalid IPv6 mask")); argp[idx].type = ARGT_MSK6; break; @@ -817,9 +825,9 @@ static inline void hlua_sendlog(struct proxy *px, int level, const char *msg) char *p; /* Cleanup the log message. */ - p = trash.str; + p = trash.area; for (; *msg != '\0'; msg++, p++) { - if (p >= trash.str + trash.size - 1) { + if (p >= trash.area + trash.size - 1) { /* Break the message if exceed the buffer size. */ *(p-4) = ' '; *(p-3) = '.'; @@ -834,12 +842,12 @@ static inline void hlua_sendlog(struct proxy *px, int level, const char *msg) } *p = '\0'; - send_log(px, level, "%s\n", trash.str); + send_log(px, level, "%s\n", trash.area); if (!(global.mode & MODE_QUIET) || (global.mode & (MODE_VERBOSE | MODE_STARTING))) { get_localtime(date.tv_sec, &tm); fprintf(stderr, "[%s] %03d/%02d%02d%02d (%d) : %s\n", log_levels[level], tm.tm_yday, tm.tm_hour, tm.tm_min, tm.tm_sec, - (int)getpid(), trash.str); + (int)getpid(), trash.area); fflush(stderr); } } @@ -1479,7 +1487,7 @@ __LJMP static int hlua_map_new(struct lua_State *L) /* fill fake args. */ args[0].type = ARGT_STR; - args[0].data.str.str = (char *)fn; + args[0].data.str.area = (char *)fn; args[1].type = ARGT_STOP; /* load the map. */ @@ -1522,7 +1530,7 @@ __LJMP static inline int _hlua_map_lookup(struct lua_State *L, int str) else { smp.data.type = SMP_T_STR; smp.flags = SMP_F_CONST; - smp.data.u.str.str = (char *)MAY_LJMP(luaL_checklstring(L, 2, (size_t *)&smp.data.u.str.len)); + smp.data.u.str.area = (char *)MAY_LJMP(luaL_checklstring(L, 2, (size_t *)&smp.data.u.str.data)); } pat = pattern_exec_match(&desc->pat, &smp, 1); @@ -1535,7 +1543,7 @@ __LJMP static inline int _hlua_map_lookup(struct lua_State *L, int str) } /* The Lua pattern must return a string, so we can't check the returned type */ - lua_pushlstring(L, pat->data->u.str.str, pat->data->u.str.len); + lua_pushlstring(L, pat->data->u.str.area, pat->data->u.str.data); return 1; } @@ -3041,7 +3049,7 @@ __LJMP static int hlua_channel_send_yield(lua_State *L, int status, lua_KContext * detects a non contiguous buffer and realign it. */ if (ci_space_for_replace(chn) < max) - channel_slow_realign(chn, trash.str); + channel_slow_realign(chn, trash.area); /* Copy input data in the buffer. */ max = b_rep_blk(&chn->buf, ci_head(chn), ci_head(chn), str + l, max); @@ -3279,7 +3287,7 @@ __LJMP static int hlua_run_sample_fetch(lua_State *L) hlua_lua2arg(L, i + 2, &args[i]); } args[i].type = ARGT_STOP; - args[i].data.str.str = NULL; + args[i].data.str.area = NULL; /* Check arguments. */ MAY_LJMP(hlua_lua2arg_check(L, 2, args, f->arg_mask, hsmp->p)); @@ -3385,7 +3393,7 @@ __LJMP static int hlua_run_sample_conv(lua_State *L) hlua_lua2arg(L, i + 3, &args[i]); } args[i].type = ARGT_STOP; - args[i].data.str.str = NULL; + args[i].data.str.area = NULL; /* Check arguments. */ MAY_LJMP(hlua_lua2arg_check(L, 3, args, conv->arg_mask, hsmp->p)); @@ -4533,16 +4541,17 @@ __LJMP static int hlua_applet_http_start_response(lua_State *L) value = lua_tolstring(L, -1, &value_len); /* Catenate a new header. */ - if (tmp->len + name_len + 2 + value_len + 2 < tmp->size) { - memcpy(tmp->str + tmp->len, name, name_len); - tmp->len += name_len; - tmp->str[tmp->len++] = ':'; - tmp->str[tmp->len++] = ' '; + if (tmp->data + name_len + 2 + value_len + 2 < tmp->size) { + memcpy(tmp->area + tmp->data, name, name_len); + tmp->data += name_len; + tmp->area[tmp->data++] = ':'; + tmp->area[tmp->data++] = ' '; - memcpy(tmp->str + tmp->len, value, value_len); - tmp->len += value_len; - tmp->str[tmp->len++] = '\r'; - tmp->str[tmp->len++] = '\n'; + memcpy(tmp->area + tmp->data, value, + value_len); + tmp->data += value_len; + tmp->area[tmp->data++] = '\r'; + tmp->area[tmp->data++] = '\n'; } /* Protocol checks. */ @@ -4591,7 +4600,7 @@ __LJMP static int hlua_applet_http_start_response(lua_State *L) lua_pop(L, 2); /* Push the headers block. */ - lua_pushlstring(L, tmp->str, tmp->len); + lua_pushlstring(L, tmp->area, tmp->data); return MAY_LJMP(hlua_applet_http_start_response_yield(L, 0, 0)); } @@ -4705,7 +4714,7 @@ __LJMP static int hlua_http_get_headers(lua_State *L, struct hlua_txn *htxn, str * the size of one buffer and the input data contains in one * buffer. */ - out = trash.str; + out = trash.area; for (in=hn; in trash.size) + trash.data = value_len + name_len + 2; + if (trash.data > trash.size) return 0; /* Creates the header string. */ - p = trash.str; + p = trash.area; memcpy(p, name, name_len); p += name_len; *p = ':'; @@ -4904,7 +4913,7 @@ __LJMP static inline int hlua_http_add_hdr(lua_State *L, struct hlua_txn *htxn, memcpy(p, value, value_len); lua_pushboolean(L, http_header_add_tail2(msg, &htxn->s->txn->hdr_idx, - trash.str, trash.len) != 0); + trash.area, trash.data) != 0); return 0; } @@ -5006,11 +5015,12 @@ static int hlua_http_req_set_query(lua_State *L) /* Add the mark question as prefix. */ chunk_reset(&trash); - trash.str[trash.len++] = '?'; - memcpy(trash.str + trash.len, name, name_len); - trash.len += name_len; + trash.area[trash.data++] = '?'; + memcpy(trash.area + trash.data, name, name_len); + trash.data += name_len; - lua_pushboolean(L, http_replace_req_line(2, trash.str, trash.len, htxn->p, htxn->s) != -1); + lua_pushboolean(L, + http_replace_req_line(2, trash.area, trash.data, htxn->p, htxn->s) != -1); return 1; } @@ -5837,7 +5847,7 @@ static int hlua_sample_fetch_wrapper(const struct arg *arg_p, struct sample *smp struct hlua_function *fcn = private; struct stream *stream = smp->strm; const char *error; - const struct chunk msg = { .len = 0 }; + const struct chunk msg = { }; if (!stream) return 0; @@ -6106,7 +6116,7 @@ static enum act_return hlua_action(struct act_rule *rule, struct proxy *px, unsigned int analyzer; int dir; const char *error; - const struct chunk msg = { .len = 0 }; + const struct chunk msg = { }; switch (rule->from) { case ACT_F_TCP_REQ_CNT: analyzer = AN_REQ_INSPECT_FE ; dir = SMP_OPT_DIR_REQ; break; @@ -7654,8 +7664,8 @@ void hlua_init(void) for (i=0; ikw, trash.size); - trash.str[trash.size - 1] = '\0'; - for (p = trash.str; *p; p++) + strncpy(trash.area, sf->kw, trash.size); + trash.area[trash.size - 1] = '\0'; + for (p = trash.area; *p; p++) if (*p == '.' || *p == '-' || *p == '+') *p = '_'; /* Register the function. */ - lua_pushstring(gL.T, trash.str); + lua_pushstring(gL.T, trash.area); lua_pushlightuserdata(gL.T, sf); lua_pushcclosure(gL.T, hlua_run_sample_fetch, 1); lua_rawset(gL.T, -3); @@ -7792,14 +7802,14 @@ void hlua_init(void) /* gL.Tua doesn't support '.' and '-' in the function names, replace it * by an underscore. */ - strncpy(trash.str, sc->kw, trash.size); - trash.str[trash.size - 1] = '\0'; - for (p = trash.str; *p; p++) + strncpy(trash.area, sc->kw, trash.size); + trash.area[trash.size - 1] = '\0'; + for (p = trash.area; *p; p++) if (*p == '.' || *p == '-' || *p == '+') *p = '_'; /* Register the function. */ - lua_pushstring(gL.T, trash.str); + lua_pushstring(gL.T, trash.area); lua_pushlightuserdata(gL.T, sc); lua_pushcclosure(gL.T, hlua_run_sample_conv, 1); lua_rawset(gL.T, -3); diff --git a/src/hlua_fcn.c b/src/hlua_fcn.c index 83153c5cd..bc32401e7 100644 --- a/src/hlua_fcn.c +++ b/src/hlua_fcn.c @@ -1204,9 +1204,9 @@ static int hlua_regex_exec(struct lua_State *L) lua_pushboolean(L, 0); return 1; } - memcpy(tmp->str, str, len); + memcpy(tmp->area, str, len); - lua_pushboolean(L, regex_exec2(regex, tmp->str, len)); + lua_pushboolean(L, regex_exec2(regex, tmp->area, len)); return 1; } @@ -1232,9 +1232,9 @@ static int hlua_regex_match(struct lua_State *L) lua_pushboolean(L, 0); return 1; } - memcpy(tmp->str, str, len); + memcpy(tmp->area, str, len); - ret = regex_exec_match2(regex, tmp->str, len, 20, pmatch, 0); + ret = regex_exec_match2(regex, tmp->area, len, 20, pmatch, 0); lua_pushboolean(L, ret); lua_newtable(L); if (ret) { diff --git a/src/hpack-dec.c b/src/hpack-dec.c index 7c3605b68..7c4147be0 100644 --- a/src/hpack-dec.c +++ b/src/hpack-dec.c @@ -126,12 +126,12 @@ static inline struct ist hpack_alloc_string(struct chunk *store, int idx, struct if (unlikely(!out.ptr)) return out; - if (unlikely(store->len + out.len > store->size)) { + if (unlikely(store->data + out.len > store->size)) { out.ptr = NULL; return out; } - store->len += out.len; + store->data += out.len; memcpy(out.ptr, in.ptr, out.len); return out; } @@ -277,7 +277,8 @@ int hpack_decode_frame(struct hpack_dht *dht, const uint8_t *raw, uint32_t len, goto leave; } - nlen = huff_dec((const uint8_t *)name.ptr, name.len, ntrash, tmp->size - tmp->len); + nlen = huff_dec((const uint8_t *)name.ptr, name.len, ntrash, + tmp->size - tmp->data); if (nlen == (uint32_t)-1) { hpack_debug_printf("2: can't decode huffman.\n"); ret = -HPACK_ERR_HUFFMAN; @@ -285,7 +286,7 @@ int hpack_decode_frame(struct hpack_dht *dht, const uint8_t *raw, uint32_t len, } hpack_debug_printf(" [name huff %d->%d] ", (int)name.len, (int)nlen); - tmp->len += nlen; // make room for the value + tmp->data += nlen; // make room for the value name = ist2(ntrash, nlen); } @@ -317,7 +318,8 @@ int hpack_decode_frame(struct hpack_dht *dht, const uint8_t *raw, uint32_t len, goto leave; } - vlen = huff_dec((const uint8_t *)value.ptr, value.len, vtrash, tmp->size - tmp->len); + vlen = huff_dec((const uint8_t *)value.ptr, value.len, vtrash, + tmp->size - tmp->data); if (vlen == (uint32_t)-1) { hpack_debug_printf("3: can't decode huffman.\n"); ret = -HPACK_ERR_HUFFMAN; @@ -325,7 +327,7 @@ int hpack_decode_frame(struct hpack_dht *dht, const uint8_t *raw, uint32_t len, } hpack_debug_printf(" [value huff %d->%d] ", (int)value.len, (int)vlen); - tmp->len += vlen; // make room for the value + tmp->data += vlen; // make room for the value value = ist2(vtrash, vlen); } @@ -386,15 +388,17 @@ int hpack_decode_frame(struct hpack_dht *dht, const uint8_t *raw, uint32_t len, goto leave; } - vlen = huff_dec((const uint8_t *)value.ptr, value.len, vtrash, tmp->size - tmp->len); + vlen = huff_dec((const uint8_t *)value.ptr, value.len, vtrash, + tmp->size - tmp->data); if (vlen == (uint32_t)-1) { hpack_debug_printf("##ERR@%d## can't decode huffman : ilen=%d osize=%d\n", - __LINE__, (int)value.len, (int)(tmp->size - tmp->len)); + __LINE__, (int)value.len, + (int)(tmp->size - tmp->data)); hpack_debug_hexdump(stderr, "[HUFFMAN] ", value.ptr, 0, value.len); ret = -HPACK_ERR_HUFFMAN; goto leave; } - tmp->len += vlen; // make room for the value + tmp->data += vlen; // make room for the value value = ist2(vtrash, vlen); } @@ -436,10 +440,11 @@ int hpack_decode_frame(struct hpack_dht *dht, const uint8_t *raw, uint32_t len, } hpack_debug_printf("\e[1;34m%s\e[0m: ", - name.ptr ? istpad(trash.str, name).ptr : h2_phdr_to_str(name.len)); + name.ptr ? istpad(trash.area, name).ptr : h2_phdr_to_str(name.len)); hpack_debug_printf("\e[1;35m%s\e[0m [mustidx=%d, used=%d] [n=(%p,%d) v=(%p,%d)]\n", - istpad(trash.str, value).ptr, must_index, dht->used, + istpad(trash.area, value).ptr, must_index, + dht->used, name.ptr, (int)name.len, value.ptr, (int)value.len); } diff --git a/src/hpack-enc.c b/src/hpack-enc.c index d1f68c582..c6bfce764 100644 --- a/src/hpack-enc.c +++ b/src/hpack-enc.c @@ -78,7 +78,7 @@ static inline int hpack_encode_len(char *out, int pos, int len) */ int hpack_encode_header(struct chunk *out, const struct ist n, const struct ist v) { - int len = out->len; + int len = out->data; int size = out->size; if (len >= size) @@ -89,28 +89,28 @@ int hpack_encode_header(struct chunk *out, const struct ist n, const struct ist * compiler factor out the common sizes. */ if (isteq(n, ist("date"))) - out->str[len++] = 0x61; // literal with indexing -- name="date" (idx 33) + out->area[len++] = 0x61; // literal with indexing -- name="date" (idx 33) else if (isteq(n, ist("etag"))) - out->str[len++] = 0x62; // literal with indexing -- name="etag" (idx 34) + out->area[len++] = 0x62; // literal with indexing -- name="etag" (idx 34) else if (isteq(n, ist("server"))) - out->str[len++] = 0x76; // literal with indexing -- name="server" (idx 54) + out->area[len++] = 0x76; // literal with indexing -- name="server" (idx 54) else if (isteq(n, ist("location"))) - out->str[len++] = 0x6e; // literal with indexing -- name="location" (idx 46) + out->area[len++] = 0x6e; // literal with indexing -- name="location" (idx 46) else if (isteq(n, ist("content-type"))) - out->str[len++] = 0x5f; // literal with indexing -- name="content-type" (idx 31) + out->area[len++] = 0x5f; // literal with indexing -- name="content-type" (idx 31) else if (isteq(n, ist("last-modified"))) - out->str[len++] = 0x6c; // literal with indexing -- name="last-modified" (idx 44) + out->area[len++] = 0x6c; // literal with indexing -- name="last-modified" (idx 44) else if (isteq(n, ist("accept-ranges"))) - out->str[len++] = 0x51; // literal with indexing -- name="accept-ranges" (idx 17) + out->area[len++] = 0x51; // literal with indexing -- name="accept-ranges" (idx 17) else if (isteq(n, ist("cache-control"))) - out->str[len++] = 0x58; // literal with indexing -- name="cache-control" (idx 24) + out->area[len++] = 0x58; // literal with indexing -- name="cache-control" (idx 24) else if (isteq(n, ist("content-length"))) - out->str[len++] = 0x5c; // literal with indexing -- name="content-length" (idx 28) + out->area[len++] = 0x5c; // literal with indexing -- name="content-length" (idx 28) else if (len_to_bytes(n.len) && len + len_to_bytes(n.len) + n.len <= size) { - out->str[len++] = 0x00; /* literal without indexing -- new name */ + out->area[len++] = 0x00; /* literal without indexing -- new name */ - len = hpack_encode_len(out->str, len, n.len); - memcpy(out->str + len, n.ptr, n.len); + len = hpack_encode_len(out->area, len, n.len); + memcpy(out->area + len, n.ptr, n.len); len += n.len; } else { @@ -124,10 +124,10 @@ int hpack_encode_header(struct chunk *out, const struct ist n, const struct ist return 0; } - len = hpack_encode_len(out->str, len, v.len); - memcpy(out->str + len, v.ptr, v.len); + len = hpack_encode_len(out->area, len, v.len); + memcpy(out->area + len, v.ptr, v.len); len += v.len; - out->len = len; + out->data = len; return 1; } diff --git a/src/log.c b/src/log.c index b2d4367f4..899266c2f 100644 --- a/src/log.c +++ b/src/log.c @@ -57,15 +57,15 @@ static const struct log_fmt log_formats[LOG_FORMATS] = { [LOG_FORMAT_RFC3164] = { .name = "rfc3164", .pid = { - .sep1 = { .str = "[", .len = 1 }, - .sep2 = { .str = "]: ", .len = 3 } + .sep1 = { .area = "[", .data = 1 }, + .sep2 = { .area = "]: ", .data = 3 } } }, [LOG_FORMAT_RFC5424] = { .name = "rfc5424", .pid = { - .sep1 = { .str = " ", .len = 1 }, - .sep2 = { .str = " - ", .len = 3 } + .sep1 = { .area = " ", .data = 1 }, + .sep2 = { .area = " - ", .data = 3 } } } }; @@ -1013,8 +1013,8 @@ static char *lf_encode_chunk(char *start, char *stop, if (node->options & LOG_OPT_ESC) { if (start < stop) { - str = chunk->str; - end = chunk->str + chunk->len; + str = chunk->area; + end = chunk->area + chunk->data; stop--; /* reserve one byte for the final '\0' */ while (start < stop && str < end) { @@ -1158,7 +1158,7 @@ static char *update_log_hdr(const time_t time) { static THREAD_LOCAL long tvsec; static THREAD_LOCAL char *dataptr = NULL; /* backup of last end of header, NULL first time */ - static THREAD_LOCAL struct chunk host = { NULL, 0, 0 }; + static THREAD_LOCAL struct chunk host = { }; static THREAD_LOCAL int sep = 0; if (unlikely(time != tvsec || dataptr == NULL)) { @@ -1169,17 +1169,17 @@ static char *update_log_hdr(const time_t time) tvsec = time; get_localtime(tvsec, &tm); - if (unlikely(global.log_send_hostname != host.str)) { - host.str = global.log_send_hostname; - host.len = host.str ? strlen(host.str) : 0; - sep = host.len ? 1 : 0; + if (unlikely(global.log_send_hostname != host.area)) { + host.area = global.log_send_hostname; + host.data = host.area ? strlen(host.area) : 0; + sep = host.data ? 1 : 0; } hdr_len = snprintf(logheader, global.max_syslog_len, "<<<<>%s %2d %02d:%02d:%02d %.*s%*s", monthname[tm.tm_mon], tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec, - host.len, host.str, sep, ""); + (int)host.data, host.area, sep, ""); /* WARNING: depending upon implementations, snprintf may return * either -1 or the number of bytes that would be needed to store * the total message. In both cases, we must adjust it. @@ -1297,7 +1297,7 @@ void __send_log(struct proxy *p, int level, char *message, size_t size, char *sd if (!LIST_ISEMPTY(&p->logsrvs)) { logsrvs = &p->logsrvs; } - if (p->log_tag.str) { + if (p->log_tag.area) { tag = &p->log_tag; } } @@ -1401,7 +1401,7 @@ void __send_log(struct proxy *p, int level, char *message, size_t size, char *sd maxlen = logsrv->maxlen - hdr_max; /* tag */ - tag_max = tag->len; + tag_max = tag->data; if (unlikely(tag_max >= maxlen)) { tag_max = maxlen - 1; sd_max = 0; @@ -1411,18 +1411,18 @@ void __send_log(struct proxy *p, int level, char *message, size_t size, char *sd maxlen -= tag_max; /* first pid separator */ - pid_sep1_max = log_formats[logsrv->format].pid.sep1.len; + pid_sep1_max = log_formats[logsrv->format].pid.sep1.data; if (unlikely(pid_sep1_max >= maxlen)) { pid_sep1_max = maxlen - 1; sd_max = 0; goto send; } - pid_sep1 = log_formats[logsrv->format].pid.sep1.str; + pid_sep1 = log_formats[logsrv->format].pid.sep1.area; maxlen -= pid_sep1_max; /* pid */ - pid_max = pid.len; + pid_max = pid.data; if (unlikely(pid_max >= maxlen)) { pid_max = maxlen - 1; sd_max = 0; @@ -1432,14 +1432,14 @@ void __send_log(struct proxy *p, int level, char *message, size_t size, char *sd maxlen -= pid_max; /* second pid separator */ - pid_sep2_max = log_formats[logsrv->format].pid.sep2.len; + pid_sep2_max = log_formats[logsrv->format].pid.sep2.data; if (unlikely(pid_sep2_max >= maxlen)) { pid_sep2_max = maxlen - 1; sd_max = 0; goto send; } - pid_sep2 = log_formats[logsrv->format].pid.sep2.str; + pid_sep2 = log_formats[logsrv->format].pid.sep2.area; maxlen -= pid_sep2_max; /* structured-data */ @@ -1452,11 +1452,11 @@ void __send_log(struct proxy *p, int level, char *message, size_t size, char *sd send: iovec[0].iov_base = hdr_ptr; iovec[0].iov_len = hdr_max; - iovec[1].iov_base = tag->str; + iovec[1].iov_base = tag->area; iovec[1].iov_len = tag_max; iovec[2].iov_base = pid_sep1; iovec[2].iov_len = pid_sep1_max; - iovec[3].iov_base = pid.str; + iovec[3].iov_base = pid.area; iovec[3].iov_len = pid_max; iovec[4].iov_base = pid_sep2; iovec[4].iov_len = pid_sep2_max; @@ -1606,7 +1606,7 @@ int build_logline(struct stream *s, char *dst, size_t maxsize, struct list *list struct connection *conn; const char *src = NULL; struct sample *key; - const struct chunk empty = { NULL, 0, 0 }; + const struct chunk empty = { }; switch (tmp->type) { case LOG_FMT_SEPARATOR: @@ -1635,7 +1635,11 @@ int build_logline(struct stream *s, char *dst, size_t maxsize, struct list *list ret = lf_encode_chunk(tmplog, dst + maxsize, '%', http_encode_map, key ? &key->data.u.str : &empty, tmp); else - ret = lf_text_len(tmplog, key ? key->data.u.str.str : NULL, key ? key->data.u.str.len : 0, dst + maxsize - tmplog, tmp); + ret = lf_text_len(tmplog, + key ? key->data.u.str.area : NULL, + key ? key->data.u.str.data : 0, + dst + maxsize - tmplog, + tmp); if (ret == 0) goto out; tmplog = ret; @@ -2278,11 +2282,11 @@ int build_logline(struct stream *s, char *dst, size_t maxsize, struct list *list spc++; if (!txn || !txn->uri || nspaces == 0) { - chunk.str = ""; - chunk.len = strlen(""); + chunk.area = ""; + chunk.data = strlen(""); } else { - chunk.str = uri; - chunk.len = spc - uri; + chunk.area = uri; + chunk.data = spc - uri; } ret = lf_encode_chunk(tmplog, dst + maxsize, '#', url_encode_map, &chunk, tmp); @@ -2301,8 +2305,8 @@ int build_logline(struct stream *s, char *dst, size_t maxsize, struct list *list LOGCHAR('"'); if (!txn || !txn->uri) { - chunk.str = ""; - chunk.len = strlen(""); + chunk.area = ""; + chunk.data = strlen(""); } else { uri = txn->uri; end = uri + strlen(uri); @@ -2315,8 +2319,8 @@ int build_logline(struct stream *s, char *dst, size_t maxsize, struct list *list while (uri < end && !HTTP_IS_SPHT(*uri)) uri++; - chunk.str = qmark; - chunk.len = uri - qmark; + chunk.area = qmark; + chunk.data = uri - qmark; } ret = lf_encode_chunk(tmplog, dst + maxsize, '#', url_encode_map, &chunk, tmp); @@ -2352,11 +2356,11 @@ int build_logline(struct stream *s, char *dst, size_t maxsize, struct list *list spc++; if (!txn || !txn->uri || nspaces == 0) { - chunk.str = ""; - chunk.len = strlen(""); + chunk.area = ""; + chunk.data = strlen(""); } else { - chunk.str = uri; - chunk.len = spc - uri; + chunk.area = uri; + chunk.data = spc - uri; } ret = lf_encode_chunk(tmplog, dst + maxsize, '#', url_encode_map, &chunk, tmp); @@ -2382,11 +2386,11 @@ int build_logline(struct stream *s, char *dst, size_t maxsize, struct list *list spc++; if (spc == end) { // odd case, we have txn->uri, but we only got a verb - chunk.str = ""; - chunk.len = strlen(""); + chunk.area = ""; + chunk.data = strlen(""); } else { - chunk.str = uri; - chunk.len = spc - uri; + chunk.area = uri; + chunk.data = spc - uri; } ret = lf_encode_chunk(tmplog, dst + maxsize, '#', url_encode_map, &chunk, tmp); @@ -2424,14 +2428,14 @@ int build_logline(struct stream *s, char *dst, size_t maxsize, struct list *list uri++; if (!txn || !txn->uri || nspaces == 0) { - chunk.str = ""; - chunk.len = strlen(""); + chunk.area = ""; + chunk.data = strlen(""); } else if (uri == end) { - chunk.str = "HTTP/0.9"; - chunk.len = strlen("HTTP/0.9"); + chunk.area = "HTTP/0.9"; + chunk.data = strlen("HTTP/0.9"); } else { - chunk.str = uri; - chunk.len = end - uri; + chunk.area = uri; + chunk.data = end - uri; } ret = lf_encode_chunk(tmplog, dst + maxsize, '#', url_encode_map, &chunk, tmp); diff --git a/src/map.c b/src/map.c index 0f1b75476..64f2388d5 100644 --- a/src/map.c +++ b/src/map.c @@ -57,9 +57,9 @@ int map_parse_ip(const char *text, struct sample_data *data) */ int map_parse_str(const char *text, struct sample_data *data) { - data->u.str.str = (char *)text; - data->u.str.len = strlen(text); - data->u.str.size = data->u.str.len + 1; + data->u.str.area = (char *)text; + data->u.str.data = strlen(text); + data->u.str.size = data->u.str.data + 1; data->type = SMP_T_STR; return 1; } @@ -138,7 +138,7 @@ int sample_load_map(struct arg *arg, struct sample_conv *conv, } /* Load map. */ - if (!pattern_read_from_file(&desc->pat, PAT_REF_MAP, arg[0].data.str.str, PAT_MF_NO_DNS, + if (!pattern_read_from_file(&desc->pat, PAT_REF_MAP, arg[0].data.str.area, PAT_MF_NO_DNS, 1, err, file, line)) return 0; @@ -147,8 +147,9 @@ int sample_load_map(struct arg *arg, struct sample_conv *conv, */ if (desc->conv->out_type == SMP_T_ADDR) { struct sample_data data; - if (!map_parse_ip(arg[1].data.str.str, &data)) { - memprintf(err, "map: cannot parse default ip <%s>.", arg[1].data.str.str); + if (!map_parse_ip(arg[1].data.str.area, &data)) { + memprintf(err, "map: cannot parse default ip <%s>.", + arg[1].data.str.area); return 0; } if (data.type == SMP_T_IPV4) { @@ -185,10 +186,11 @@ static int sample_conv_map(const struct arg *arg_p, struct sample *smp, void *pr /* In the regm case, merge the sample with the input. */ if ((long)private == PAT_MATCH_REGM) { str = get_trash_chunk(); - str->len = exp_replace(str->str, str->size, smp->data.u.str.str, - pat->data->u.str.str, + str->data = exp_replace(str->area, str->size, + smp->data.u.str.area, + pat->data->u.str.area, (regmatch_t *)smp->ctx.a[0]); - if (str->len == -1) + if (str->data == -1) return 0; smp->data.u.str = *str; return 1; @@ -463,8 +465,8 @@ static int cli_io_handler_map_lookup(struct appctx *appctx) /* execute pattern matching */ sample.data.type = SMP_T_STR; sample.flags = SMP_F_CONST; - sample.data.u.str.len = appctx->ctx.map.chunk.len; - sample.data.u.str.str = appctx->ctx.map.chunk.str; + sample.data.u.str.data = appctx->ctx.map.chunk.data; + sample.data.u.str.area = appctx->ctx.map.chunk.area; if (appctx->ctx.map.expr->pat_head->match && sample_convert(&sample, appctx->ctx.map.expr->pat_head->expect_type)) @@ -560,8 +562,8 @@ static int cli_io_handler_map_lookup(struct appctx *appctx) static void cli_release_mlook(struct appctx *appctx) { - free(appctx->ctx.map.chunk.str); - appctx->ctx.map.chunk.str = NULL; + free(appctx->ctx.map.chunk.area); + appctx->ctx.map.chunk.area = NULL; } @@ -607,10 +609,10 @@ static int cli_parse_get_map(char **args, char *payload, struct appctx *appctx, * it may be used over multiple iterations. It's released * at the end and upon abort anyway. */ - appctx->ctx.map.chunk.len = strlen(args[3]); - appctx->ctx.map.chunk.size = appctx->ctx.map.chunk.len + 1; - appctx->ctx.map.chunk.str = strdup(args[3]); - if (!appctx->ctx.map.chunk.str) { + appctx->ctx.map.chunk.data = strlen(args[3]); + appctx->ctx.map.chunk.size = appctx->ctx.map.chunk.data + 1; + appctx->ctx.map.chunk.area = strdup(args[3]); + if (!appctx->ctx.map.chunk.area) { appctx->ctx.cli.severity = LOG_ERR; appctx->ctx.cli.msg = "Out of memory error.\n"; appctx->st0 = CLI_ST_PRINT; diff --git a/src/memory.c b/src/memory.c index 2d1a5e731..9feadd170 100644 --- a/src/memory.c +++ b/src/memory.c @@ -394,7 +394,7 @@ void dump_pools_to_trash() void dump_pools(void) { dump_pools_to_trash(); - qfprintf(stderr, "%s", trash.str); + qfprintf(stderr, "%s", trash.area); } /* This function returns the total number of failed pool allocations */ diff --git a/src/mux_h2.c b/src/mux_h2.c index 35c78654f..92f509019 100644 --- a/src/mux_h2.c +++ b/src/mux_h2.c @@ -727,8 +727,8 @@ static int h2c_snd_settings(struct h2c *h2c) chunk_memcat(&buf, str, 6); } - h2_set_frame_size(buf.str, buf.len - 9); - ret = b_istput(res, ist2(buf.str, buf.len)); + h2_set_frame_size(buf.area, buf.data - 9); + ret = b_istput(res, ist2(buf.area, buf.data)); if (unlikely(ret <= 0)) { if (!ret) { h2c->flags |= H2_CF_MUX_MFULL; @@ -2643,9 +2643,9 @@ static int h2_frt_decode_headers(struct h2s *h2s, struct buffer *buf, int count, h2c_error(h2c, H2_ERR_INTERNAL_ERROR); goto fail; } - memcpy(copy->str, b_head(&h2c->dbuf), wrap); - memcpy(copy->str + wrap, b_orig(&h2c->dbuf), h2c->dfl - wrap); - hdrs = (uint8_t *)copy->str; + memcpy(copy->area, b_head(&h2c->dbuf), wrap); + memcpy(copy->area + wrap, b_orig(&h2c->dbuf), h2c->dfl - wrap); + hdrs = (uint8_t *) copy->area; } /* The padlen is the first byte before data, and the padding appears @@ -2699,7 +2699,7 @@ static int h2_frt_decode_headers(struct h2s *h2s, struct buffer *buf, int count, /* it doesn't fit and the buffer is fragmented, * so let's defragment it and try again. */ - b_slow_realign(buf, trash.str, 0); + b_slow_realign(buf, trash.area, 0); } try = b_contig_space(buf); @@ -2994,14 +2994,14 @@ static size_t h2s_frt_make_resp_headers(struct h2s *h2s, const struct buffer *bu chunk_reset(&outbuf); while (1) { - outbuf.str = b_tail(&h2c->mbuf); + outbuf.area = b_tail(&h2c->mbuf); outbuf.size = b_contig_space(&h2c->mbuf); - outbuf.len = 0; + outbuf.data = 0; if (outbuf.size >= 9 || !b_space_wraps(&h2c->mbuf)) break; realign_again: - b_slow_realign(&h2c->mbuf, trash.str, b_data(&h2c->mbuf)); + b_slow_realign(&h2c->mbuf, trash.area, b_data(&h2c->mbuf)); } if (outbuf.size < 9) { @@ -3012,28 +3012,28 @@ static size_t h2s_frt_make_resp_headers(struct h2s *h2s, const struct buffer *bu } /* len: 0x000000 (fill later), type: 1(HEADERS), flags: ENDH=4 */ - memcpy(outbuf.str, "\x00\x00\x00\x01\x04", 5); - write_n32(outbuf.str + 5, h2s->id); // 4 bytes - outbuf.len = 9; + memcpy(outbuf.area, "\x00\x00\x00\x01\x04", 5); + write_n32(outbuf.area + 5, h2s->id); // 4 bytes + outbuf.data = 9; /* encode status, which necessarily is the first one */ - if (outbuf.len < outbuf.size && h1m->status == 200) - outbuf.str[outbuf.len++] = 0x88; // indexed field : idx[08]=(":status", "200") - else if (outbuf.len < outbuf.size && h1m->status == 304) - outbuf.str[outbuf.len++] = 0x8b; // indexed field : idx[11]=(":status", "304") + if (outbuf.data < outbuf.size && h1m->status == 200) + outbuf.area[outbuf.data++] = 0x88; // indexed field : idx[08]=(":status", "200") + else if (outbuf.data < outbuf.size && h1m->status == 304) + outbuf.area[outbuf.data++] = 0x8b; // indexed field : idx[11]=(":status", "304") else if (unlikely(list[0].v.len != 3)) { /* this is an unparsable response */ h2s_error(h2s, H2_ERR_INTERNAL_ERROR); ret = 0; goto end; } - else if (unlikely(outbuf.len + 2 + 3 <= outbuf.size)) { + else if (unlikely(outbuf.data + 2 + 3 <= outbuf.size)) { /* basic encoding of the status code */ - outbuf.str[outbuf.len++] = 0x48; // indexed name -- name=":status" (idx 8) - outbuf.str[outbuf.len++] = 0x03; // 3 bytes status - outbuf.str[outbuf.len++] = list[0].v.ptr[0]; - outbuf.str[outbuf.len++] = list[0].v.ptr[1]; - outbuf.str[outbuf.len++] = list[0].v.ptr[2]; + outbuf.area[outbuf.data++] = 0x48; // indexed name -- name=":status" (idx 8) + outbuf.area[outbuf.data++] = 0x03; // 3 bytes status + outbuf.area[outbuf.data++] = list[0].v.ptr[0]; + outbuf.area[outbuf.data++] = list[0].v.ptr[1]; + outbuf.area[outbuf.data++] = list[0].v.ptr[2]; } else { if (b_space_wraps(&h2c->mbuf)) @@ -3075,16 +3075,16 @@ static size_t h2s_frt_make_resp_headers(struct h2s *h2s, const struct buffer *bu es_now = 1; /* update the frame's size */ - h2_set_frame_size(outbuf.str, outbuf.len - 9); + h2_set_frame_size(outbuf.area, outbuf.data - 9); if (es_now) - outbuf.str[4] |= H2_F_HEADERS_END_STREAM; + outbuf.area[4] |= H2_F_HEADERS_END_STREAM; /* consume incoming H1 response */ max -= ret; /* commit the H2 response */ - b_add(&h2c->mbuf, outbuf.len); + b_add(&h2c->mbuf, outbuf.data); h2s->flags |= H2_SF_HEADERS_SENT; /* for now we don't implemented CONTINUATION, so we wait for a @@ -3151,14 +3151,14 @@ static size_t h2s_frt_make_resp_data(struct h2s *h2s, const struct buffer *buf, chunk_reset(&outbuf); while (1) { - outbuf.str = b_tail(&h2c->mbuf); + outbuf.area = b_tail(&h2c->mbuf); outbuf.size = b_contig_space(&h2c->mbuf); - outbuf.len = 0; + outbuf.data = 0; if (outbuf.size >= 9 || !b_space_wraps(&h2c->mbuf)) break; realign_again: - b_slow_realign(&h2c->mbuf, trash.str, b_data(&h2c->mbuf)); + b_slow_realign(&h2c->mbuf, trash.area, b_data(&h2c->mbuf)); } if (outbuf.size < 9) { @@ -3168,9 +3168,9 @@ static size_t h2s_frt_make_resp_data(struct h2s *h2s, const struct buffer *buf, } /* len: 0x000000 (fill later), type: 0(DATA), flags: none=0 */ - memcpy(outbuf.str, "\x00\x00\x00\x00\x00", 5); - write_n32(outbuf.str + 5, h2s->id); // 4 bytes - outbuf.len = 9; + memcpy(outbuf.area, "\x00\x00\x00\x00\x00", 5); + write_n32(outbuf.area + 5, h2s->id); // 4 bytes + outbuf.data = 9; switch (h1m->flags & (H1_MF_CLEN|H1_MF_CHNK)) { case 0: /* no content length, read till SHUTW */ @@ -3301,9 +3301,9 @@ static size_t h2s_frt_make_resp_data(struct h2s *h2s, const struct buffer *buf, } /* now let's copy this this into the output buffer */ - memcpy(outbuf.str + 9, blk1, len1); + memcpy(outbuf.area + 9, blk1, len1); if (len2) - memcpy(outbuf.str + 9 + len1, blk2, len2); + memcpy(outbuf.area + 9 + len1, blk2, len2); send_empty: /* we may need to add END_STREAM */ @@ -3323,10 +3323,10 @@ static size_t h2s_frt_make_resp_data(struct h2s *h2s, const struct buffer *buf, es_now = 1; /* update the frame's size */ - h2_set_frame_size(outbuf.str, size); + h2_set_frame_size(outbuf.area, size); if (es_now) - outbuf.str[4] |= H2_F_DATA_END_STREAM; + outbuf.area[4] |= H2_F_DATA_END_STREAM; /* commit the H2 response */ b_add(&h2c->mbuf, size + 9); diff --git a/src/namespace.c b/src/namespace.c index c8cec16eb..93d92480d 100644 --- a/src/namespace.c +++ b/src/namespace.c @@ -26,7 +26,7 @@ static int open_named_namespace(const char *ns_name) { if (chunk_printf(&trash, "/var/run/netns/%s", ns_name) < 0) return -1; - return open(trash.str, O_RDONLY); + return open(trash.area, O_RDONLY); } static int default_namespace = -1; @@ -35,7 +35,7 @@ static int init_default_namespace() { if (chunk_printf(&trash, "/proc/%d/ns/net", getpid()) < 0) return -1; - default_namespace = open(trash.str, O_RDONLY); + default_namespace = open(trash.area, O_RDONLY); return default_namespace; } diff --git a/src/pattern.c b/src/pattern.c index 35c1c7e80..2975afacb 100644 --- a/src/pattern.c +++ b/src/pattern.c @@ -226,7 +226,7 @@ int pat_parse_bin(const char *text, struct pattern *pattern, int mflags, char ** pattern->type = SMP_T_BIN; trash = get_trash_chunk(); pattern->len = trash->size; - pattern->ptr.str = trash->str; + pattern->ptr.str = trash->area; return !!parse_binary(text, &pattern->ptr.str, &pattern->len, err); } @@ -463,12 +463,12 @@ struct pattern *pat_match_str(struct sample *smp, struct pattern_expr *expr, int /* Lookup a string in the expression's pattern tree. */ if (!eb_is_empty(&expr->pattern_tree)) { /* we may have to force a trailing zero on the test pattern */ - prev = smp->data.u.str.str[smp->data.u.str.len]; + prev = smp->data.u.str.area[smp->data.u.str.data]; if (prev) - smp->data.u.str.str[smp->data.u.str.len] = '\0'; - node = ebst_lookup(&expr->pattern_tree, smp->data.u.str.str); + smp->data.u.str.area[smp->data.u.str.data] = '\0'; + node = ebst_lookup(&expr->pattern_tree, smp->data.u.str.area); if (prev) - smp->data.u.str.str[smp->data.u.str.len] = prev; + smp->data.u.str.area[smp->data.u.str.data] = prev; if (node) { if (fill) { @@ -488,7 +488,7 @@ struct pattern *pat_match_str(struct sample *smp, struct pattern_expr *expr, int unsigned long long seed = pat_lru_seed ^ (long)expr; HA_SPIN_LOCK(PATLRU_LOCK, &pat_lru_tree_lock); - lru = lru64_get(XXH64(smp->data.u.str.str, smp->data.u.str.len, seed), + lru = lru64_get(XXH64(smp->data.u.str.area, smp->data.u.str.data, seed), pat_lru_tree, expr, expr->revision); if (!lru) { HA_SPIN_UNLOCK(PATLRU_LOCK, &pat_lru_tree_lock); @@ -504,12 +504,12 @@ struct pattern *pat_match_str(struct sample *smp, struct pattern_expr *expr, int list_for_each_entry(lst, &expr->patterns, list) { pattern = &lst->pat; - if (pattern->len != smp->data.u.str.len) + if (pattern->len != smp->data.u.str.data) continue; icase = expr->mflags & PAT_MF_IGNORE_CASE; - if ((icase && strncasecmp(pattern->ptr.str, smp->data.u.str.str, smp->data.u.str.len) == 0) || - (!icase && strncmp(pattern->ptr.str, smp->data.u.str.str, smp->data.u.str.len) == 0)) { + if ((icase && strncasecmp(pattern->ptr.str, smp->data.u.str.area, smp->data.u.str.data) == 0) || + (!icase && strncmp(pattern->ptr.str, smp->data.u.str.area, smp->data.u.str.data) == 0)) { ret = pattern; break; } @@ -535,7 +535,7 @@ struct pattern *pat_match_bin(struct sample *smp, struct pattern_expr *expr, int unsigned long long seed = pat_lru_seed ^ (long)expr; HA_SPIN_LOCK(PATLRU_LOCK, &pat_lru_tree_lock); - lru = lru64_get(XXH64(smp->data.u.str.str, smp->data.u.str.len, seed), + lru = lru64_get(XXH64(smp->data.u.str.area, smp->data.u.str.data, seed), pat_lru_tree, expr, expr->revision); if (!lru) { HA_SPIN_UNLOCK(PATLRU_LOCK, &pat_lru_tree_lock); @@ -550,10 +550,10 @@ struct pattern *pat_match_bin(struct sample *smp, struct pattern_expr *expr, int list_for_each_entry(lst, &expr->patterns, list) { pattern = &lst->pat; - if (pattern->len != smp->data.u.str.len) + if (pattern->len != smp->data.u.str.data) continue; - if (memcmp(pattern->ptr.str, smp->data.u.str.str, smp->data.u.str.len) == 0) { + if (memcmp(pattern->ptr.str, smp->data.u.str.area, smp->data.u.str.data) == 0) { ret = pattern; break; } @@ -580,7 +580,7 @@ struct pattern *pat_match_regm(struct sample *smp, struct pattern_expr *expr, in list_for_each_entry(lst, &expr->patterns, list) { pattern = &lst->pat; - if (regex_exec_match2(pattern->ptr.reg, smp->data.u.str.str, smp->data.u.str.len, + if (regex_exec_match2(pattern->ptr.reg, smp->data.u.str.area, smp->data.u.str.data, MAX_MATCH, pmatch, 0)) { ret = pattern; smp->ctx.a[0] = pmatch; @@ -605,7 +605,7 @@ struct pattern *pat_match_reg(struct sample *smp, struct pattern_expr *expr, int unsigned long long seed = pat_lru_seed ^ (long)expr; HA_SPIN_LOCK(PATLRU_LOCK, &pat_lru_tree_lock); - lru = lru64_get(XXH64(smp->data.u.str.str, smp->data.u.str.len, seed), + lru = lru64_get(XXH64(smp->data.u.str.area, smp->data.u.str.data, seed), pat_lru_tree, expr, expr->revision); if (!lru) { HA_SPIN_UNLOCK(PATLRU_LOCK, &pat_lru_tree_lock); @@ -620,7 +620,7 @@ struct pattern *pat_match_reg(struct sample *smp, struct pattern_expr *expr, int list_for_each_entry(lst, &expr->patterns, list) { pattern = &lst->pat; - if (regex_exec2(pattern->ptr.reg, smp->data.u.str.str, smp->data.u.str.len)) { + if (regex_exec2(pattern->ptr.reg, smp->data.u.str.area, smp->data.u.str.data)) { ret = pattern; break; } @@ -649,12 +649,13 @@ struct pattern *pat_match_beg(struct sample *smp, struct pattern_expr *expr, int /* Lookup a string in the expression's pattern tree. */ if (!eb_is_empty(&expr->pattern_tree)) { /* we may have to force a trailing zero on the test pattern */ - prev = smp->data.u.str.str[smp->data.u.str.len]; + prev = smp->data.u.str.area[smp->data.u.str.data]; if (prev) - smp->data.u.str.str[smp->data.u.str.len] = '\0'; - node = ebmb_lookup_longest(&expr->pattern_tree, smp->data.u.str.str); + smp->data.u.str.area[smp->data.u.str.data] = '\0'; + node = ebmb_lookup_longest(&expr->pattern_tree, + smp->data.u.str.area); if (prev) - smp->data.u.str.str[smp->data.u.str.len] = prev; + smp->data.u.str.area[smp->data.u.str.data] = prev; if (node) { if (fill) { @@ -674,7 +675,7 @@ struct pattern *pat_match_beg(struct sample *smp, struct pattern_expr *expr, int unsigned long long seed = pat_lru_seed ^ (long)expr; HA_SPIN_LOCK(PATLRU_LOCK, &pat_lru_tree_lock); - lru = lru64_get(XXH64(smp->data.u.str.str, smp->data.u.str.len, seed), + lru = lru64_get(XXH64(smp->data.u.str.area, smp->data.u.str.data, seed), pat_lru_tree, expr, expr->revision); if (!lru) { HA_SPIN_UNLOCK(PATLRU_LOCK, &pat_lru_tree_lock); @@ -689,12 +690,12 @@ struct pattern *pat_match_beg(struct sample *smp, struct pattern_expr *expr, int list_for_each_entry(lst, &expr->patterns, list) { pattern = &lst->pat; - if (pattern->len > smp->data.u.str.len) + if (pattern->len > smp->data.u.str.data) continue; icase = expr->mflags & PAT_MF_IGNORE_CASE; - if ((icase && strncasecmp(pattern->ptr.str, smp->data.u.str.str, pattern->len) != 0) || - (!icase && strncmp(pattern->ptr.str, smp->data.u.str.str, pattern->len) != 0)) + if ((icase && strncasecmp(pattern->ptr.str, smp->data.u.str.area, pattern->len) != 0) || + (!icase && strncmp(pattern->ptr.str, smp->data.u.str.area, pattern->len) != 0)) continue; ret = pattern; @@ -722,7 +723,7 @@ struct pattern *pat_match_end(struct sample *smp, struct pattern_expr *expr, int unsigned long long seed = pat_lru_seed ^ (long)expr; HA_SPIN_LOCK(PATLRU_LOCK, &pat_lru_tree_lock); - lru = lru64_get(XXH64(smp->data.u.str.str, smp->data.u.str.len, seed), + lru = lru64_get(XXH64(smp->data.u.str.area, smp->data.u.str.data, seed), pat_lru_tree, expr, expr->revision); if (!lru) { HA_SPIN_UNLOCK(PATLRU_LOCK, &pat_lru_tree_lock); @@ -737,12 +738,12 @@ struct pattern *pat_match_end(struct sample *smp, struct pattern_expr *expr, int list_for_each_entry(lst, &expr->patterns, list) { pattern = &lst->pat; - if (pattern->len > smp->data.u.str.len) + if (pattern->len > smp->data.u.str.data) continue; icase = expr->mflags & PAT_MF_IGNORE_CASE; - if ((icase && strncasecmp(pattern->ptr.str, smp->data.u.str.str + smp->data.u.str.len - pattern->len, pattern->len) != 0) || - (!icase && strncmp(pattern->ptr.str, smp->data.u.str.str + smp->data.u.str.len - pattern->len, pattern->len) != 0)) + if ((icase && strncasecmp(pattern->ptr.str, smp->data.u.str.area + smp->data.u.str.data - pattern->len, pattern->len) != 0) || + (!icase && strncmp(pattern->ptr.str, smp->data.u.str.area + smp->data.u.str.data - pattern->len, pattern->len) != 0)) continue; ret = pattern; @@ -774,7 +775,7 @@ struct pattern *pat_match_sub(struct sample *smp, struct pattern_expr *expr, int unsigned long long seed = pat_lru_seed ^ (long)expr; HA_SPIN_LOCK(PATLRU_LOCK, &pat_lru_tree_lock); - lru = lru64_get(XXH64(smp->data.u.str.str, smp->data.u.str.len, seed), + lru = lru64_get(XXH64(smp->data.u.str.area, smp->data.u.str.data, seed), pat_lru_tree, expr, expr->revision); if (!lru) { HA_SPIN_UNLOCK(PATLRU_LOCK, &pat_lru_tree_lock); @@ -789,13 +790,13 @@ struct pattern *pat_match_sub(struct sample *smp, struct pattern_expr *expr, int list_for_each_entry(lst, &expr->patterns, list) { pattern = &lst->pat; - if (pattern->len > smp->data.u.str.len) + if (pattern->len > smp->data.u.str.data) continue; - end = smp->data.u.str.str + smp->data.u.str.len - pattern->len; + end = smp->data.u.str.area + smp->data.u.str.data - pattern->len; icase = expr->mflags & PAT_MF_IGNORE_CASE; if (icase) { - for (c = smp->data.u.str.str; c <= end; c++) { + for (c = smp->data.u.str.area; c <= end; c++) { if (tolower(*c) != tolower(*pattern->ptr.str)) continue; if (strncasecmp(pattern->ptr.str, c, pattern->len) == 0) { @@ -804,7 +805,7 @@ struct pattern *pat_match_sub(struct sample *smp, struct pattern_expr *expr, int } } } else { - for (c = smp->data.u.str.str; c <= end; c++) { + for (c = smp->data.u.str.area; c <= end; c++) { if (*c != *pattern->ptr.str) continue; if (strncmp(pattern->ptr.str, c, pattern->len) == 0) { @@ -847,13 +848,13 @@ static int match_word(struct sample *smp, struct pattern *pattern, int mflags, u while (pl > 0 && is_delimiter(ps[pl - 1], delimiters)) pl--; - if (pl > smp->data.u.str.len) + if (pl > smp->data.u.str.data) return PAT_NOMATCH; may_match = 1; icase = mflags & PAT_MF_IGNORE_CASE; - end = smp->data.u.str.str + smp->data.u.str.len - pl; - for (c = smp->data.u.str.str; c <= end; c++) { + end = smp->data.u.str.area + smp->data.u.str.data - pl; + for (c = smp->data.u.str.area; c <= end; c++) { if (is_delimiter(*c, delimiters)) { may_match = 1; continue; @@ -935,8 +936,8 @@ struct pattern *pat_match_len(struct sample *smp, struct pattern_expr *expr, int list_for_each_entry(lst, &expr->patterns, list) { pattern = &lst->pat; - if ((!pattern->val.range.min_set || pattern->val.range.min <= smp->data.u.str.len) && - (!pattern->val.range.max_set || smp->data.u.str.len <= pattern->val.range.max)) + if ((!pattern->val.range.min_set || pattern->val.range.min <= smp->data.u.str.data) && + (!pattern->val.range.max_set || smp->data.u.str.data <= pattern->val.range.max)) return pattern; } return NULL; @@ -2332,9 +2333,9 @@ int pat_ref_read_from_file_smp(struct pat_ref *ref, const char *filename, char * * followed by one value per line. The start spaces, separator spaces * and and spaces are stripped. Each can contain comment started by '#' */ - while (fgets(trash.str, trash.size, file) != NULL) { + while (fgets(trash.area, trash.size, file) != NULL) { line++; - c = trash.str; + c = trash.area; /* ignore lines beginning with a dash */ if (*c == '#') @@ -2409,9 +2410,9 @@ int pat_ref_read_from_file(struct pat_ref *ref, const char *filename, char **err * line. If the line contains spaces, they will be part of the pattern. * The pattern stops at the first CR, LF or EOF encountered. */ - while (fgets(trash.str, trash.size, file) != NULL) { + while (fgets(trash.area, trash.size, file) != NULL) { line++; - c = trash.str; + c = trash.area; /* ignore lines beginning with a dash */ if (*c == '#') @@ -2462,7 +2463,7 @@ int pattern_read_from_file(struct pattern_head *head, unsigned int refflags, "pattern loaded from file '%s' used by %s at file '%s' line %d", filename, refflags & PAT_REF_MAP ? "map" : "acl", file, line); - ref = pat_ref_new(filename, trash.str, refflags); + ref = pat_ref_new(filename, trash.area, refflags); if (!ref) { memprintf(err, "out of memory"); return 0; @@ -2509,7 +2510,7 @@ int pattern_read_from_file(struct pattern_head *head, unsigned int refflags, chunk_appendf(&trash, ", by %s at file '%s' line %d", refflags & PAT_REF_MAP ? "map" : "acl", file, line); free(ref->display); - ref->display = strdup(trash.str); + ref->display = strdup(trash.area); if (!ref->display) { memprintf(err, "out of memory"); return 0; @@ -2596,11 +2597,13 @@ struct pattern *pattern_exec_match(struct pattern_head *head, struct sample *smp case SMP_T_STR: static_sample_data.type = SMP_T_STR; static_sample_data.u.str = *get_trash_chunk(); - static_sample_data.u.str.len = pat->data->u.str.len; - if (static_sample_data.u.str.len >= static_sample_data.u.str.size) - static_sample_data.u.str.len = static_sample_data.u.str.size - 1; - memcpy(static_sample_data.u.str.str, pat->data->u.str.str, static_sample_data.u.str.len); - static_sample_data.u.str.str[static_sample_data.u.str.len] = 0; + static_sample_data.u.str.data = pat->data->u.str.data; + if (static_sample_data.u.str.data >= static_sample_data.u.str.size) + static_sample_data.u.str.data = static_sample_data.u.str.size - 1; + memcpy(static_sample_data.u.str.area, + pat->data->u.str.area, + static_sample_data.u.str.data); + static_sample_data.u.str.area[static_sample_data.u.str.data] = 0; case SMP_T_IPV4: case SMP_T_IPV6: case SMP_T_SINT: diff --git a/src/payload.c b/src/payload.c index cf5b8838b..054168a51 100644 --- a/src/payload.c +++ b/src/payload.c @@ -630,8 +630,8 @@ smp_fetch_ssl_hello_sni(const struct arg *args, struct sample *smp, const char * if (name_type == 0) { /* hostname */ smp->data.type = SMP_T_STR; - smp->data.u.str.str = (char *)data + 9; - smp->data.u.str.len = name_len; + smp->data.u.str.area = (char *)data + 9; + smp->data.u.str.data = name_len; smp->flags = SMP_F_VOLATILE | SMP_F_CONST; return 1; } @@ -714,8 +714,8 @@ fetch_rdp_cookie_name(struct stream *s, struct sample *smp, const char *cname, i } /* data points to cookie value */ - smp->data.u.str.str = (char *)data; - smp->data.u.str.len = 0; + smp->data.u.str.area = (char *)data; + smp->data.u.str.data = 0; while (bleft > 0 && *data != '\r') { data++; @@ -728,7 +728,7 @@ fetch_rdp_cookie_name(struct stream *s, struct sample *smp, const char *cname, i if (data[0] != '\r' || data[1] != '\n') goto not_cookie; - smp->data.u.str.len = (char *)data - smp->data.u.str.str; + smp->data.u.str.data = (char *)data - smp->data.u.str.area; smp->flags = SMP_F_VOLATILE | SMP_F_CONST; return 1; @@ -750,7 +750,9 @@ smp_fetch_rdp_cookie(const struct arg *args, struct sample *smp, const char *kw, if (!smp->strm) return 0; - return fetch_rdp_cookie_name(smp->strm, smp, args ? args->data.str.str : NULL, args ? args->data.str.len : 0); + return fetch_rdp_cookie_name(smp->strm, smp, + args ? args->data.str.area : NULL, + args ? args->data.str.data : 0); } /* returns either 1 or 0 depending on whether an RDP cookie is found or not */ @@ -890,12 +892,13 @@ int val_payload_lv(struct arg *arg, char **err_msg) return 0; } - if (arg[2].type == ARGT_STR && arg[2].data.str.len > 0) { - if (arg[2].data.str.str[0] == '+' || arg[2].data.str.str[0] == '-') + if (arg[2].type == ARGT_STR && arg[2].data.str.data > 0) { + if (arg[2].data.str.area[0] == '+' || arg[2].data.str.area[0] == '-') relative = 1; - str = arg[2].data.str.str; + str = arg[2].data.str.area; arg[2].type = ARGT_SINT; - arg[2].data.sint = read_int64(&str, str + arg[2].data.str.len); + arg[2].data.sint = read_int64(&str, + str + arg[2].data.str.data); if (*str != '\0') { memprintf(err_msg, "payload offset2 is not a number"); return 0; @@ -1087,7 +1090,7 @@ int val_distcc(struct arg *arg, char **err_msg) { unsigned int token; - if (arg[0].data.str.len != 4) { + if (arg[0].data.str.data != 4) { memprintf(err_msg, "token name must be exactly 4 characters"); return 0; } @@ -1095,8 +1098,8 @@ int val_distcc(struct arg *arg, char **err_msg) /* convert the token name to an unsigned int (one byte per character, * big endian format). */ - token = (arg[0].data.str.str[0] << 24) + (arg[0].data.str.str[1] << 16) + - (arg[0].data.str.str[2] << 8) + (arg[0].data.str.str[3] << 0); + token = (arg[0].data.str.area[0] << 24) + (arg[0].data.str.area[1] << 16) + + (arg[0].data.str.area[2] << 8) + (arg[0].data.str.area[3] << 0); arg[0].type = ARGT_SINT; arg[0].data.sint = token; diff --git a/src/peers.c b/src/peers.c index 6e549f024..08a29a6a7 100644 --- a/src/peers.c +++ b/src/peers.c @@ -413,7 +413,7 @@ static int peer_prepare_switchmsg(struct shared_table *st, char *msg, size_t siz intencode(st->table->key_size, &cursor); chunk = get_trash_chunk(); - chunkp = chunkq = chunk->str; + chunkp = chunkq = chunk->area; /* encode available known data types in table */ for (data_type = 0 ; data_type < STKTABLE_DATA_TYPES ; data_type++) { if (st->table->data_ofs[data_type]) { @@ -437,9 +437,9 @@ static int peer_prepare_switchmsg(struct shared_table *st, char *msg, size_t siz intencode(st->table->expire, &cursor); if (chunkq > chunkp) { - chunk->len = chunkq - chunkp; - memcpy(cursor, chunk->str, chunk->len); - cursor += chunk->len; + chunk->data = chunkq - chunkp; + memcpy(cursor, chunk->area, chunk->data); + cursor += chunk->data; } /* Compute datalen */ @@ -588,31 +588,32 @@ switchstate: appctx->st0 = PEER_SESS_ST_GETVERSION; /* fall through */ case PEER_SESS_ST_GETVERSION: - reql = co_getline(si_oc(si), trash.str, trash.size); + reql = co_getline(si_oc(si), trash.area, + trash.size); if (reql <= 0) { /* closed or EOL not found */ if (reql == 0) goto out; appctx->st0 = PEER_SESS_ST_END; goto switchstate; } - if (trash.str[reql-1] != '\n') { + if (trash.area[reql-1] != '\n') { appctx->st0 = PEER_SESS_ST_END; goto switchstate; } - else if (reql > 1 && (trash.str[reql-2] == '\r')) - trash.str[reql-2] = 0; + else if (reql > 1 && (trash.area[reql-2] == '\r')) + trash.area[reql-2] = 0; else - trash.str[reql-1] = 0; + trash.area[reql-1] = 0; co_skip(si_oc(si), reql); /* test protocol */ - if (strncmp(PEER_SESSION_PROTO_NAME " ", trash.str, proto_len + 1) != 0) { + if (strncmp(PEER_SESSION_PROTO_NAME " ", trash.area, proto_len + 1) != 0) { appctx->st0 = PEER_SESS_ST_EXIT; appctx->st1 = PEER_SESS_SC_ERRPROTO; goto switchstate; } - if (peer_get_version(trash.str + proto_len + 1, &maj_ver, &min_ver) == -1 || + if (peer_get_version(trash.area + proto_len + 1, &maj_ver, &min_ver) == -1 || maj_ver != PEER_MAJOR_VER || min_ver > PEER_MINOR_VER) { appctx->st0 = PEER_SESS_ST_EXIT; appctx->st1 = PEER_SESS_SC_ERRVERSION; @@ -622,26 +623,27 @@ switchstate: appctx->st0 = PEER_SESS_ST_GETHOST; /* fall through */ case PEER_SESS_ST_GETHOST: - reql = co_getline(si_oc(si), trash.str, trash.size); + reql = co_getline(si_oc(si), trash.area, + trash.size); if (reql <= 0) { /* closed or EOL not found */ if (reql == 0) goto out; appctx->st0 = PEER_SESS_ST_END; goto switchstate; } - if (trash.str[reql-1] != '\n') { + if (trash.area[reql-1] != '\n') { appctx->st0 = PEER_SESS_ST_END; goto switchstate; } - else if (reql > 1 && (trash.str[reql-2] == '\r')) - trash.str[reql-2] = 0; + else if (reql > 1 && (trash.area[reql-2] == '\r')) + trash.area[reql-2] = 0; else - trash.str[reql-1] = 0; + trash.area[reql-1] = 0; co_skip(si_oc(si), reql); /* test hostname match */ - if (strcmp(localpeer, trash.str) != 0) { + if (strcmp(localpeer, trash.area) != 0) { appctx->st0 = PEER_SESS_ST_EXIT; appctx->st1 = PEER_SESS_SC_ERRHOST; goto switchstate; @@ -651,27 +653,28 @@ switchstate: /* fall through */ case PEER_SESS_ST_GETPEER: { char *p; - reql = co_getline(si_oc(si), trash.str, trash.size); + reql = co_getline(si_oc(si), trash.area, + trash.size); if (reql <= 0) { /* closed or EOL not found */ if (reql == 0) goto out; appctx->st0 = PEER_SESS_ST_END; goto switchstate; } - if (trash.str[reql-1] != '\n') { + if (trash.area[reql-1] != '\n') { /* Incomplete line, we quit */ appctx->st0 = PEER_SESS_ST_END; goto switchstate; } - else if (reql > 1 && (trash.str[reql-2] == '\r')) - trash.str[reql-2] = 0; + else if (reql > 1 && (trash.area[reql-2] == '\r')) + trash.area[reql-2] = 0; else - trash.str[reql-1] = 0; + trash.area[reql-1] = 0; co_skip(si_oc(si), reql); /* parse line " " */ - p = strchr(trash.str, ' '); + p = strchr(trash.area, ' '); if (!p) { appctx->st0 = PEER_SESS_ST_EXIT; appctx->st1 = PEER_SESS_SC_ERRPROTO; @@ -681,7 +684,7 @@ switchstate: /* lookup known peer */ for (curpeer = curpeers->remote; curpeer; curpeer = curpeer->next) { - if (strcmp(curpeer->id, trash.str) == 0) + if (strcmp(curpeer->id, trash.area) == 0) break; } @@ -732,8 +735,10 @@ switchstate: goto switchstate; } } - repl = snprintf(trash.str, trash.size, "%d\n", PEER_SESS_SC_SUCCESSCODE); - repl = ci_putblk(si_ic(si), trash.str, repl); + repl = snprintf(trash.area, trash.size, + "%d\n", + PEER_SESS_SC_SUCCESSCODE); + repl = ci_putblk(si_ic(si), trash.area, repl); if (repl <= 0) { if (repl == -1) goto full; @@ -795,7 +800,7 @@ switchstate: } /* Send headers */ - repl = snprintf(trash.str, trash.size, + repl = snprintf(trash.area, trash.size, PEER_SESSION_PROTO_NAME " %u.%u\n%s\n%s %d %d\n", PEER_MAJOR_VER, (curpeer->flags & PEER_F_DWNGRD) ? PEER_DWNGRD_MINOR_VER : PEER_MINOR_VER, @@ -809,7 +814,7 @@ switchstate: goto switchstate; } - repl = ci_putblk(si_ic(si), trash.str, repl); + repl = ci_putblk(si_ic(si), trash.area, repl); if (repl <= 0) { if (repl == -1) goto full; @@ -836,27 +841,28 @@ switchstate: if (si_ic(si)->flags & CF_WRITE_PARTIAL) curpeer->statuscode = PEER_SESS_SC_CONNECTEDCODE; - reql = co_getline(si_oc(si), trash.str, trash.size); + reql = co_getline(si_oc(si), trash.area, + trash.size); if (reql <= 0) { /* closed or EOL not found */ if (reql == 0) goto out; appctx->st0 = PEER_SESS_ST_END; goto switchstate; } - if (trash.str[reql-1] != '\n') { + if (trash.area[reql-1] != '\n') { /* Incomplete line, we quit */ appctx->st0 = PEER_SESS_ST_END; goto switchstate; } - else if (reql > 1 && (trash.str[reql-2] == '\r')) - trash.str[reql-2] = 0; + else if (reql > 1 && (trash.area[reql-2] == '\r')) + trash.area[reql-2] = 0; else - trash.str[reql-1] = 0; + trash.area[reql-1] = 0; co_skip(si_oc(si), reql); /* Register status code */ - curpeer->statuscode = atoi(trash.str); + curpeer->statuscode = atoi(trash.area); /* Awake main task */ task_wakeup(curpeers->sync_task, TASK_WOKEN_MSG); @@ -906,8 +912,8 @@ switchstate: case PEER_SESS_ST_WAITMSG: { struct stksess *ts, *newts = NULL; uint32_t msg_len = 0; - char *msg_cur = trash.str; - char *msg_end = trash.str; + char *msg_cur = trash.area; + char *msg_end = trash.area; unsigned char msg_head[7]; int totl = 0; @@ -978,7 +984,10 @@ switchstate: goto switchstate; } - reql = co_getblk(si_oc(si), trash.str, msg_len, totl); + reql = co_getblk(si_oc(si), + trash.area, + msg_len, + totl); if (reql <= 0) /* closed */ goto incomplete; totl += reql; @@ -1443,7 +1452,9 @@ incomplete: if (st->last_get != st->last_acked) { int msglen; - msglen = peer_prepare_ackmsg(st, trash.str, trash.size); + msglen = peer_prepare_ackmsg(st, + trash.area, + trash.size); if (!msglen) { /* internal error: message does not fit in trash */ appctx->st0 = PEER_SESS_ST_END; @@ -1451,7 +1462,9 @@ incomplete: } /* message to buffer */ - repl = ci_putblk(si_ic(si), trash.str, msglen); + repl = ci_putblk(si_ic(si), + trash.area, + msglen); if (repl <= 0) { /* no more write possible */ if (repl == -1) { @@ -1473,7 +1486,9 @@ incomplete: if (st != curpeer->last_local_table) { int msglen; - msglen = peer_prepare_switchmsg(st, trash.str, trash.size); + msglen = peer_prepare_switchmsg(st, + trash.area, + trash.size); if (!msglen) { HA_SPIN_UNLOCK(STK_TABLE_LOCK, &st->table->lock); /* internal error: message does not fit in trash */ @@ -1482,7 +1497,9 @@ incomplete: } /* message to buffer */ - repl = ci_putblk(si_ic(si), trash.str, msglen); + repl = ci_putblk(si_ic(si), + trash.area, + msglen); if (repl <= 0) { HA_SPIN_UNLOCK(STK_TABLE_LOCK, &st->table->lock); /* no more write possible */ @@ -1522,7 +1539,11 @@ incomplete: ts->ref_cnt++; HA_SPIN_UNLOCK(STK_TABLE_LOCK, &st->table->lock); - msglen = peer_prepare_updatemsg(ts, st, updateid, trash.str, trash.size, new_pushed, 0); + msglen = peer_prepare_updatemsg(ts, st, updateid, + trash.area, + trash.size, + new_pushed, + 0); if (!msglen) { /* internal error: message does not fit in trash */ HA_SPIN_LOCK(STK_TABLE_LOCK, &st->table->lock); @@ -1533,7 +1554,9 @@ incomplete: } /* message to buffer */ - repl = ci_putblk(si_ic(si), trash.str, msglen); + repl = ci_putblk(si_ic(si), + trash.area, + msglen); if (repl <= 0) { /* no more write possible */ HA_SPIN_LOCK(STK_TABLE_LOCK, &st->table->lock); @@ -1565,7 +1588,9 @@ incomplete: if (st != curpeer->last_local_table) { int msglen; - msglen = peer_prepare_switchmsg(st, trash.str, trash.size); + msglen = peer_prepare_switchmsg(st, + trash.area, + trash.size); if (!msglen) { /* internal error: message does not fit in trash */ appctx->st0 = PEER_SESS_ST_END; @@ -1573,7 +1598,9 @@ incomplete: } /* message to buffer */ - repl = ci_putblk(si_ic(si), trash.str, msglen); + repl = ci_putblk(si_ic(si), + trash.area, + msglen); if (repl <= 0) { /* no more write possible */ if (repl == -1) { @@ -1610,7 +1637,11 @@ incomplete: HA_SPIN_UNLOCK(STK_TABLE_LOCK, &st->table->lock); use_timed = !(curpeer->flags & PEER_F_DWNGRD); - msglen = peer_prepare_updatemsg(ts, st, updateid, trash.str, trash.size, new_pushed, use_timed); + msglen = peer_prepare_updatemsg(ts, st, updateid, + trash.area, + trash.size, + new_pushed, + use_timed); if (!msglen) { /* internal error: message does not fit in trash */ HA_SPIN_LOCK(STK_TABLE_LOCK, &st->table->lock); @@ -1621,7 +1652,9 @@ incomplete: } /* message to buffer */ - repl = ci_putblk(si_ic(si), trash.str, msglen); + repl = ci_putblk(si_ic(si), + trash.area, + msglen); if (repl <= 0) { /* no more write possible */ HA_SPIN_LOCK(STK_TABLE_LOCK, &st->table->lock); @@ -1649,7 +1682,9 @@ incomplete: if (st != curpeer->last_local_table) { int msglen; - msglen = peer_prepare_switchmsg(st, trash.str, trash.size); + msglen = peer_prepare_switchmsg(st, + trash.area, + trash.size); if (!msglen) { /* internal error: message does not fit in trash */ appctx->st0 = PEER_SESS_ST_END; @@ -1657,7 +1692,9 @@ incomplete: } /* message to buffer */ - repl = ci_putblk(si_ic(si), trash.str, msglen); + repl = ci_putblk(si_ic(si), + trash.area, + msglen); if (repl <= 0) { /* no more write possible */ if (repl == -1) { @@ -1693,7 +1730,11 @@ incomplete: HA_SPIN_UNLOCK(STK_TABLE_LOCK, &st->table->lock); use_timed = !(curpeer->flags & PEER_F_DWNGRD); - msglen = peer_prepare_updatemsg(ts, st, updateid, trash.str, trash.size, new_pushed, use_timed); + msglen = peer_prepare_updatemsg(ts, st, updateid, + trash.area, + trash.size, + new_pushed, + use_timed); if (!msglen) { /* internal error: message does not fit in trash */ HA_SPIN_LOCK(STK_TABLE_LOCK, &st->table->lock); @@ -1704,7 +1745,9 @@ incomplete: } /* message to buffer */ - repl = ci_putblk(si_ic(si), trash.str, msglen); + repl = ci_putblk(si_ic(si), + trash.area, + msglen); if (repl <= 0) { /* no more write possible */ HA_SPIN_LOCK(STK_TABLE_LOCK, &st->table->lock); @@ -1777,8 +1820,9 @@ incomplete: goto out; } case PEER_SESS_ST_EXIT: - repl = snprintf(trash.str, trash.size, "%d\n", appctx->st1); - if (ci_putblk(si_ic(si), trash.str, repl) == -1) + repl = snprintf(trash.area, trash.size, + "%d\n", appctx->st1); + if (ci_putblk(si_ic(si), trash.area, repl) == -1) goto full; appctx->st0 = PEER_SESS_ST_END; goto switchstate; diff --git a/src/proto_http.c b/src/proto_http.c index 1d798e68f..ea10b91ed 100644 --- a/src/proto_http.c +++ b/src/proto_http.c @@ -79,8 +79,8 @@ const char HTTP_100[] = "HTTP/1.1 100 Continue\r\n\r\n"; const struct chunk http_100_chunk = { - .str = (char *)&HTTP_100, - .len = sizeof(HTTP_100)-1 + .area = (char *)&HTTP_100, + .data = sizeof(HTTP_100)-1 }; /* Warning: no "connection" header is provided with the 3xx messages below */ @@ -422,8 +422,8 @@ void init_proto_http() abort(); } - http_err_chunks[msg].str = (char *)http_err_msgs[msg]; - http_err_chunks[msg].len = strlen(http_err_msgs[msg]); + http_err_chunks[msg].area = (char *)http_err_msgs[msg]; + http_err_chunks[msg].data = strlen(http_err_msgs[msg]); } /* initialize the log header encoding map : '{|}"#' should be encoded with @@ -927,7 +927,7 @@ static void http_server_error(struct stream *s, struct stream_interface *si, channel_auto_close(si_ic(si)); channel_auto_read(si_ic(si)); if (msg) - co_inject(si_ic(si), msg->str, msg->len); + co_inject(si_ic(si), msg->area, msg->data); if (!(s->flags & SF_ERR_MASK)) s->flags |= err; if (!(s->flags & SF_FINST_MASK)) @@ -942,9 +942,9 @@ struct chunk *http_error_message(struct stream *s) { const int msgnum = http_get_status_idx(s->txn->status); - if (s->be->errmsg[msgnum].str) + if (s->be->errmsg[msgnum].area) return &s->be->errmsg[msgnum]; - else if (strm_fe(s)->errmsg[msgnum].str) + else if (strm_fe(s)->errmsg[msgnum].area) return &strm_fe(s)->errmsg[msgnum]; else return &http_err_chunks[msgnum]; @@ -1081,19 +1081,19 @@ void http_perform_server_redirect(struct stream *s, struct stream_interface *si) int len, rewind; /* 1: create the response header */ - trash.len = strlen(HTTP_302); - memcpy(trash.str, HTTP_302, trash.len); + trash.data = strlen(HTTP_302); + memcpy(trash.area, HTTP_302, trash.data); srv = objt_server(s->target); /* 2: add the server's prefix */ - if (trash.len + srv->rdr_len > trash.size) + if (trash.data + srv->rdr_len > trash.size) return; /* special prefix "/" means don't change URL */ if (srv->rdr_len != 1 || *srv->rdr_pfx != '/') { - memcpy(trash.str + trash.len, srv->rdr_pfx, srv->rdr_len); - trash.len += srv->rdr_len; + memcpy(trash.area + trash.data, srv->rdr_pfx, srv->rdr_len); + trash.data += srv->rdr_len; } /* 3: add the request URI. Since it was already forwarded, we need @@ -1110,18 +1110,20 @@ void http_perform_server_redirect(struct stream *s, struct stream_interface *si) if (!path) return; - if (trash.len + len > trash.size - 4) /* 4 for CRLF-CRLF */ + if (trash.data + len > trash.size - 4) /* 4 for CRLF-CRLF */ return; - memcpy(trash.str + trash.len, path, len); - trash.len += len; + memcpy(trash.area + trash.data, path, len); + trash.data += len; if (unlikely(txn->flags & TX_USE_PX_CONN)) { - memcpy(trash.str + trash.len, "\r\nProxy-Connection: close\r\n\r\n", 29); - trash.len += 29; + memcpy(trash.area + trash.data, + "\r\nProxy-Connection: close\r\n\r\n", 29); + trash.data += 29; } else { - memcpy(trash.str + trash.len, "\r\nConnection: close\r\n\r\n", 23); - trash.len += 23; + memcpy(trash.area + trash.data, + "\r\nConnection: close\r\n\r\n", 23); + trash.data += 23; } /* prepare to return without error. */ @@ -1301,24 +1303,25 @@ get_http_auth(struct stream *s) chunk_initlen(&txn->auth.method_data, p + 1, 0, ctx.vlen - len - 1); - if (!strncasecmp("Basic", auth_method.str, auth_method.len)) { + if (!strncasecmp("Basic", auth_method.area, auth_method.data)) { struct chunk *http_auth = get_trash_chunk(); - len = base64dec(txn->auth.method_data.str, txn->auth.method_data.len, - http_auth->str, global.tune.bufsize - 1); + len = base64dec(txn->auth.method_data.area, + txn->auth.method_data.data, + http_auth->area, global.tune.bufsize - 1); if (len < 0) return 0; - http_auth->str[len] = '\0'; + http_auth->area[len] = '\0'; - p = strchr(http_auth->str, ':'); + p = strchr(http_auth->area, ':'); if (!p) return 0; - txn->auth.user = http_auth->str; + txn->auth.user = http_auth->area; *p = '\0'; txn->auth.pass = p+1; @@ -1644,7 +1647,7 @@ int http_wait_for_request(struct stream *s, struct channel *req, int an_bit) } if (unlikely(ci_tail(req) < c_ptr(req, msg->next) || ci_tail(req) > b_wrap(&req->buf) - global.tune.maxrewrite)) - channel_slow_realign(req, trash.str); + channel_slow_realign(req, trash.area); } if (likely(msg->next < ci_data(req))) /* some unparsed data are available */ @@ -2425,11 +2428,13 @@ int http_transform_header_str(struct stream* s, struct http_msg *msg, if (!regex_exec_match2(re, val, val_end-val, MAX_MATCH, pmatch, 0)) continue; - output->len = exp_replace(output->str, output->size, val, str, pmatch); - if (output->len == -1) + output->data = exp_replace(output->area, output->size, val, + str, pmatch); + if (output->data == -1) return -1; - delta = b_rep_blk(&msg->chn->buf, val, val_end, output->str, output->len); + delta = b_rep_blk(&msg->chn->buf, val, val_end, output->area, + output->data); hdr->len += delta; http_msg_move_end(msg, delta); @@ -2453,11 +2458,12 @@ static int http_transform_header(struct stream* s, struct http_msg *msg, if (!replace) goto leave; - replace->len = build_logline(s, replace->str, replace->size, fmt); - if (replace->len >= replace->size - 1) + replace->data = build_logline(s, replace->area, replace->size, fmt); + if (replace->data >= replace->size - 1) goto leave; - ret = http_transform_header_str(s, msg, name, name_len, replace->str, re, action); + ret = http_transform_header_str(s, msg, name, name_len, replace->area, + re, action); leave: free_trash_chunk(replace); @@ -2608,11 +2614,14 @@ resume_execution: return HTTP_RULE_RES_BADREQ; len = rule->arg.hdr_add.name_len + 2, - len += build_logline(s, replace->str + len, replace->size - len, &rule->arg.hdr_add.fmt); - memcpy(replace->str, rule->arg.hdr_add.name, rule->arg.hdr_add.name_len); - replace->str[rule->arg.hdr_add.name_len] = ':'; - replace->str[rule->arg.hdr_add.name_len + 1] = ' '; - replace->len = len; + len += build_logline(s, replace->area + len, + replace->size - len, + &rule->arg.hdr_add.fmt); + memcpy(replace->area, rule->arg.hdr_add.name, + rule->arg.hdr_add.name_len); + replace->area[rule->arg.hdr_add.name_len] = ':'; + replace->area[rule->arg.hdr_add.name_len + 1] = ' '; + replace->data = len; if (rule->action == ACT_HTTP_SET_HDR) { /* remove all occurrences of the header */ @@ -2623,12 +2632,13 @@ resume_execution: } } - if (http_header_add_tail2(&txn->req, &txn->hdr_idx, replace->str, replace->len) < 0) { + if (http_header_add_tail2(&txn->req, &txn->hdr_idx, replace->area, replace->data) < 0) { static unsigned char rate_limit = 0; if ((rate_limit++ & 255) == 0) { - replace->str[rule->arg.hdr_add.name_len] = 0; - send_log(px, LOG_WARNING, "Proxy %s failed to add or set the request header '%s' for request #%u. You might need to increase tune.maxrewrite.", px->id, replace->str, s->uniq_id); + replace->area[rule->arg.hdr_add.name_len] = 0; + send_log(px, LOG_WARNING, "Proxy %s failed to add or set the request header '%s' for request #%u. You might need to increase tune.maxrewrite.", px->id, + replace->area, s->uniq_id); } HA_ATOMIC_ADD(&sess->fe->fe_counters.failed_rewrites, 1); @@ -2658,13 +2668,14 @@ resume_execution: return HTTP_RULE_RES_BADREQ; /* collect key */ - key->len = build_logline(s, key->str, key->size, &rule->arg.map.key); - key->str[key->len] = '\0'; + key->data = build_logline(s, key->area, key->size, + &rule->arg.map.key); + key->area[key->data] = '\0'; /* perform update */ /* returned code: 1=ok, 0=ko */ HA_SPIN_LOCK(PATREF_LOCK, &ref->lock); - pat_ref_delete(ref, key->str); + pat_ref_delete(ref, key->area); HA_SPIN_UNLOCK(PATREF_LOCK, &ref->lock); free_trash_chunk(key); @@ -2686,14 +2697,15 @@ resume_execution: return HTTP_RULE_RES_BADREQ; /* collect key */ - key->len = build_logline(s, key->str, key->size, &rule->arg.map.key); - key->str[key->len] = '\0'; + key->data = build_logline(s, key->area, key->size, + &rule->arg.map.key); + key->area[key->data] = '\0'; /* perform update */ /* add entry only if it does not already exist */ HA_SPIN_LOCK(PATREF_LOCK, &ref->lock); - if (pat_ref_find_elt(ref, key->str) == NULL) - pat_ref_add(ref, key->str, NULL, NULL); + if (pat_ref_find_elt(ref, key->area) == NULL) + pat_ref_add(ref, key->area, NULL, NULL); HA_SPIN_UNLOCK(PATREF_LOCK, &ref->lock); free_trash_chunk(key); @@ -2722,20 +2734,23 @@ resume_execution: } /* collect key */ - key->len = build_logline(s, key->str, key->size, &rule->arg.map.key); - key->str[key->len] = '\0'; + key->data = build_logline(s, key->area, key->size, + &rule->arg.map.key); + key->area[key->data] = '\0'; /* collect value */ - value->len = build_logline(s, value->str, value->size, &rule->arg.map.value); - value->str[value->len] = '\0'; + value->data = build_logline(s, value->area, + value->size, + &rule->arg.map.value); + value->area[value->data] = '\0'; /* perform update */ - if (pat_ref_find_elt(ref, key->str) != NULL) + if (pat_ref_find_elt(ref, key->area) != NULL) /* update entry if it exists */ - pat_ref_set(ref, key->str, value->str, NULL); + pat_ref_set(ref, key->area, value->area, NULL); else /* insert a new entry */ - pat_ref_add(ref, key->str, value->str, NULL); + pat_ref_add(ref, key->area, value->area, NULL); free_trash_chunk(key); free_trash_chunk(value); @@ -2921,12 +2936,15 @@ resume_execution: return HTTP_RULE_RES_BADREQ; chunk_printf(replace, "%s: ", rule->arg.hdr_add.name); - memcpy(replace->str, rule->arg.hdr_add.name, rule->arg.hdr_add.name_len); - replace->len = rule->arg.hdr_add.name_len; - replace->str[replace->len++] = ':'; - replace->str[replace->len++] = ' '; - replace->len += build_logline(s, replace->str + replace->len, replace->size - replace->len, - &rule->arg.hdr_add.fmt); + memcpy(replace->area, rule->arg.hdr_add.name, + rule->arg.hdr_add.name_len); + replace->data = rule->arg.hdr_add.name_len; + replace->area[replace->data++] = ':'; + replace->area[replace->data++] = ' '; + replace->data += build_logline(s, + replace->area + replace->data, + replace->size - replace->data, + &rule->arg.hdr_add.fmt); if (rule->action == ACT_HTTP_SET_HDR) { /* remove all occurrences of the header */ @@ -2937,12 +2955,13 @@ resume_execution: } } - if (http_header_add_tail2(&txn->rsp, &txn->hdr_idx, replace->str, replace->len) < 0) { + if (http_header_add_tail2(&txn->rsp, &txn->hdr_idx, replace->area, replace->data) < 0) { static unsigned char rate_limit = 0; if ((rate_limit++ & 255) == 0) { - replace->str[rule->arg.hdr_add.name_len] = 0; - send_log(px, LOG_WARNING, "Proxy %s failed to add or set the response header '%s' for request #%u. You might need to increase tune.maxrewrite.", px->id, replace->str, s->uniq_id); + replace->area[rule->arg.hdr_add.name_len] = 0; + send_log(px, LOG_WARNING, "Proxy %s failed to add or set the response header '%s' for request #%u. You might need to increase tune.maxrewrite.", px->id, + replace->area, s->uniq_id); } HA_ATOMIC_ADD(&sess->fe->fe_counters.failed_rewrites, 1); @@ -2974,13 +2993,14 @@ resume_execution: return HTTP_RULE_RES_BADREQ; /* collect key */ - key->len = build_logline(s, key->str, key->size, &rule->arg.map.key); - key->str[key->len] = '\0'; + key->data = build_logline(s, key->area, key->size, + &rule->arg.map.key); + key->area[key->data] = '\0'; /* perform update */ /* returned code: 1=ok, 0=ko */ HA_SPIN_LOCK(PATREF_LOCK, &ref->lock); - pat_ref_delete(ref, key->str); + pat_ref_delete(ref, key->area); HA_SPIN_UNLOCK(PATREF_LOCK, &ref->lock); free_trash_chunk(key); @@ -3002,13 +3022,14 @@ resume_execution: return HTTP_RULE_RES_BADREQ; /* collect key */ - key->len = build_logline(s, key->str, key->size, &rule->arg.map.key); - key->str[key->len] = '\0'; + key->data = build_logline(s, key->area, key->size, + &rule->arg.map.key); + key->area[key->data] = '\0'; /* perform update */ /* check if the entry already exists */ - if (pat_ref_find_elt(ref, key->str) == NULL) - pat_ref_add(ref, key->str, NULL, NULL); + if (pat_ref_find_elt(ref, key->area) == NULL) + pat_ref_add(ref, key->area, NULL, NULL); free_trash_chunk(key); break; @@ -3036,21 +3057,24 @@ resume_execution: } /* collect key */ - key->len = build_logline(s, key->str, key->size, &rule->arg.map.key); - key->str[key->len] = '\0'; + key->data = build_logline(s, key->area, key->size, + &rule->arg.map.key); + key->area[key->data] = '\0'; /* collect value */ - value->len = build_logline(s, value->str, value->size, &rule->arg.map.value); - value->str[value->len] = '\0'; + value->data = build_logline(s, value->area, + value->size, + &rule->arg.map.value); + value->area[value->data] = '\0'; /* perform update */ HA_SPIN_LOCK(PATREF_LOCK, &ref->lock); - if (pat_ref_find_elt(ref, key->str) != NULL) + if (pat_ref_find_elt(ref, key->area) != NULL) /* update entry if it exists */ - pat_ref_set(ref, key->str, value->str, NULL); + pat_ref_set(ref, key->area, value->area, NULL); else /* insert a new entry */ - pat_ref_add(ref, key->str, value->str, NULL); + pat_ref_add(ref, key->area, value->area, NULL); HA_SPIN_UNLOCK(PATREF_LOCK, &ref->lock); free_trash_chunk(key); free_trash_chunk(value); @@ -3228,40 +3252,44 @@ static int http_apply_redirect_rule(struct redirect_rule *rule, struct stream *s if (rule->rdr_str) { /* this is an old "redirect" rule */ /* check if we can add scheme + "://" + host + path */ - if (chunk->len + rule->rdr_len + 3 + hostlen + pathlen > chunk->size - 4) + if (chunk->data + rule->rdr_len + 3 + hostlen + pathlen > chunk->size - 4) goto leave; /* add scheme */ - memcpy(chunk->str + chunk->len, rule->rdr_str, rule->rdr_len); - chunk->len += rule->rdr_len; + memcpy(chunk->area + chunk->data, rule->rdr_str, + rule->rdr_len); + chunk->data += rule->rdr_len; } else { /* add scheme with executing log format */ - chunk->len += build_logline(s, chunk->str + chunk->len, chunk->size - chunk->len, &rule->rdr_fmt); + chunk->data += build_logline(s, + chunk->area + chunk->data, + chunk->size - chunk->data, + &rule->rdr_fmt); /* check if we can add scheme + "://" + host + path */ - if (chunk->len + 3 + hostlen + pathlen > chunk->size - 4) + if (chunk->data + 3 + hostlen + pathlen > chunk->size - 4) goto leave; } /* add "://" */ - memcpy(chunk->str + chunk->len, "://", 3); - chunk->len += 3; + memcpy(chunk->area + chunk->data, "://", 3); + chunk->data += 3; /* add host */ - memcpy(chunk->str + chunk->len, host, hostlen); - chunk->len += hostlen; + memcpy(chunk->area + chunk->data, host, hostlen); + chunk->data += hostlen; /* add path */ - memcpy(chunk->str + chunk->len, path, pathlen); - chunk->len += pathlen; + memcpy(chunk->area + chunk->data, path, pathlen); + chunk->data += pathlen; /* append a slash at the end of the location if needed and missing */ - if (chunk->len && chunk->str[chunk->len - 1] != '/' && + if (chunk->data && chunk->area[chunk->data - 1] != '/' && (rule->flags & REDIRECT_FLAG_APPEND_SLASH)) { - if (chunk->len > chunk->size - 5) + if (chunk->data > chunk->size - 5) goto leave; - chunk->str[chunk->len] = '/'; - chunk->len++; + chunk->area[chunk->data] = '/'; + chunk->data++; } break; @@ -3290,7 +3318,7 @@ static int http_apply_redirect_rule(struct redirect_rule *rule, struct stream *s } if (rule->rdr_str) { /* this is an old "redirect" rule */ - if (chunk->len + rule->rdr_len + pathlen > chunk->size - 4) + if (chunk->data + rule->rdr_len + pathlen > chunk->size - 4) goto leave; /* add prefix. Note that if prefix == "/", we don't want to @@ -3298,30 +3326,34 @@ static int http_apply_redirect_rule(struct redirect_rule *rule, struct stream *s * configure a self-redirection. */ if (rule->rdr_len != 1 || *rule->rdr_str != '/') { - memcpy(chunk->str + chunk->len, rule->rdr_str, rule->rdr_len); - chunk->len += rule->rdr_len; + memcpy(chunk->area + chunk->data, + rule->rdr_str, rule->rdr_len); + chunk->data += rule->rdr_len; } } else { /* add prefix with executing log format */ - chunk->len += build_logline(s, chunk->str + chunk->len, chunk->size - chunk->len, &rule->rdr_fmt); + chunk->data += build_logline(s, + chunk->area + chunk->data, + chunk->size - chunk->data, + &rule->rdr_fmt); /* Check length */ - if (chunk->len + pathlen > chunk->size - 4) + if (chunk->data + pathlen > chunk->size - 4) goto leave; } /* add path */ - memcpy(chunk->str + chunk->len, path, pathlen); - chunk->len += pathlen; + memcpy(chunk->area + chunk->data, path, pathlen); + chunk->data += pathlen; /* append a slash at the end of the location if needed and missing */ - if (chunk->len && chunk->str[chunk->len - 1] != '/' && + if (chunk->data && chunk->area[chunk->data - 1] != '/' && (rule->flags & REDIRECT_FLAG_APPEND_SLASH)) { - if (chunk->len > chunk->size - 5) + if (chunk->data > chunk->size - 5) goto leave; - chunk->str[chunk->len] = '/'; - chunk->len++; + chunk->area[chunk->data] = '/'; + chunk->data++; } break; @@ -3329,29 +3361,34 @@ static int http_apply_redirect_rule(struct redirect_rule *rule, struct stream *s case REDIRECT_TYPE_LOCATION: default: if (rule->rdr_str) { /* this is an old "redirect" rule */ - if (chunk->len + rule->rdr_len > chunk->size - 4) + if (chunk->data + rule->rdr_len > chunk->size - 4) goto leave; /* add location */ - memcpy(chunk->str + chunk->len, rule->rdr_str, rule->rdr_len); - chunk->len += rule->rdr_len; + memcpy(chunk->area + chunk->data, rule->rdr_str, + rule->rdr_len); + chunk->data += rule->rdr_len; } else { /* add location with executing log format */ - chunk->len += build_logline(s, chunk->str + chunk->len, chunk->size - chunk->len, &rule->rdr_fmt); + chunk->data += build_logline(s, + chunk->area + chunk->data, + chunk->size - chunk->data, + &rule->rdr_fmt); /* Check left length */ - if (chunk->len > chunk->size - 4) + if (chunk->data > chunk->size - 4) goto leave; } break; } if (rule->cookie_len) { - memcpy(chunk->str + chunk->len, "\r\nSet-Cookie: ", 14); - chunk->len += 14; - memcpy(chunk->str + chunk->len, rule->cookie_str, rule->cookie_len); - chunk->len += rule->cookie_len; + memcpy(chunk->area + chunk->data, "\r\nSet-Cookie: ", 14); + chunk->data += 14; + memcpy(chunk->area + chunk->data, rule->cookie_str, + rule->cookie_len); + chunk->data += rule->cookie_len; } /* add end of headers and the keep-alive/close status. */ @@ -3365,17 +3402,19 @@ static int http_apply_redirect_rule(struct redirect_rule *rule, struct stream *s /* keep-alive possible */ if (!(req->flags & HTTP_MSGF_VER_11)) { if (unlikely(txn->flags & TX_USE_PX_CONN)) { - memcpy(chunk->str + chunk->len, "\r\nProxy-Connection: keep-alive", 30); - chunk->len += 30; + memcpy(chunk->area + chunk->data, + "\r\nProxy-Connection: keep-alive", 30); + chunk->data += 30; } else { - memcpy(chunk->str + chunk->len, "\r\nConnection: keep-alive", 24); - chunk->len += 24; + memcpy(chunk->area + chunk->data, + "\r\nConnection: keep-alive", 24); + chunk->data += 24; } } - memcpy(chunk->str + chunk->len, "\r\n\r\n", 4); - chunk->len += 4; + memcpy(chunk->area + chunk->data, "\r\n\r\n", 4); + chunk->data += 4; FLT_STRM_CB(s, flt_http_reply(s, txn->status, chunk)); - co_inject(res->chn, chunk->str, chunk->len); + co_inject(res->chn, chunk->area, chunk->data); /* "eat" the request */ b_del(&req->chn->buf, req->sov); req->next -= req->sov; @@ -3392,11 +3431,13 @@ static int http_apply_redirect_rule(struct redirect_rule *rule, struct stream *s } else { /* keep-alive not possible */ if (unlikely(txn->flags & TX_USE_PX_CONN)) { - memcpy(chunk->str + chunk->len, "\r\nProxy-Connection: close\r\n\r\n", 29); - chunk->len += 29; + memcpy(chunk->area + chunk->data, + "\r\nProxy-Connection: close\r\n\r\n", 29); + chunk->data += 29; } else { - memcpy(chunk->str + chunk->len, "\r\nConnection: close\r\n\r\n", 23); - chunk->len += 23; + memcpy(chunk->area + chunk->data, + "\r\nConnection: close\r\n\r\n", 23); + chunk->data += 23; } http_reply_and_close(s, txn->status, chunk); req->chn->analysers &= AN_REQ_FLT_END; @@ -3805,9 +3846,9 @@ int http_process_request(struct stream *s, struct channel *req, int an_bit) if (sess->fe->header_unique_id && s->unique_id) { chunk_printf(&trash, "%s: %s", sess->fe->header_unique_id, s->unique_id); - if (trash.len < 0) + if (trash.data < 0) goto return_bad_req; - if (unlikely(http_header_add_tail2(&txn->req, &txn->hdr_idx, trash.str, trash.len) < 0)) + if (unlikely(http_header_add_tail2(&txn->req, &txn->hdr_idx, trash.area, trash.data) < 0)) goto return_bad_req; } @@ -3846,14 +3887,19 @@ int http_process_request(struct stream *s, struct channel *req, int an_bit) */ if (s->be->fwdfor_hdr_len) { len = s->be->fwdfor_hdr_len; - memcpy(trash.str, s->be->fwdfor_hdr_name, len); + memcpy(trash.area, + s->be->fwdfor_hdr_name, len); } else { len = sess->fe->fwdfor_hdr_len; - memcpy(trash.str, sess->fe->fwdfor_hdr_name, len); + memcpy(trash.area, + sess->fe->fwdfor_hdr_name, len); } - len += snprintf(trash.str + len, trash.size - len, ": %d.%d.%d.%d", pn[0], pn[1], pn[2], pn[3]); + len += snprintf(trash.area + len, + trash.size - len, + ": %d.%d.%d.%d", pn[0], pn[1], + pn[2], pn[3]); - if (unlikely(http_header_add_tail2(&txn->req, &txn->hdr_idx, trash.str, len) < 0)) + if (unlikely(http_header_add_tail2(&txn->req, &txn->hdr_idx, trash.area, len) < 0)) goto return_bad_req; } } @@ -3874,14 +3920,17 @@ int http_process_request(struct stream *s, struct channel *req, int an_bit) */ if (s->be->fwdfor_hdr_len) { len = s->be->fwdfor_hdr_len; - memcpy(trash.str, s->be->fwdfor_hdr_name, len); + memcpy(trash.area, s->be->fwdfor_hdr_name, + len); } else { len = sess->fe->fwdfor_hdr_len; - memcpy(trash.str, sess->fe->fwdfor_hdr_name, len); + memcpy(trash.area, sess->fe->fwdfor_hdr_name, + len); } - len += snprintf(trash.str + len, trash.size - len, ": %s", pn); + len += snprintf(trash.area + len, trash.size - len, + ": %s", pn); - if (unlikely(http_header_add_tail2(&txn->req, &txn->hdr_idx, trash.str, len) < 0)) + if (unlikely(http_header_add_tail2(&txn->req, &txn->hdr_idx, trash.area, len) < 0)) goto return_bad_req; } } @@ -3917,14 +3966,19 @@ int http_process_request(struct stream *s, struct channel *req, int an_bit) */ if (s->be->orgto_hdr_len) { len = s->be->orgto_hdr_len; - memcpy(trash.str, s->be->orgto_hdr_name, len); + memcpy(trash.area, + s->be->orgto_hdr_name, len); } else { len = sess->fe->orgto_hdr_len; - memcpy(trash.str, sess->fe->orgto_hdr_name, len); + memcpy(trash.area, + sess->fe->orgto_hdr_name, len); } - len += snprintf(trash.str + len, trash.size - len, ": %d.%d.%d.%d", pn[0], pn[1], pn[2], pn[3]); + len += snprintf(trash.area + len, + trash.size - len, + ": %d.%d.%d.%d", pn[0], pn[1], + pn[2], pn[3]); - if (unlikely(http_header_add_tail2(&txn->req, &txn->hdr_idx, trash.str, len) < 0)) + if (unlikely(http_header_add_tail2(&txn->req, &txn->hdr_idx, trash.area, len) < 0)) goto return_bad_req; } } @@ -4097,7 +4151,9 @@ int http_wait_for_request_body(struct stream *s, struct channel *req, int an_bit /* Expect is allowed in 1.1, look for it */ if (http_find_header2("Expect", 6, ci_head(req), &txn->hdr_idx, &ctx) && unlikely(ctx.vlen == 12 && strncasecmp(ctx.line+ctx.val, "100-continue", 12) == 0)) { - co_inject(&s->res, http_100_chunk.str, http_100_chunk.len); + co_inject(&s->res, + http_100_chunk.area, + http_100_chunk.data); http_remove_header2(&txn->req, &txn->hdr_idx, &ctx); } } @@ -4255,13 +4311,15 @@ int http_send_name_header(struct http_txn *txn, struct proxy* be, const char* sr } /* Add the new header requested with the server value */ - hdr_val = trash.str; + hdr_val = trash.area; memcpy(hdr_val, hdr_name, hdr_name_len); hdr_val += hdr_name_len; *hdr_val++ = ':'; *hdr_val++ = ' '; - hdr_val += strlcpy2(hdr_val, srv_name, trash.str + trash.size - hdr_val); - http_header_add_tail2(&txn->req, &txn->hdr_idx, trash.str, hdr_val - trash.str); + hdr_val += strlcpy2(hdr_val, srv_name, + trash.area + trash.size - hdr_val); + http_header_add_tail2(&txn->req, &txn->hdr_idx, trash.area, + hdr_val - trash.area); if (old_o) { /* If this was a forwarded request, we must readjust the amount of @@ -5131,7 +5189,7 @@ int http_wait_for_response(struct stream *s, struct channel *rep, int an_bit) if (unlikely(ci_tail(rep) < c_ptr(rep, msg->next) || ci_tail(rep) > b_wrap(&rep->buf) - global.tune.maxrewrite)) - channel_slow_realign(rep, trash.str); + channel_slow_realign(rep, trash.area); if (likely(msg->next < ci_data(rep))) http_msg_analyzer(msg, &txn->hdr_idx); @@ -5897,19 +5955,21 @@ int http_process_res_common(struct stream *s, struct channel *rep, int an_bit, s if (s->be->cookie_maxidle || s->be->cookie_maxlife) { /* emit last_date, which is mandatory */ - trash.str[trash.len++] = COOKIE_DELIM_DATE; - s30tob64((date.tv_sec+3) >> 2, trash.str + trash.len); - trash.len += 5; + trash.area[trash.data++] = COOKIE_DELIM_DATE; + s30tob64((date.tv_sec+3) >> 2, + trash.area + trash.data); + trash.data += 5; if (s->be->cookie_maxlife) { /* emit first_date, which is either the original one or * the current date. */ - trash.str[trash.len++] = COOKIE_DELIM_DATE; + trash.area[trash.data++] = COOKIE_DELIM_DATE; s30tob64(txn->cookie_first_date ? txn->cookie_first_date >> 2 : - (date.tv_sec+3) >> 2, trash.str + trash.len); - trash.len += 5; + (date.tv_sec+3) >> 2, + trash.area + trash.data); + trash.data += 5; } } chunk_appendf(&trash, "; path=/"); @@ -5924,7 +5984,7 @@ int http_process_res_common(struct stream *s, struct channel *rep, int an_bit, s if (s->be->ck_opts & PR_CK_SECURE) chunk_appendf(&trash, "; Secure"); - if (unlikely(http_header_add_tail2(&txn->rsp, &txn->hdr_idx, trash.str, trash.len) < 0)) + if (unlikely(http_header_add_tail2(&txn->rsp, &txn->hdr_idx, trash.area, trash.data) < 0)) goto return_bad_resp; txn->flags &= ~TX_SCK_MASK; @@ -6512,11 +6572,14 @@ int apply_filter_to_req_headers(struct stream *s, struct channel *req, struct hd break; case ACT_REPLACE: - trash.len = exp_replace(trash.str, trash.size, cur_ptr, exp->replace, pmatch); - if (trash.len < 0) + trash.data = exp_replace(trash.area, + trash.size, cur_ptr, + exp->replace, pmatch); + if (trash.data < 0) return -1; - delta = b_rep_blk(&req->buf, cur_ptr, cur_end, trash.str, trash.len); + delta = b_rep_blk(&req->buf, cur_ptr, cur_end, + trash.area, trash.data); /* FIXME: if the user adds a newline in the replacement, the * index will not be recalculated for now, and the new line * will not be counted as a new header. @@ -6600,11 +6663,13 @@ int apply_filter_to_req_line(struct stream *s, struct channel *req, struct hdr_e break; case ACT_REPLACE: - trash.len = exp_replace(trash.str, trash.size, cur_ptr, exp->replace, pmatch); - if (trash.len < 0) + trash.data = exp_replace(trash.area, trash.size, + cur_ptr, exp->replace, pmatch); + if (trash.data < 0) return -1; - delta = b_rep_blk(&req->buf, cur_ptr, cur_end, trash.str, trash.len); + delta = b_rep_blk(&req->buf, cur_ptr, cur_end, + trash.area, trash.data); /* FIXME: if the user adds a newline in the replacement, the * index will not be recalculated for now, and the new line * will not be counted as a new header. @@ -7248,11 +7313,14 @@ int apply_filter_to_resp_headers(struct stream *s, struct channel *rtr, struct h break; case ACT_REPLACE: - trash.len = exp_replace(trash.str, trash.size, cur_ptr, exp->replace, pmatch); - if (trash.len < 0) + trash.data = exp_replace(trash.area, + trash.size, cur_ptr, + exp->replace, pmatch); + if (trash.data < 0) return -1; - delta = b_rep_blk(&rtr->buf, cur_ptr, cur_end, trash.str, trash.len); + delta = b_rep_blk(&rtr->buf, cur_ptr, cur_end, + trash.area, trash.data); /* FIXME: if the user adds a newline in the replacement, the * index will not be recalculated for now, and the new line * will not be counted as a new header. @@ -7329,11 +7397,13 @@ int apply_filter_to_sts_line(struct stream *s, struct channel *rtr, struct hdr_e break; case ACT_REPLACE: - trash.len = exp_replace(trash.str, trash.size, cur_ptr, exp->replace, pmatch); - if (trash.len < 0) + trash.data = exp_replace(trash.area, trash.size, + cur_ptr, exp->replace, pmatch); + if (trash.data < 0) return -1; - delta = b_rep_blk(&rtr->buf, cur_ptr, cur_end, trash.str, trash.len); + delta = b_rep_blk(&rtr->buf, cur_ptr, cur_end, + trash.area, trash.data); /* FIXME: if the user adds a newline in the replacement, the * index will not be recalculated for now, and the new line * will not be counted as a new header. @@ -8009,11 +8079,11 @@ void http_capture_bad_message(struct proxy *proxy, struct error_snapshot *es, st */ unsigned int http_get_hdr(const struct http_msg *msg, const char *hname, int hlen, struct hdr_idx *idx, int occ, - struct hdr_ctx *ctx, char **vptr, int *vlen) + struct hdr_ctx *ctx, char **vptr, size_t *vlen) { struct hdr_ctx local_ctx; char *ptr_hist[MAX_HDR_HISTORY]; - int len_hist[MAX_HDR_HISTORY]; + unsigned int len_hist[MAX_HDR_HISTORY]; unsigned int hist_ptr; int found; @@ -8075,11 +8145,11 @@ unsigned int http_get_hdr(const struct http_msg *msg, const char *hname, int hle */ unsigned int http_get_fhdr(const struct http_msg *msg, const char *hname, int hlen, struct hdr_idx *idx, int occ, - struct hdr_ctx *ctx, char **vptr, int *vlen) + struct hdr_ctx *ctx, char **vptr, size_t *vlen) { struct hdr_ctx local_ctx; char *ptr_hist[MAX_HDR_HISTORY]; - int len_hist[MAX_HDR_HISTORY]; + unsigned int len_hist[MAX_HDR_HISTORY]; unsigned int hist_ptr; int found; @@ -8148,10 +8218,10 @@ void debug_hdr(const char *dir, struct stream *s, const char *start, const char if (start[max] == '\r' || start[max] == '\n') break; - UBOUND(max, trash.size - trash.len - 3); - trash.len += strlcpy2(trash.str + trash.len, start, max + 1); - trash.str[trash.len++] = '\n'; - shut_your_big_mouth_gcc(write(1, trash.str, trash.len)); + UBOUND(max, trash.size - trash.data - 3); + trash.data += strlcpy2(trash.area + trash.data, start, max + 1); + trash.area[trash.data++] = '\n'; + shut_your_big_mouth_gcc(write(1, trash.area, trash.data)); } @@ -8816,7 +8886,8 @@ struct act_rule *parse_http_req_cond(const char **args, const char *file, int li "'tarpit', 'add-header', 'set-header', 'replace-header', 'replace-value', 'set-nice', " "'set-tos', 'set-mark', 'set-log-level', 'add-acl', 'del-acl', 'del-map', 'set-map', 'track-sc*'" "%s%s, but got '%s'%s.\n", - file, linenum, *trash.str ? ", " : "", trash.str, args[0], *args[0] ? "" : " (missing argument)"); + file, linenum, *trash.area ? ", " : "", trash.area, + args[0], *args[0] ? "" : " (missing argument)"); goto out_err; } @@ -9268,7 +9339,8 @@ struct act_rule *parse_http_res_cond(const char **args, const char *file, int li "'add-header', 'del-header', 'set-header', 'replace-header', 'replace-value', 'set-nice', " "'set-tos', 'set-mark', 'set-log-level', 'add-acl', 'del-acl', 'del-map', 'set-map', 'track-sc*'" "%s%s, but got '%s'%s.\n", - file, linenum, *trash.str ? ", " : "", trash.str, args[0], *args[0] ? "" : " (missing argument)"); + file, linenum, *trash.area ? ", " : "", trash.area, + args[0], *args[0] ? "" : " (missing argument)"); goto out_err; } @@ -9509,7 +9581,7 @@ int smp_prefetch_http(struct proxy *px, struct stream *s, unsigned int opt, */ if (ci_head(&s->req) > b_orig(&s->req.buf) && ci_head(&s->req) + ci_data(&s->req) > b_wrap(&s->req.buf) - global.tune.maxrewrite) - channel_slow_realign(&s->req, trash.str); + channel_slow_realign(&s->req, trash.area); if (unlikely(txn->req.msg_state < HTTP_MSG_BODY)) { if (msg->msg_state == HTTP_MSG_ERROR) @@ -9623,8 +9695,8 @@ smp_fetch_meth(const struct arg *args, struct sample *smp, const char *kw, void /* ensure the indexes are not affected */ return 0; smp->flags |= SMP_F_CONST; - smp->data.u.meth.str.len = txn->req.sl.rq.m_l; - smp->data.u.meth.str.str = ci_head(txn->req.chn); + smp->data.u.meth.str.data = txn->req.sl.rq.m_l; + smp->data.u.meth.str.area = ci_head(txn->req.chn); } smp->flags |= SMP_F_VOL_1ST; return 1; @@ -9649,12 +9721,12 @@ static struct pattern *pat_match_meth(struct sample *smp, struct pattern_expr *e } /* Other method, we must compare the strings */ - if (pattern->len != smp->data.u.meth.str.len) + if (pattern->len != smp->data.u.meth.str.data) continue; icase = expr->mflags & PAT_MF_IGNORE_CASE; - if ((icase && strncasecmp(pattern->ptr.str, smp->data.u.meth.str.str, smp->data.u.meth.str.len) == 0) || - (!icase && strncmp(pattern->ptr.str, smp->data.u.meth.str.str, smp->data.u.meth.str.len) == 0)) + if ((icase && strncasecmp(pattern->ptr.str, smp->data.u.meth.str.area, smp->data.u.meth.str.data) == 0) || + (!icase && strncmp(pattern->ptr.str, smp->data.u.meth.str.area, smp->data.u.meth.str.data) == 0)) return pattern; } return NULL; @@ -9678,8 +9750,8 @@ smp_fetch_rqver(const struct arg *args, struct sample *smp, const char *kw, void return 0; smp->data.type = SMP_T_STR; - smp->data.u.str.str = ptr; - smp->data.u.str.len = len; + smp->data.u.str.area = ptr; + smp->data.u.str.data = len; smp->flags = SMP_F_VOL_1ST | SMP_F_CONST; return 1; @@ -9706,8 +9778,8 @@ smp_fetch_stver(const struct arg *args, struct sample *smp, const char *kw, void return 0; smp->data.type = SMP_T_STR; - smp->data.u.str.str = ptr; - smp->data.u.str.len = len; + smp->data.u.str.area = ptr; + smp->data.u.str.data = len; smp->flags = SMP_F_VOL_1ST | SMP_F_CONST; return 1; @@ -9747,11 +9819,11 @@ smp_fetch_uniqueid(const struct arg *args, struct sample *smp, const char *kw, v return 0; smp->strm->unique_id[0] = '\0'; } - smp->data.u.str.len = build_logline(smp->strm, smp->strm->unique_id, + smp->data.u.str.data = build_logline(smp->strm, smp->strm->unique_id, UNIQUEID_LEN, &smp->sess->fe->format_unique_id); smp->data.type = SMP_T_STR; - smp->data.u.str.str = smp->strm->unique_id; + smp->data.u.str.area = smp->strm->unique_id; smp->flags = SMP_F_CONST; return 1; } @@ -9774,8 +9846,8 @@ smp_fetch_hdrs(const struct arg *args, struct sample *smp, const char *kw, void msg = &txn->req; smp->data.type = SMP_T_STR; - smp->data.u.str.str = ci_head(msg->chn) + hdr_idx_first_pos(idx); - smp->data.u.str.len = msg->eoh - hdr_idx_first_pos(idx) + 1 + + smp->data.u.str.area = ci_head(msg->chn) + hdr_idx_first_pos(idx); + smp->data.u.str.data = msg->eoh - hdr_idx_first_pos(idx) + 1 + (ci_head(msg->chn)[msg->eoh] == '\r'); return 1; @@ -9813,8 +9885,8 @@ smp_fetch_hdrs_bin(const struct arg *args, struct sample *smp, const char *kw, v CHECK_HTTP_MESSAGE_FIRST(); temp = get_trash_chunk(); - buf = temp->str; - end = temp->str + temp->size; + buf = temp->area; + end = temp->area + temp->size; txn = smp->strm->txn; idx = &txn->hdr_idx; @@ -9884,8 +9956,8 @@ smp_fetch_hdrs_bin(const struct arg *args, struct sample *smp, const char *kw, v /* Initialise sample data which will be filled. */ smp->data.type = SMP_T_BIN; - smp->data.u.str.str = temp->str; - smp->data.u.str.len = buf - temp->str; + smp->data.u.str.area = temp->area; + smp->data.u.str.data = buf - temp->area; smp->data.u.str.size = temp->size; return 1; @@ -9920,18 +9992,19 @@ smp_fetch_body(const struct arg *args, struct sample *smp, const char *kw, void if (block1 == len) { /* buffer is not wrapped (or empty) */ smp->data.type = SMP_T_BIN; - smp->data.u.str.str = body; - smp->data.u.str.len = len; + smp->data.u.str.area = body; + smp->data.u.str.data = len; smp->flags = SMP_F_VOL_TEST | SMP_F_CONST; } else { /* buffer is wrapped, we need to defragment it */ temp = get_trash_chunk(); - memcpy(temp->str, body, block1); - memcpy(temp->str + block1, b_orig(&msg->chn->buf), len - block1); + memcpy(temp->area, body, block1); + memcpy(temp->area + block1, b_orig(&msg->chn->buf), + len - block1); smp->data.type = SMP_T_BIN; - smp->data.u.str.str = temp->str; - smp->data.u.str.len = len; + smp->data.u.str.area = temp->area; + smp->data.u.str.data = len; smp->flags = SMP_F_VOL_TEST; } return 1; @@ -9995,8 +10068,8 @@ smp_fetch_url(const struct arg *args, struct sample *smp, const char *kw, void * txn = smp->strm->txn; smp->data.type = SMP_T_STR; - smp->data.u.str.len = txn->req.sl.rq.u_l; - smp->data.u.str.str = ci_head(txn->req.chn) + txn->req.sl.rq.u; + smp->data.u.str.data = txn->req.sl.rq.u_l; + smp->data.u.str.area = ci_head(txn->req.chn) + txn->req.sl.rq.u; smp->flags = SMP_F_VOL_1ST | SMP_F_CONST; return 1; } @@ -10066,8 +10139,8 @@ smp_fetch_fhdr(const struct arg *args, struct sample *smp, const char *kw, void if (args) { if (args[0].type != ARGT_STR) return 0; - name_str = args[0].data.str.str; - name_len = args[0].data.str.len; + name_str = args[0].data.str.area; + name_len = args[0].data.str.data; if (args[1].type == ARGT_SINT) occ = args[1].data.sint; @@ -10092,7 +10165,7 @@ smp_fetch_fhdr(const struct arg *args, struct sample *smp, const char *kw, void smp->data.type = SMP_T_STR; smp->flags |= SMP_F_VOL_HDR | SMP_F_CONST; - if (http_get_fhdr(msg, name_str, name_len, idx, occ, ctx, &smp->data.u.str.str, &smp->data.u.str.len)) + if (http_get_fhdr(msg, name_str, name_len, idx, occ, ctx, &smp->data.u.str.area, &smp->data.u.str.data)) return 1; smp->flags &= ~SMP_F_NOT_LAST; @@ -10114,8 +10187,8 @@ smp_fetch_fhdr_cnt(const struct arg *args, struct sample *smp, const char *kw, v int len = 0; if (args && args->type == ARGT_STR) { - name = args->data.str.str; - len = args->data.str.len; + name = args->data.str.area; + len = args->data.str.data; } CHECK_HTTP_MESSAGE_FIRST(); @@ -10144,7 +10217,7 @@ smp_fetch_hdr_names(const struct arg *args, struct sample *smp, const char *kw, char del = ','; if (args && args->type == ARGT_STR) - del = *args[0].data.str.str; + del = *args[0].data.str.area; CHECK_HTTP_MESSAGE_FIRST(); @@ -10155,15 +10228,15 @@ smp_fetch_hdr_names(const struct arg *args, struct sample *smp, const char *kw, ctx.idx = 0; while (http_find_next_header(ci_head(msg->chn), idx, &ctx)) { - if (temp->len) - temp->str[temp->len++] = del; - memcpy(temp->str + temp->len, ctx.line, ctx.del); - temp->len += ctx.del; + if (temp->data) + temp->area[temp->data++] = del; + memcpy(temp->area + temp->data, ctx.line, ctx.del); + temp->data += ctx.del; } smp->data.type = SMP_T_STR; - smp->data.u.str.str = temp->str; - smp->data.u.str.len = temp->len; + smp->data.u.str.area = temp->area; + smp->data.u.str.data = temp->data; smp->flags = SMP_F_VOL_HDR; return 1; } @@ -10194,8 +10267,8 @@ smp_fetch_hdr(const struct arg *args, struct sample *smp, const char *kw, void * if (args) { if (args[0].type != ARGT_STR) return 0; - name_str = args[0].data.str.str; - name_len = args[0].data.str.len; + name_str = args[0].data.str.area; + name_len = args[0].data.str.data; if (args[1].type == ARGT_SINT) occ = args[1].data.sint; @@ -10220,7 +10293,7 @@ smp_fetch_hdr(const struct arg *args, struct sample *smp, const char *kw, void * smp->data.type = SMP_T_STR; smp->flags |= SMP_F_VOL_HDR | SMP_F_CONST; - if (http_get_hdr(msg, name_str, name_len, idx, occ, ctx, &smp->data.u.str.str, &smp->data.u.str.len)) + if (http_get_hdr(msg, name_str, name_len, idx, occ, ctx, &smp->data.u.str.area, &smp->data.u.str.data)) return 1; smp->flags &= ~SMP_F_NOT_LAST; @@ -10241,8 +10314,8 @@ smp_fetch_hdr_cnt(const struct arg *args, struct sample *smp, const char *kw, vo int len = 0; if (args && args->type == ARGT_STR) { - name = args->data.str.str; - len = args->data.str.len; + name = args->data.str.area; + len = args->data.str.data; } CHECK_HTTP_MESSAGE_FIRST(); @@ -10273,7 +10346,8 @@ smp_fetch_hdr_val(const struct arg *args, struct sample *smp, const char *kw, vo if (ret > 0) { smp->data.type = SMP_T_SINT; - smp->data.u.sint = strl2ic(smp->data.u.str.str, smp->data.u.str.len); + smp->data.u.sint = strl2ic(smp->data.u.str.area, + smp->data.u.str.data); } return ret; @@ -10289,15 +10363,16 @@ smp_fetch_hdr_ip(const struct arg *args, struct sample *smp, const char *kw, voi int ret; while ((ret = smp_fetch_hdr(args, smp, kw, private)) > 0) { - if (url2ipv4((char *)smp->data.u.str.str, &smp->data.u.ipv4)) { + if (url2ipv4((char *) smp->data.u.str.area, &smp->data.u.ipv4)) { smp->data.type = SMP_T_IPV4; break; } else { struct chunk *temp = get_trash_chunk(); - if (smp->data.u.str.len < temp->size - 1) { - memcpy(temp->str, smp->data.u.str.str, smp->data.u.str.len); - temp->str[smp->data.u.str.len] = '\0'; - if (inet_pton(AF_INET6, temp->str, &smp->data.u.ipv6)) { + if (smp->data.u.str.data < temp->size - 1) { + memcpy(temp->area, smp->data.u.str.area, + smp->data.u.str.data); + temp->area[smp->data.u.str.data] = '\0'; + if (inet_pton(AF_INET6, temp->area, &smp->data.u.ipv6)) { smp->data.type = SMP_T_IPV6; break; } @@ -10330,12 +10405,12 @@ smp_fetch_path(const struct arg *args, struct sample *smp, const char *kw, void /* OK, we got the '/' ! */ smp->data.type = SMP_T_STR; - smp->data.u.str.str = ptr; + smp->data.u.str.area = ptr; while (ptr < end && *ptr != '?') ptr++; - smp->data.u.str.len = ptr - smp->data.u.str.str; + smp->data.u.str.data = ptr - smp->data.u.str.area; smp->flags = SMP_F_VOL_1ST | SMP_F_CONST; return 1; } @@ -10364,10 +10439,10 @@ smp_fetch_base(const struct arg *args, struct sample *smp, const char *kw, void /* OK we have the header value in ctx.line+ctx.val for ctx.vlen bytes */ temp = get_trash_chunk(); - memcpy(temp->str, ctx.line + ctx.val, ctx.vlen); + memcpy(temp->area, ctx.line + ctx.val, ctx.vlen); smp->data.type = SMP_T_STR; - smp->data.u.str.str = temp->str; - smp->data.u.str.len = ctx.vlen; + smp->data.u.str.area = temp->area; + smp->data.u.str.data = ctx.vlen; /* now retrieve the path */ end = ci_head(txn->req.chn) + txn->req.sl.rq.u + txn->req.sl.rq.u_l; @@ -10378,8 +10453,9 @@ smp_fetch_base(const struct arg *args, struct sample *smp, const char *kw, void for (ptr = beg; ptr < end && *ptr != '?'; ptr++); if (beg < ptr && *beg == '/') { - memcpy(smp->data.u.str.str + smp->data.u.str.len, beg, ptr - beg); - smp->data.u.str.len += ptr - beg; + memcpy(smp->data.u.str.area + smp->data.u.str.data, beg, + ptr - beg); + smp->data.u.str.data += ptr - beg; } smp->flags = SMP_F_VOL_1ST; @@ -10455,17 +10531,21 @@ smp_fetch_base32_src(const struct arg *args, struct sample *smp, const char *kw, return 0; temp = get_trash_chunk(); - *(unsigned int *)temp->str = htonl(smp->data.u.sint); - temp->len += sizeof(unsigned int); + *(unsigned int *) temp->area = htonl(smp->data.u.sint); + temp->data += sizeof(unsigned int); switch (cli_conn->addr.from.ss_family) { case AF_INET: - memcpy(temp->str + temp->len, &((struct sockaddr_in *)&cli_conn->addr.from)->sin_addr, 4); - temp->len += 4; + memcpy(temp->area + temp->data, + &((struct sockaddr_in *)&cli_conn->addr.from)->sin_addr, + 4); + temp->data += 4; break; case AF_INET6: - memcpy(temp->str + temp->len, &((struct sockaddr_in6 *)&cli_conn->addr.from)->sin6_addr, 16); - temp->len += 16; + memcpy(temp->area + temp->data, + &((struct sockaddr_in6 *)&cli_conn->addr.from)->sin6_addr, + 16); + temp->data += 16; break; default: return 0; @@ -10499,8 +10579,8 @@ smp_fetch_query(const struct arg *args, struct sample *smp, const char *kw, void } while (*ptr++ != '?'); smp->data.type = SMP_T_STR; - smp->data.u.str.str = ptr; - smp->data.u.str.len = end - ptr; + smp->data.u.str.area = ptr; + smp->data.u.str.data = end - ptr; smp->flags = SMP_F_VOL_1ST | SMP_F_CONST; return 1; } @@ -10572,8 +10652,8 @@ smp_fetch_http_auth_grp(const struct arg *args, struct sample *smp, const char * smp->data.type = SMP_T_STR; smp->flags = SMP_F_CONST; - smp->data.u.str.str = smp->strm->txn->auth.user; - smp->data.u.str.len = strlen(smp->strm->txn->auth.user); + smp->data.u.str.area = smp->strm->txn->auth.user; + smp->data.u.str.data = strlen(smp->strm->txn->auth.user); return 1; } @@ -10592,7 +10672,7 @@ smp_fetch_http_auth_grp(const struct arg *args, struct sample *smp, const char * char * extract_cookie_value(char *hdr, const char *hdr_end, char *cookie_name, size_t cookie_name_l, int list, - char **value, int *value_l) + char **value, size_t *value_l) { char *equal, *att_end, *att_beg, *val_beg, *val_end; char *next; @@ -10692,8 +10772,8 @@ smp_fetch_capture_header_req(const struct arg *args, struct sample *smp, const c smp->data.type = SMP_T_STR; smp->flags |= SMP_F_CONST; - smp->data.u.str.str = smp->strm->req_cap[idx]; - smp->data.u.str.len = strlen(smp->strm->req_cap[idx]); + smp->data.u.str.area = smp->strm->req_cap[idx]; + smp->data.u.str.data = strlen(smp->strm->req_cap[idx]); return 1; } @@ -10717,8 +10797,8 @@ smp_fetch_capture_header_res(const struct arg *args, struct sample *smp, const c smp->data.type = SMP_T_STR; smp->flags |= SMP_F_CONST; - smp->data.u.str.str = smp->strm->res_cap[idx]; - smp->data.u.str.len = strlen(smp->strm->res_cap[idx]); + smp->data.u.str.area = smp->strm->res_cap[idx]; + smp->data.u.str.data = strlen(smp->strm->res_cap[idx]); return 1; } @@ -10740,8 +10820,8 @@ smp_fetch_capture_req_method(const struct arg *args, struct sample *smp, const c ptr++; temp = get_trash_chunk(); - temp->str = txn->uri; - temp->len = ptr - txn->uri; + temp->area = txn->uri; + temp->data = ptr - txn->uri; smp->data.u.str = *temp; smp->data.type = SMP_T_STR; smp->flags = SMP_F_CONST; @@ -10772,14 +10852,14 @@ smp_fetch_capture_req_uri(const struct arg *args, struct sample *smp, const char ptr++; /* skip the space */ temp = get_trash_chunk(); - ptr = temp->str = http_get_path_from_string(ptr); + ptr = temp->area = http_get_path_from_string(ptr); if (!ptr) return 0; while (*ptr != ' ' && *ptr != '\0') /* find space after URI */ ptr++; smp->data.u.str = *temp; - smp->data.u.str.len = ptr - temp->str; + smp->data.u.str.data = ptr - temp->area; smp->data.type = SMP_T_STR; smp->flags = SMP_F_CONST; @@ -10798,11 +10878,11 @@ smp_fetch_capture_req_ver(const struct arg *args, struct sample *smp, const char return 0; if (txn->req.flags & HTTP_MSGF_VER_11) - smp->data.u.str.str = "HTTP/1.1"; + smp->data.u.str.area = "HTTP/1.1"; else - smp->data.u.str.str = "HTTP/1.0"; + smp->data.u.str.area = "HTTP/1.0"; - smp->data.u.str.len = 8; + smp->data.u.str.data = 8; smp->data.type = SMP_T_STR; smp->flags = SMP_F_CONST; return 1; @@ -10821,11 +10901,11 @@ smp_fetch_capture_res_ver(const struct arg *args, struct sample *smp, const char return 0; if (txn->rsp.flags & HTTP_MSGF_VER_11) - smp->data.u.str.str = "HTTP/1.1"; + smp->data.u.str.area = "HTTP/1.1"; else - smp->data.u.str.str = "HTTP/1.0"; + smp->data.u.str.area = "HTTP/1.0"; - smp->data.u.str.len = 8; + smp->data.u.str.data = 8; smp->data.type = SMP_T_STR; smp->flags = SMP_F_CONST; return 1; @@ -10906,7 +10986,7 @@ int smp_fetch_cookie(const struct arg *args, struct sample *smp, const char *kw, if (!http_find_header2(hdr_name, hdr_name_len, sol, idx, ctx)) goto out; - if (ctx->vlen < args->data.str.len + 1) + if (ctx->vlen < args->data.str.data + 1) continue; smp->ctx.a[0] = ctx->line + ctx->val; @@ -10916,10 +10996,11 @@ int smp_fetch_cookie(const struct arg *args, struct sample *smp, const char *kw, smp->data.type = SMP_T_STR; smp->flags |= SMP_F_CONST; smp->ctx.a[0] = extract_cookie_value(smp->ctx.a[0], smp->ctx.a[1], - args->data.str.str, args->data.str.len, + args->data.str.area, + args->data.str.data, (smp->opt & SMP_OPT_DIR) == SMP_OPT_DIR_REQ, - &smp->data.u.str.str, - &smp->data.u.str.len); + &smp->data.u.str.area, + &smp->data.u.str.data); if (smp->ctx.a[0]) { found = 1; if (occ >= 0) { @@ -10985,7 +11066,7 @@ smp_fetch_cookie_cnt(const struct arg *args, struct sample *smp, const char *kw, if (!http_find_header2(hdr_name, hdr_name_len, sol, idx, &ctx)) break; - if (ctx.vlen < args->data.str.len + 1) + if (ctx.vlen < args->data.str.data + 1) continue; val_beg = ctx.line + ctx.val; @@ -10995,10 +11076,10 @@ smp_fetch_cookie_cnt(const struct arg *args, struct sample *smp, const char *kw, smp->data.type = SMP_T_STR; smp->flags |= SMP_F_CONST; while ((val_beg = extract_cookie_value(val_beg, val_end, - args->data.str.str, args->data.str.len, + args->data.str.area, args->data.str.data, (smp->opt & SMP_OPT_DIR) == SMP_OPT_DIR_REQ, - &smp->data.u.str.str, - &smp->data.u.str.len))) { + &smp->data.u.str.area, + &smp->data.u.str.data))) { cnt++; } } @@ -11019,7 +11100,8 @@ smp_fetch_cookie_val(const struct arg *args, struct sample *smp, const char *kw, if (ret > 0) { smp->data.type = SMP_T_SINT; - smp->data.u.sint = strl2ic(smp->data.u.str.str, smp->data.u.str.len); + smp->data.u.sint = strl2ic(smp->data.u.str.area, + smp->data.u.str.data); } return ret; @@ -11270,14 +11352,15 @@ smp_fetch_param(char delim, const char *name, int name_len, const struct arg *ar vend >= chunks[2] && vend <= chunks[3]) { /* Wrapped case. */ temp = get_trash_chunk(); - memcpy(temp->str, vstart, chunks[1] - vstart); - memcpy(temp->str + ( chunks[1] - vstart ), chunks[2], vend - chunks[2]); - smp->data.u.str.str = temp->str; - smp->data.u.str.len = ( chunks[1] - vstart ) + ( vend - chunks[2] ); + memcpy(temp->area, vstart, chunks[1] - vstart); + memcpy(temp->area + ( chunks[1] - vstart ), chunks[2], + vend - chunks[2]); + smp->data.u.str.area = temp->area; + smp->data.u.str.data = ( chunks[1] - vstart ) + ( vend - chunks[2] ); } else { /* Contiguous case. */ - smp->data.u.str.str = (char *)vstart; - smp->data.u.str.len = vend - vstart; + smp->data.u.str.area = (char *)vstart; + smp->data.u.str.data = vend - vstart; smp->flags = SMP_F_VOL_1ST | SMP_F_CONST; } @@ -11317,12 +11400,12 @@ smp_fetch_url_param(const struct arg *args, struct sample *smp, const char *kw, name = ""; name_len = 0; if (args->type == ARGT_STR) { - name = args->data.str.str; - name_len = args->data.str.len; + name = args->data.str.area; + name_len = args->data.str.data; } if (args[1].type) - delim = *args[1].data.str.str; + delim = *args[1].data.str.area; if (!smp->ctx.a[0]) { // first call, find the query string CHECK_HTTP_MESSAGE_FIRST(); @@ -11369,8 +11452,8 @@ smp_fetch_body_param(const struct arg *args, struct sample *smp, const char *kw, name = ""; name_len = 0; if (args[0].type == ARGT_STR) { - name = args[0].data.str.str; - name_len = args[0].data.str.len; + name = args[0].data.str.area; + name_len = args[0].data.str.data; } if (!smp->ctx.a[0]) { // first call, find the query string @@ -11420,7 +11503,8 @@ smp_fetch_url_param_val(const struct arg *args, struct sample *smp, const char * if (ret > 0) { smp->data.type = SMP_T_SINT; - smp->data.u.sint = strl2ic(smp->data.u.str.str, smp->data.u.str.len); + smp->data.u.sint = strl2ic(smp->data.u.str.area, + smp->data.u.str.data); } return ret; @@ -11497,17 +11581,21 @@ smp_fetch_url32_src(const struct arg *args, struct sample *smp, const char *kw, return 0; temp = get_trash_chunk(); - *(unsigned int *)temp->str = htonl(smp->data.u.sint); - temp->len += sizeof(unsigned int); + *(unsigned int *) temp->area = htonl(smp->data.u.sint); + temp->data += sizeof(unsigned int); switch (cli_conn->addr.from.ss_family) { case AF_INET: - memcpy(temp->str + temp->len, &((struct sockaddr_in *)&cli_conn->addr.from)->sin_addr, 4); - temp->len += 4; + memcpy(temp->area + temp->data, + &((struct sockaddr_in *)&cli_conn->addr.from)->sin_addr, + 4); + temp->data += 4; break; case AF_INET6: - memcpy(temp->str + temp->len, &((struct sockaddr_in6 *)&cli_conn->addr.from)->sin6_addr, 16); - temp->len += 16; + memcpy(temp->area + temp->data, + &((struct sockaddr_in6 *)&cli_conn->addr.from)->sin6_addr, + 16); + temp->data += 16; break; default: return 0; @@ -11557,10 +11645,11 @@ static int sample_conv_http_date(const struct arg *args, struct sample *smp, voi return 0; temp = get_trash_chunk(); - temp->len = snprintf(temp->str, temp->size - temp->len, - "%s, %02d %s %04d %02d:%02d:%02d GMT", - day[tm->tm_wday], tm->tm_mday, mon[tm->tm_mon], 1900+tm->tm_year, - tm->tm_hour, tm->tm_min, tm->tm_sec); + temp->data = snprintf(temp->area, temp->size - temp->data, + "%s, %02d %s %04d %02d:%02d:%02d GMT", + day[tm->tm_wday], tm->tm_mday, mon[tm->tm_mon], + 1900+tm->tm_year, + tm->tm_hour, tm->tm_min, tm->tm_sec); smp->data.u.str = *temp; smp->data.type = SMP_T_STR; @@ -11595,8 +11684,8 @@ static inline int language_range_match(const char *range, int range_len, /* Arguments: The list of expected value, the number of parts returned and the separator */ static int sample_conv_q_prefered(const struct arg *args, struct sample *smp, void *private) { - const char *al = smp->data.u.str.str; - const char *end = al + smp->data.u.str.len; + const char *al = smp->data.u.str.area; + const char *end = al + smp->data.u.str.data; const char *token; int toklen; int qvalue; @@ -11609,8 +11698,8 @@ static int sample_conv_q_prefered(const struct arg *args, struct sample *smp, vo */ smp->flags |= SMP_F_CONST; smp->data.u.str.size = 0; - smp->data.u.str.str = ""; - smp->data.u.str.len = 0; + smp->data.u.str.area = ""; + smp->data.u.str.data = 0; /* Parse the accept language */ while (1) { @@ -11637,7 +11726,7 @@ static int sample_conv_q_prefered(const struct arg *args, struct sample *smp, vo /* Check if the token exists in the list. If the token not exists, * jump to the next token. */ - str = args[0].data.str.str; + str = args[0].data.str.area; w = str; while (1) { if (*str == ';' || *str == '\0') { @@ -11710,8 +11799,8 @@ process_value: * break the process. */ if (qvalue > best_q) { - smp->data.u.str.str = (char *)w; - smp->data.u.str.len = str - w; + smp->data.u.str.area = (char *)w; + smp->data.u.str.data = str - w; if (qvalue >= 1000) break; best_q = qvalue; @@ -11730,13 +11819,13 @@ expect_comma: } /* Set default value if required. */ - if (smp->data.u.str.len == 0 && args[1].type == ARGT_STR) { - smp->data.u.str.str = args[1].data.str.str; - smp->data.u.str.len = args[1].data.str.len; + if (smp->data.u.str.data == 0 && args[1].type == ARGT_STR) { + smp->data.u.str.area = args[1].data.str.area; + smp->data.u.str.data = args[1].data.str.data; } /* Return true only if a matching language was found. */ - return smp->data.u.str.len != 0; + return smp->data.u.str.data != 0; } /* This fetch url-decode any input string. */ @@ -11746,18 +11835,18 @@ static int sample_conv_url_dec(const struct arg *args, struct sample *smp, void * the end of the buffer, copy the string in other buffer * before decoding. */ - if (smp->flags & SMP_F_CONST || smp->data.u.str.size <= smp->data.u.str.len) { + if (smp->flags & SMP_F_CONST || smp->data.u.str.size <= smp->data.u.str.data) { struct chunk *str = get_trash_chunk(); - memcpy(str->str, smp->data.u.str.str, smp->data.u.str.len); - smp->data.u.str.str = str->str; + memcpy(str->area, smp->data.u.str.area, smp->data.u.str.data); + smp->data.u.str.area = str->area; smp->data.u.str.size = str->size; smp->flags &= ~SMP_F_CONST; } /* Add final \0 required by url_decode(), and convert the input string. */ - smp->data.u.str.str[smp->data.u.str.len] = '\0'; - smp->data.u.str.len = url_decode(smp->data.u.str.str); - return (smp->data.u.str.len >= 0); + smp->data.u.str.area[smp->data.u.str.data] = '\0'; + smp->data.u.str.data = url_decode(smp->data.u.str.area); + return (smp->data.u.str.data >= 0); } static int smp_conv_req_capture(const struct arg *args, struct sample *smp, void *private) @@ -11790,12 +11879,12 @@ static int smp_conv_req_capture(const struct arg *args, struct sample *smp, void return 0; /* Check length. */ - len = smp->data.u.str.len; + len = smp->data.u.str.data; if (len > hdr->len) len = hdr->len; /* Capture input data. */ - memcpy(smp->strm->req_cap[idx], smp->data.u.str.str, len); + memcpy(smp->strm->req_cap[idx], smp->data.u.str.area, len); smp->strm->req_cap[idx][len] = '\0'; return 1; @@ -11831,12 +11920,12 @@ static int smp_conv_res_capture(const struct arg *args, struct sample *smp, void return 0; /* Check length. */ - len = smp->data.u.str.len; + len = smp->data.u.str.data; if (len > hdr->len) len = hdr->len; /* Capture input data. */ - memcpy(smp->strm->res_cap[idx], smp->data.u.str.str, len); + memcpy(smp->strm->res_cap[idx], smp->data.u.str.area, len); smp->strm->res_cap[idx][len] = '\0'; return 1; @@ -11949,31 +12038,32 @@ void http_set_status(unsigned int status, const char *reason, struct stream *s) chunk_reset(&trash); - res = ultoa_o(status, trash.str, trash.size); - c_l = res - trash.str; + res = ultoa_o(status, trash.area, trash.size); + c_l = res - trash.area; - trash.str[c_l] = ' '; - trash.len = c_l + 1; + trash.area[c_l] = ' '; + trash.data = c_l + 1; /* Do we have a custom reason format string? */ if (msg == NULL) msg = get_reason(status); msg_len = strlen(msg); - strncpy(&trash.str[trash.len], msg, trash.size - trash.len); - trash.len += msg_len; + strncpy(&trash.area[trash.data], msg, trash.size - trash.data); + trash.data += msg_len; cur_ptr = ci_head(&s->res) + txn->rsp.sl.st.c; cur_end = ci_head(&s->res) + txn->rsp.sl.st.r + txn->rsp.sl.st.r_l; /* commit changes and adjust message */ - delta = b_rep_blk(&s->res.buf, cur_ptr, cur_end, trash.str, trash.len); + delta = b_rep_blk(&s->res.buf, cur_ptr, cur_end, trash.area, + trash.data); /* adjust res line offsets and lengths */ txn->rsp.sl.st.r += c_l - txn->rsp.sl.st.c_l; txn->rsp.sl.st.c_l = c_l; txn->rsp.sl.st.r_l = msg_len; - delta = trash.len - (cur_end - cur_ptr); + delta = trash.data - (cur_end - cur_ptr); txn->rsp.sl.st.l += delta; txn->hdr_idx.v[0].len += delta; http_msg_move_end(&txn->rsp, delta); @@ -11998,11 +12088,13 @@ enum act_return http_action_set_req_line(struct act_rule *rule, struct proxy *px /* If we have to create a query string, prepare a '?'. */ if (rule->arg.http.action == 2) - replace->str[replace->len++] = '?'; - replace->len += build_logline(s, replace->str + replace->len, replace->size - replace->len, - &rule->arg.http.logfmt); + replace->area[replace->data++] = '?'; + replace->data += build_logline(s, replace->area + replace->data, + replace->size - replace->data, + &rule->arg.http.logfmt); - http_replace_req_line(rule->arg.http.action, replace->str, replace->len, px, s); + http_replace_req_line(rule->arg.http.action, replace->area, + replace->data, px, s); ret = ACT_RET_CONT; @@ -12179,11 +12271,11 @@ enum act_return http_action_req_capture(struct act_rule *rule, struct proxy *px, if (cap[h->index] == NULL) /* no more capture memory */ return ACT_RET_CONT; - len = key->data.u.str.len; + len = key->data.u.str.data; if (len > h->len) len = h->len; - memcpy(cap[h->index], key->data.u.str.str, len); + memcpy(cap[h->index], key->data.u.str.area, len); cap[h->index][len] = 0; return ACT_RET_CONT; } @@ -12220,11 +12312,11 @@ enum act_return http_action_req_capture_by_id(struct act_rule *rule, struct prox if (cap[h->index] == NULL) /* no more capture memory */ return ACT_RET_CONT; - len = key->data.u.str.len; + len = key->data.u.str.data; if (len > h->len) len = h->len; - memcpy(cap[h->index], key->data.u.str.str, len); + memcpy(cap[h->index], key->data.u.str.area, len); cap[h->index][len] = 0; return ACT_RET_CONT; } @@ -12408,11 +12500,11 @@ enum act_return http_action_res_capture_by_id(struct act_rule *rule, struct prox if (cap[h->index] == NULL) /* no more capture memory */ return ACT_RET_CONT; - len = key->data.u.str.len; + len = key->data.u.str.data; if (len > h->len) len = h->len; - memcpy(cap[h->index], key->data.u.str.str, len); + memcpy(cap[h->index], key->data.u.str.area, len); cap[h->index][len] = 0; return ACT_RET_CONT; } diff --git a/src/proto_tcp.c b/src/proto_tcp.c index 9a3689c71..d49ecf4c7 100644 --- a/src/proto_tcp.c +++ b/src/proto_tcp.c @@ -631,7 +631,8 @@ int tcp_drain(int fd) len = recv(fd, NULL, INT_MAX, MSG_DONTWAIT | MSG_NOSIGNAL | MSG_TRUNC); if (len == -1 && errno == EFAULT) #endif - len = recv(fd, trash.str, trash.size, MSG_DONTWAIT | MSG_NOSIGNAL); + len = recv(fd, trash.area, trash.size, + MSG_DONTWAIT | MSG_NOSIGNAL); if (len == 0) { /* cool, shutdown received */ @@ -1636,9 +1637,9 @@ static inline int get_tcp_info(const struct arg *args, struct sample *smp, /* Convert the value as expected. */ if (args) { if (args[0].type == ARGT_STR) { - if (strcmp(args[0].data.str.str, "us") == 0) { + if (strcmp(args[0].data.str.area, "us") == 0) { /* Do nothing. */ - } else if (strcmp(args[0].data.str.str, "ms") == 0) { + } else if (strcmp(args[0].data.str.area, "ms") == 0) { smp->data.u.sint = (smp->data.u.sint + 500) / 1000; } else return 0; diff --git a/src/sample.c b/src/sample.c index 3f72266b9..9ccfe7d6f 100644 --- a/src/sample.c +++ b/src/sample.c @@ -312,8 +312,8 @@ const char *sample_src_names(unsigned int use) { int bit; - trash.len = 0; - trash.str[0] = '\0'; + trash.data = 0; + trash.area[0] = '\0'; for (bit = 0; bit < SMP_SRC_ENTRIES; bit++) { if (!(use & ~((1 << bit) - 1))) break; /* no more bits */ @@ -321,11 +321,12 @@ const char *sample_src_names(unsigned int use) if (!(use & (1 << bit))) continue; /* bit not set */ - trash.len += snprintf(trash.str + trash.len, trash.size - trash.len, "%s%s", - (use & ((1 << bit) - 1)) ? "," : "", - fetch_src_names[bit]); + trash.data += snprintf(trash.area + trash.data, + trash.size - trash.data, "%s%s", + (use & ((1 << bit) - 1)) ? "," : "", + fetch_src_names[bit]); } - return trash.str; + return trash.area; } /* return a pointer to the correct sample checkpoint name, or "unknown" when @@ -509,10 +510,10 @@ static int c_ip2str(struct sample *smp) { struct chunk *trash = get_trash_chunk(); - if (!inet_ntop(AF_INET, (void *)&smp->data.u.ipv4, trash->str, trash->size)) + if (!inet_ntop(AF_INET, (void *)&smp->data.u.ipv4, trash->area, trash->size)) return 0; - trash->len = strlen(trash->str); + trash->data = strlen(trash->area); smp->data.u.str = *trash; smp->data.type = SMP_T_STR; smp->flags &= ~SMP_F_CONST; @@ -539,10 +540,10 @@ static int c_ipv62str(struct sample *smp) { struct chunk *trash = get_trash_chunk(); - if (!inet_ntop(AF_INET6, (void *)&smp->data.u.ipv6, trash->str, trash->size)) + if (!inet_ntop(AF_INET6, (void *)&smp->data.u.ipv6, trash->area, trash->size)) return 0; - trash->len = strlen(trash->str); + trash->data = strlen(trash->area); smp->data.u.str = *trash; smp->data.type = SMP_T_STR; smp->flags &= ~SMP_F_CONST; @@ -573,8 +574,8 @@ static int c_int2ipv6(struct sample *smp) static int c_str2addr(struct sample *smp) { - if (!buf2ip(smp->data.u.str.str, smp->data.u.str.len, &smp->data.u.ipv4)) { - if (!buf2ip6(smp->data.u.str.str, smp->data.u.str.len, &smp->data.u.ipv6)) + if (!buf2ip(smp->data.u.str.area, smp->data.u.str.data, &smp->data.u.ipv4)) { + if (!buf2ip6(smp->data.u.str.area, smp->data.u.str.data, &smp->data.u.ipv6)) return 0; smp->data.type = SMP_T_IPV6; smp->flags &= ~SMP_F_CONST; @@ -587,7 +588,7 @@ static int c_str2addr(struct sample *smp) static int c_str2ip(struct sample *smp) { - if (!buf2ip(smp->data.u.str.str, smp->data.u.str.len, &smp->data.u.ipv4)) + if (!buf2ip(smp->data.u.str.area, smp->data.u.str.data, &smp->data.u.ipv4)) return 0; smp->data.type = SMP_T_IPV4; smp->flags &= ~SMP_F_CONST; @@ -596,7 +597,7 @@ static int c_str2ip(struct sample *smp) static int c_str2ipv6(struct sample *smp) { - if (!buf2ip6(smp->data.u.str.str, smp->data.u.str.len, &smp->data.u.ipv6)) + if (!buf2ip6(smp->data.u.str.area, smp->data.u.str.data, &smp->data.u.ipv6)) return 0; smp->data.type = SMP_T_IPV6; smp->flags &= ~SMP_F_CONST; @@ -611,9 +612,9 @@ static int c_bin2str(struct sample *smp) { int i; - for (i = 0; i < smp->data.u.str.len; i++) { - if (!smp->data.u.str.str[i]) { - smp->data.u.str.len = i; + for (i = 0; i < smp->data.u.str.data; i++) { + if (!smp->data.u.str.area[i]) { + smp->data.u.str.data = i; break; } } @@ -625,13 +626,13 @@ static int c_int2str(struct sample *smp) struct chunk *trash = get_trash_chunk(); char *pos; - pos = lltoa_r(smp->data.u.sint, trash->str, trash->size); + pos = lltoa_r(smp->data.u.sint, trash->area, trash->size); if (!pos) return 0; - trash->size = trash->size - (pos - trash->str); - trash->str = pos; - trash->len = strlen(pos); + trash->size = trash->size - (pos - trash->area); + trash->area = pos; + trash->data = strlen(pos); smp->data.u.str = *trash; smp->data.type = SMP_T_STR; smp->flags &= ~SMP_F_CONST; @@ -664,22 +665,22 @@ int smp_dup(struct sample *smp) case SMP_T_STR: trash = get_trash_chunk(); - trash->len = smp->data.u.str.len; - if (trash->len > trash->size - 1) - trash->len = trash->size - 1; + trash->data = smp->data.u.str.data; + if (trash->data > trash->size - 1) + trash->data = trash->size - 1; - memcpy(trash->str, smp->data.u.str.str, trash->len); - trash->str[trash->len] = 0; + memcpy(trash->area, smp->data.u.str.area, trash->data); + trash->area[trash->data] = 0; smp->data.u.str = *trash; break; case SMP_T_BIN: trash = get_trash_chunk(); - trash->len = smp->data.u.str.len; - if (trash->len > trash->size) - trash->len = trash->size; + trash->data = smp->data.u.str.data; + if (trash->data > trash->size) + trash->data = trash->size; - memcpy(trash->str, smp->data.u.str.str, trash->len); + memcpy(trash->area, smp->data.u.str.area, trash->data); smp->data.u.str = *trash; break; @@ -703,11 +704,11 @@ static int c_str2int(struct sample *smp) const char *str; const char *end; - if (smp->data.u.str.len == 0) + if (smp->data.u.str.data == 0) return 0; - str = smp->data.u.str.str; - end = smp->data.u.str.str + smp->data.u.str.len; + str = smp->data.u.str.area; + end = smp->data.u.str.area + smp->data.u.str.data; smp->data.u.sint = read_int64(&str, end); smp->data.type = SMP_T_SINT; @@ -720,11 +721,11 @@ static int c_str2meth(struct sample *smp) enum http_meth_t meth; int len; - meth = find_http_meth(smp->data.u.str.str, smp->data.u.str.len); + meth = find_http_meth(smp->data.u.str.area, smp->data.u.str.data); if (meth == HTTP_METH_OTHER) { - len = smp->data.u.str.len; - smp->data.u.meth.str.str = smp->data.u.str.str; - smp->data.u.meth.str.len = len; + len = smp->data.u.str.data; + smp->data.u.meth.str.area = smp->data.u.str.area; + smp->data.u.meth.str.data = len; } else smp->flags &= ~SMP_F_CONST; @@ -740,16 +741,16 @@ static int c_meth2str(struct sample *smp) if (smp->data.u.meth.meth == HTTP_METH_OTHER) { /* The method is unknown. Copy the original pointer. */ - len = smp->data.u.meth.str.len; - smp->data.u.str.str = smp->data.u.meth.str.str; - smp->data.u.str.len = len; + len = smp->data.u.meth.str.data; + smp->data.u.str.area = smp->data.u.meth.str.area; + smp->data.u.str.data = len; smp->data.type = SMP_T_STR; } else if (smp->data.u.meth.meth < HTTP_METH_OTHER) { /* The method is known, copy the pointer containing the string. */ meth = smp->data.u.meth.meth; - smp->data.u.str.str = http_known_methods[meth].name; - smp->data.u.str.len = http_known_methods[meth].len; + smp->data.u.str.area = http_known_methods[meth].name; + smp->data.u.str.data = http_known_methods[meth].len; smp->flags |= SMP_F_CONST; smp->data.type = SMP_T_STR; } @@ -765,12 +766,12 @@ static int c_addr2bin(struct sample *smp) struct chunk *chk = get_trash_chunk(); if (smp->data.type == SMP_T_IPV4) { - chk->len = 4; - memcpy(chk->str, &smp->data.u.ipv4, chk->len); + chk->data = 4; + memcpy(chk->area, &smp->data.u.ipv4, chk->data); } else if (smp->data.type == SMP_T_IPV6) { - chk->len = 16; - memcpy(chk->str, &smp->data.u.ipv6, chk->len); + chk->data = 16; + memcpy(chk->area, &smp->data.u.ipv6, chk->data); } else return 0; @@ -784,8 +785,8 @@ static int c_int2bin(struct sample *smp) { struct chunk *chk = get_trash_chunk(); - *(unsigned long long int *)chk->str = my_htonll(smp->data.u.sint); - chk->len = 8; + *(unsigned long long int *) chk->area = my_htonll(smp->data.u.sint); + chk->data = 8; smp->data.u.str = *chk; smp->data.type = SMP_T_BIN; @@ -1139,7 +1140,7 @@ int smp_resolve_args(struct proxy *p) switch (arg->type) { case ARGT_SRV: - if (!arg->data.str.len) { + if (!arg->data.str.data) { ha_alert("parsing [%s:%d] : missing server name in arg %d of %s%s%s%s '%s' %s proxy '%s'.\n", cur->file, cur->line, cur->arg_pos + 1, conv_pre, conv_ctx, conv_pos, ctx, cur->kw, where, p->id); @@ -1148,11 +1149,11 @@ int smp_resolve_args(struct proxy *p) } /* we support two formats : "bck/srv" and "srv" */ - sname = strrchr(arg->data.str.str, '/'); + sname = strrchr(arg->data.str.area, '/'); if (sname) { *sname++ = '\0'; - pname = arg->data.str.str; + pname = arg->data.str.area; px = proxy_be_by_name(pname); if (!px) { @@ -1164,7 +1165,7 @@ int smp_resolve_args(struct proxy *p) } } else - sname = arg->data.str.str; + sname = arg->data.str.area; srv = findserver(px, sname); if (!srv) { @@ -1175,15 +1176,15 @@ int smp_resolve_args(struct proxy *p) break; } - free(arg->data.str.str); - arg->data.str.str = NULL; + free(arg->data.str.area); + arg->data.str.area = NULL; arg->unresolved = 0; arg->data.srv = srv; break; case ARGT_FE: - if (arg->data.str.len) { - pname = arg->data.str.str; + if (arg->data.str.data) { + pname = arg->data.str.area; px = proxy_fe_by_name(pname); } @@ -1203,15 +1204,15 @@ int smp_resolve_args(struct proxy *p) break; } - free(arg->data.str.str); - arg->data.str.str = NULL; + free(arg->data.str.area); + arg->data.str.area = NULL; arg->unresolved = 0; arg->data.prx = px; break; case ARGT_BE: - if (arg->data.str.len) { - pname = arg->data.str.str; + if (arg->data.str.data) { + pname = arg->data.str.area; px = proxy_be_by_name(pname); } @@ -1231,15 +1232,15 @@ int smp_resolve_args(struct proxy *p) break; } - free(arg->data.str.str); - arg->data.str.str = NULL; + free(arg->data.str.area); + arg->data.str.area = NULL; arg->unresolved = 0; arg->data.prx = px; break; case ARGT_TAB: - if (arg->data.str.len) { - pname = arg->data.str.str; + if (arg->data.str.data) { + pname = arg->data.str.area; px = proxy_tbl_by_name(pname); } @@ -1259,14 +1260,14 @@ int smp_resolve_args(struct proxy *p) break; } - free(arg->data.str.str); - arg->data.str.str = NULL; + free(arg->data.str.area); + arg->data.str.area = NULL; arg->unresolved = 0; arg->data.prx = px; break; case ARGT_USR: - if (!arg->data.str.len) { + if (!arg->data.str.data) { ha_alert("parsing [%s:%d] : missing userlist name in arg %d of %s%s%s%s '%s' %s proxy '%s'.\n", cur->file, cur->line, cur->arg_pos + 1, conv_pre, conv_ctx, conv_pos, ctx, cur->kw, where, p->id); @@ -1275,27 +1276,28 @@ int smp_resolve_args(struct proxy *p) } if (p->uri_auth && p->uri_auth->userlist && - !strcmp(p->uri_auth->userlist->name, arg->data.str.str)) + !strcmp(p->uri_auth->userlist->name, arg->data.str.area)) ul = p->uri_auth->userlist; else - ul = auth_find_userlist(arg->data.str.str); + ul = auth_find_userlist(arg->data.str.area); if (!ul) { ha_alert("parsing [%s:%d] : unable to find userlist '%s' referenced in arg %d of %s%s%s%s '%s' %s proxy '%s'.\n", - cur->file, cur->line, arg->data.str.str, + cur->file, cur->line, + arg->data.str.area, cur->arg_pos + 1, conv_pre, conv_ctx, conv_pos, ctx, cur->kw, where, p->id); cfgerr++; break; } - free(arg->data.str.str); - arg->data.str.str = NULL; + free(arg->data.str.area); + arg->data.str.area = NULL; arg->unresolved = 0; arg->data.usr = ul; break; case ARGT_REG: - if (!arg->data.str.len) { + if (!arg->data.str.data) { ha_alert("parsing [%s:%d] : missing regex in arg %d of %s%s%s%s '%s' %s proxy '%s'.\n", cur->file, cur->line, cur->arg_pos + 1, conv_pre, conv_ctx, conv_pos, ctx, cur->kw, where, p->id); @@ -1316,17 +1318,17 @@ int smp_resolve_args(struct proxy *p) rflags |= (arg->type_flags & ARGF_REG_ICASE) ? REG_ICASE : 0; err = NULL; - if (!regex_comp(arg->data.str.str, reg, !(rflags & REG_ICASE), 1 /* capture substr */, &err)) { + if (!regex_comp(arg->data.str.area, reg, !(rflags & REG_ICASE), 1 /* capture substr */, &err)) { ha_alert("parsing [%s:%d] : error in regex '%s' in arg %d of %s%s%s%s '%s' %s proxy '%s' : %s.\n", cur->file, cur->line, - arg->data.str.str, + arg->data.str.area, cur->arg_pos + 1, conv_pre, conv_ctx, conv_pos, ctx, cur->kw, where, p->id, err); cfgerr++; continue; } - free(arg->data.str.str); - arg->data.str.str = NULL; + free(arg->data.str.area); + arg->data.str.area = NULL; arg->unresolved = 0; arg->data.reg = reg; break; @@ -1395,8 +1397,8 @@ static void release_sample_arg(struct arg *p) while (p->type != ARGT_STOP) { if (p->type == ARGT_STR || p->unresolved) { - free(p->data.str.str); - p->data.str.str = NULL; + free(p->data.str.area); + p->data.str.area = NULL; p->unresolved = 0; } else if (p->type == ARGT_REG) { @@ -1455,9 +1457,10 @@ static int sample_conv_debug(const struct arg *arg_p, struct sample *smp, void * else { /* Display the displayable chars*. */ fprintf(stderr, "<"); - for (i = 0; i < tmp.data.u.str.len; i++) { - if (isprint(tmp.data.u.str.str[i])) - fputc(tmp.data.u.str.str[i], stderr); + for (i = 0; i < tmp.data.u.str.data; i++) { + if (isprint(tmp.data.u.str.area[i])) + fputc(tmp.data.u.str.area[i], + stderr); else fputc('.', stderr); } @@ -1474,12 +1477,13 @@ static int sample_conv_base642bin(const struct arg *arg_p, struct sample *smp, v struct chunk *trash = get_trash_chunk(); int bin_len; - trash->len = 0; - bin_len = base64dec(smp->data.u.str.str, smp->data.u.str.len, trash->str, trash->size); + trash->data = 0; + bin_len = base64dec(smp->data.u.str.area, smp->data.u.str.data, + trash->area, trash->size); if (bin_len < 0) return 0; - trash->len = bin_len; + trash->data = bin_len; smp->data.u.str = *trash; smp->data.type = SMP_T_BIN; smp->flags &= ~SMP_F_CONST; @@ -1491,12 +1495,13 @@ static int sample_conv_bin2base64(const struct arg *arg_p, struct sample *smp, v struct chunk *trash = get_trash_chunk(); int b64_len; - trash->len = 0; - b64_len = a2base64(smp->data.u.str.str, smp->data.u.str.len, trash->str, trash->size); + trash->data = 0; + b64_len = a2base64(smp->data.u.str.area, smp->data.u.str.data, + trash->area, trash->size); if (b64_len < 0) return 0; - trash->len = b64_len; + trash->data = b64_len; smp->data.u.str = *trash; smp->data.type = SMP_T_STR; smp->flags &= ~SMP_F_CONST; @@ -1511,10 +1516,10 @@ static int sample_conv_sha1(const struct arg *arg_p, struct sample *smp, void *p memset(&ctx, 0, sizeof(ctx)); blk_SHA1_Init(&ctx); - blk_SHA1_Update(&ctx, smp->data.u.str.str, smp->data.u.str.len); - blk_SHA1_Final((unsigned char *)trash->str, &ctx); + blk_SHA1_Update(&ctx, smp->data.u.str.area, smp->data.u.str.data); + blk_SHA1_Final((unsigned char *) trash->area, &ctx); - trash->len = 20; + trash->data = 20; smp->data.u.str = *trash; smp->data.type = SMP_T_BIN; smp->flags &= ~SMP_F_CONST; @@ -1527,11 +1532,11 @@ static int sample_conv_bin2hex(const struct arg *arg_p, struct sample *smp, void unsigned char c; int ptr = 0; - trash->len = 0; - while (ptr < smp->data.u.str.len && trash->len <= trash->size - 2) { - c = smp->data.u.str.str[ptr++]; - trash->str[trash->len++] = hextab[(c >> 4) & 0xF]; - trash->str[trash->len++] = hextab[c & 0xF]; + trash->data = 0; + while (ptr < smp->data.u.str.data && trash->data <= trash->size - 2) { + c = smp->data.u.str.area[ptr++]; + trash->area[trash->data++] = hextab[(c >> 4) & 0xF]; + trash->area[trash->data++] = hextab[c & 0xF]; } smp->data.u.str = *trash; smp->data.type = SMP_T_STR; @@ -1544,8 +1549,8 @@ static int sample_conv_hex2int(const struct arg *arg_p, struct sample *smp, void long long int n = 0; int i, c; - for (i = 0; i < smp->data.u.str.len; i++) { - if ((c = hex2i(smp->data.u.str.str[i])) < 0) + for (i = 0; i < smp->data.u.str.data; i++) { + if ((c = hex2i(smp->data.u.str.area[i])) < 0) return 0; n = (n << 4) + c; } @@ -1559,7 +1564,8 @@ static int sample_conv_hex2int(const struct arg *arg_p, struct sample *smp, void /* hashes the binary input into a 32-bit unsigned int */ static int sample_conv_djb2(const struct arg *arg_p, struct sample *smp, void *private) { - smp->data.u.sint = hash_djb2(smp->data.u.str.str, smp->data.u.str.len); + smp->data.u.sint = hash_djb2(smp->data.u.str.area, + smp->data.u.str.data); if (arg_p && arg_p->data.sint) smp->data.u.sint = full_hash(smp->data.u.sint); smp->data.type = SMP_T_SINT; @@ -1568,7 +1574,7 @@ static int sample_conv_djb2(const struct arg *arg_p, struct sample *smp, void *p static int sample_conv_length(const struct arg *arg_p, struct sample *smp, void *private) { - int i = smp->data.u.str.len; + int i = smp->data.u.str.data; smp->data.u.sint = i; smp->data.type = SMP_T_SINT; return 1; @@ -1582,9 +1588,9 @@ static int sample_conv_str2lower(const struct arg *arg_p, struct sample *smp, vo if (!smp_make_rw(smp)) return 0; - for (i = 0; i < smp->data.u.str.len; i++) { - if ((smp->data.u.str.str[i] >= 'A') && (smp->data.u.str.str[i] <= 'Z')) - smp->data.u.str.str[i] += 'a' - 'A'; + for (i = 0; i < smp->data.u.str.data; i++) { + if ((smp->data.u.str.area[i] >= 'A') && (smp->data.u.str.area[i] <= 'Z')) + smp->data.u.str.area[i] += 'a' - 'A'; } return 1; } @@ -1596,9 +1602,9 @@ static int sample_conv_str2upper(const struct arg *arg_p, struct sample *smp, vo if (!smp_make_rw(smp)) return 0; - for (i = 0; i < smp->data.u.str.len; i++) { - if ((smp->data.u.str.str[i] >= 'a') && (smp->data.u.str.str[i] <= 'z')) - smp->data.u.str.str[i] += 'A' - 'a'; + for (i = 0; i < smp->data.u.str.data; i++) { + if ((smp->data.u.str.area[i] >= 'a') && (smp->data.u.str.area[i] <= 'z')) + smp->data.u.str.area[i] += 'A' - 'a'; } return 1; } @@ -1647,7 +1653,8 @@ static int sample_conv_ltime(const struct arg *args, struct sample *smp, void *p if (!tm) return 0; temp = get_trash_chunk(); - temp->len = strftime(temp->str, temp->size, args[0].data.str.str, tm); + temp->data = strftime(temp->area, temp->size, args[0].data.str.area, + tm); smp->data.u.str = *temp; smp->data.type = SMP_T_STR; return 1; @@ -1656,7 +1663,8 @@ static int sample_conv_ltime(const struct arg *args, struct sample *smp, void *p /* hashes the binary input into a 32-bit unsigned int */ static int sample_conv_sdbm(const struct arg *arg_p, struct sample *smp, void *private) { - smp->data.u.sint = hash_sdbm(smp->data.u.str.str, smp->data.u.str.len); + smp->data.u.sint = hash_sdbm(smp->data.u.str.area, + smp->data.u.str.data); if (arg_p && arg_p->data.sint) smp->data.u.sint = full_hash(smp->data.u.sint); smp->data.type = SMP_T_SINT; @@ -1682,7 +1690,8 @@ static int sample_conv_utime(const struct arg *args, struct sample *smp, void *p if (!tm) return 0; temp = get_trash_chunk(); - temp->len = strftime(temp->str, temp->size, args[0].data.str.str, tm); + temp->data = strftime(temp->area, temp->size, args[0].data.str.area, + tm); smp->data.u.str = *temp; smp->data.type = SMP_T_STR; return 1; @@ -1691,7 +1700,8 @@ static int sample_conv_utime(const struct arg *args, struct sample *smp, void *p /* hashes the binary input into a 32-bit unsigned int */ static int sample_conv_wt6(const struct arg *arg_p, struct sample *smp, void *private) { - smp->data.u.sint = hash_wt6(smp->data.u.str.str, smp->data.u.str.len); + smp->data.u.sint = hash_wt6(smp->data.u.str.area, + smp->data.u.str.data); if (arg_p && arg_p->data.sint) smp->data.u.sint = full_hash(smp->data.u.sint); smp->data.type = SMP_T_SINT; @@ -1709,7 +1719,8 @@ static int sample_conv_xxh32(const struct arg *arg_p, struct sample *smp, void * seed = arg_p->data.sint; else seed = 0; - smp->data.u.sint = XXH32(smp->data.u.str.str, smp->data.u.str.len, seed); + smp->data.u.sint = XXH32(smp->data.u.str.area, smp->data.u.str.data, + seed); smp->data.type = SMP_T_SINT; return 1; } @@ -1728,7 +1739,8 @@ static int sample_conv_xxh64(const struct arg *arg_p, struct sample *smp, void * seed = (unsigned long long int)arg_p->data.sint; else seed = 0; - smp->data.u.sint = (long long int)XXH64(smp->data.u.str.str, smp->data.u.str.len, seed); + smp->data.u.sint = (long long int)XXH64(smp->data.u.str.area, + smp->data.u.str.data, seed); smp->data.type = SMP_T_SINT; return 1; } @@ -1736,7 +1748,8 @@ static int sample_conv_xxh64(const struct arg *arg_p, struct sample *smp, void * /* hashes the binary input into a 32-bit unsigned int */ static int sample_conv_crc32(const struct arg *arg_p, struct sample *smp, void *private) { - smp->data.u.sint = hash_crc32(smp->data.u.str.str, smp->data.u.str.len); + smp->data.u.sint = hash_crc32(smp->data.u.str.area, + smp->data.u.str.data); if (arg_p && arg_p->data.sint) smp->data.u.sint = full_hash(smp->data.u.sint); smp->data.type = SMP_T_SINT; @@ -1746,7 +1759,8 @@ static int sample_conv_crc32(const struct arg *arg_p, struct sample *smp, void * /* hashes the binary input into crc32c (RFC4960, Appendix B [8].) */ static int sample_conv_crc32c(const struct arg *arg_p, struct sample *smp, void *private) { - smp->data.u.sint = hash_crc32c(smp->data.u.str.str, smp->data.u.str.len); + smp->data.u.sint = hash_crc32c(smp->data.u.str.area, + smp->data.u.str.data); if (arg_p && arg_p->data.sint) smp->data.u.sint = full_hash(smp->data.u.sint); smp->data.type = SMP_T_SINT; @@ -1783,37 +1797,37 @@ static int sample_conv_json_check(struct arg *arg, struct sample_conv *conv, return 0; } - if (strcmp(arg->data.str.str, "") == 0) { + if (strcmp(arg->data.str.area, "") == 0) { arg->type = ARGT_SINT; arg->data.sint = IT_ASCII; return 1; } - else if (strcmp(arg->data.str.str, "ascii") == 0) { + else if (strcmp(arg->data.str.area, "ascii") == 0) { arg->type = ARGT_SINT; arg->data.sint = IT_ASCII; return 1; } - else if (strcmp(arg->data.str.str, "utf8") == 0) { + else if (strcmp(arg->data.str.area, "utf8") == 0) { arg->type = ARGT_SINT; arg->data.sint = IT_UTF8; return 1; } - else if (strcmp(arg->data.str.str, "utf8s") == 0) { + else if (strcmp(arg->data.str.area, "utf8s") == 0) { arg->type = ARGT_SINT; arg->data.sint = IT_UTF8S; return 1; } - else if (strcmp(arg->data.str.str, "utf8p") == 0) { + else if (strcmp(arg->data.str.area, "utf8p") == 0) { arg->type = ARGT_SINT; arg->data.sint = IT_UTF8P; return 1; } - else if (strcmp(arg->data.str.str, "utf8ps") == 0) { + else if (strcmp(arg->data.str.area, "utf8ps") == 0) { arg->type = ARGT_SINT; arg->data.sint = IT_UTF8PS; return 1; @@ -1839,10 +1853,10 @@ static int sample_conv_json(const struct arg *arg_p, struct sample *smp, void *p input_type = arg_p->data.sint; temp = get_trash_chunk(); - temp->len = 0; + temp->data = 0; - p = smp->data.u.str.str; - while (p < smp->data.u.str.str + smp->data.u.str.len) { + p = smp->data.u.str.area; + while (p < smp->data.u.str.area + smp->data.u.str.data) { if (input_type == IT_ASCII) { /* Read input as ASCII. */ @@ -1851,7 +1865,9 @@ static int sample_conv_json(const struct arg *arg_p, struct sample *smp, void *p } else { /* Read input as UTF8. */ - ret = utf8_next(p, smp->data.u.str.len - ( p - smp->data.u.str.str ), &c); + ret = utf8_next(p, + smp->data.u.str.data - ( p - smp->data.u.str.area), + &c); p += utf8_return_length(ret); if (input_type == IT_UTF8 && utf8_return_code(ret) != UTF8_CODE_OK) @@ -1920,12 +1936,12 @@ static int sample_conv_json(const struct arg *arg_p, struct sample *smp, void *p } /* Check length */ - if (temp->len + len > temp->size) + if (temp->data + len > temp->size) return 0; /* Copy string. */ - memcpy(temp->str + temp->len, str, len); - temp->len += len; + memcpy(temp->area + temp->data, str, len); + temp->data += len; } smp->flags &= ~SMP_F_CONST; @@ -1940,18 +1956,18 @@ static int sample_conv_json(const struct arg *arg_p, struct sample *smp, void *p * Optional second arg is the length to truncate */ static int sample_conv_bytes(const struct arg *arg_p, struct sample *smp, void *private) { - if (smp->data.u.str.len <= arg_p[0].data.sint) { - smp->data.u.str.len = 0; + if (smp->data.u.str.data <= arg_p[0].data.sint) { + smp->data.u.str.data = 0; return 1; } if (smp->data.u.str.size) smp->data.u.str.size -= arg_p[0].data.sint; - smp->data.u.str.len -= arg_p[0].data.sint; - smp->data.u.str.str += arg_p[0].data.sint; + smp->data.u.str.data -= arg_p[0].data.sint; + smp->data.u.str.area += arg_p[0].data.sint; - if ((arg_p[1].type == ARGT_SINT) && (arg_p[1].data.sint < smp->data.u.str.len)) - smp->data.u.str.len = arg_p[1].data.sint; + if ((arg_p[1].type == ARGT_SINT) && (arg_p[1].data.sint < smp->data.u.str.data)) + smp->data.u.str.data = arg_p[1].data.sint; return 1; } @@ -1983,7 +1999,7 @@ static int sample_conv_field_check(struct arg *args, struct sample_conv *conv, return 0; } - if (!arg->data.str.len) { + if (!arg->data.str.data) { memprintf(err, "Empty separators list"); return 0; } @@ -2007,10 +2023,10 @@ static int sample_conv_field(const struct arg *arg_p, struct sample *smp, void * if (arg_p[0].data.sint < 0) { field = -1; - end = start = smp->data.u.str.str + smp->data.u.str.len; - while (start > smp->data.u.str.str) { - for (i = 0 ; i < arg_p[1].data.str.len ; i++) { - if (*(start-1) == arg_p[1].data.str.str[i]) { + end = start = smp->data.u.str.area + smp->data.u.str.data; + while (start > smp->data.u.str.area) { + for (i = 0 ; i < arg_p[1].data.str.data; i++) { + if (*(start-1) == arg_p[1].data.str.area[i]) { if (field == arg_p[0].data.sint) { if (count == 1) goto found; @@ -2027,10 +2043,10 @@ static int sample_conv_field(const struct arg *arg_p, struct sample *smp, void * } } else { field = 1; - end = start = smp->data.u.str.str; - while (end - smp->data.u.str.str < smp->data.u.str.len) { - for (i = 0 ; i < arg_p[1].data.str.len ; i++) { - if (*end == arg_p[1].data.str.str[i]) { + end = start = smp->data.u.str.area; + while (end - smp->data.u.str.area < smp->data.u.str.data) { + for (i = 0 ; i < arg_p[1].data.str.data; i++) { + if (*end == arg_p[1].data.str.area[i]) { if (field == arg_p[0].data.sint) { if (count == 1) goto found; @@ -2049,22 +2065,22 @@ static int sample_conv_field(const struct arg *arg_p, struct sample *smp, void * /* Field not found */ if (field != arg_p[0].data.sint) { - smp->data.u.str.len = 0; + smp->data.u.str.data = 0; return 1; } found: - smp->data.u.str.len = end - start; + smp->data.u.str.data = end - start; /* If ret string is len 0, no need to change pointers or to update size */ - if (!smp->data.u.str.len) + if (!smp->data.u.str.data) return 1; - smp->data.u.str.str = start; + smp->data.u.str.area = start; /* Compute remaining size if needed Note: smp->data.u.str.size cannot be set to 0 */ if (smp->data.u.str.size) - smp->data.u.str.size -= start - smp->data.u.str.str; + smp->data.u.str.size -= start - smp->data.u.str.area; return 1; } @@ -2086,11 +2102,11 @@ static int sample_conv_word(const struct arg *arg_p, struct sample *smp, void *p word = 0; inword = 0; if (arg_p[0].data.sint < 0) { - end = start = smp->data.u.str.str + smp->data.u.str.len; - while (start > smp->data.u.str.str) { + end = start = smp->data.u.str.area + smp->data.u.str.data; + while (start > smp->data.u.str.area) { issep = 0; - for (i = 0 ; i < arg_p[1].data.str.len ; i++) { - if (*(start-1) == arg_p[1].data.str.str[i]) { + for (i = 0 ; i < arg_p[1].data.str.data; i++) { + if (*(start-1) == arg_p[1].data.str.area[i]) { issep = 1; break; } @@ -2116,11 +2132,11 @@ static int sample_conv_word(const struct arg *arg_p, struct sample *smp, void *p start--; } } else { - end = start = smp->data.u.str.str; - while (end - smp->data.u.str.str < smp->data.u.str.len) { + end = start = smp->data.u.str.area; + while (end - smp->data.u.str.area < smp->data.u.str.data) { issep = 0; - for (i = 0 ; i < arg_p[1].data.str.len ; i++) { - if (*end == arg_p[1].data.str.str[i]) { + for (i = 0 ; i < arg_p[1].data.str.data; i++) { + if (*end == arg_p[1].data.str.area[i]) { issep = 1; break; } @@ -2149,22 +2165,22 @@ static int sample_conv_word(const struct arg *arg_p, struct sample *smp, void *p /* Field not found */ if (word != arg_p[0].data.sint) { - smp->data.u.str.len = 0; + smp->data.u.str.data = 0; return 1; } found: - smp->data.u.str.len = end - start; + smp->data.u.str.data = end - start; /* If ret string is len 0, no need to change pointers or to update size */ - if (!smp->data.u.str.len) + if (!smp->data.u.str.data) return 1; - smp->data.u.str.str = start; + smp->data.u.str.area = start; /* Compute remaining size if needed Note: smp->data.u.str.size cannot be set to 0 */ if (smp->data.u.str.size) - smp->data.u.str.size -= start - smp->data.u.str.str; + smp->data.u.str.size -= start - smp->data.u.str.area; return 1; } @@ -2182,8 +2198,8 @@ static int sample_conv_regsub_check(struct arg *args, struct sample_conv *conv, if (arg[2].type != ARGT_STR) return 1; - p = arg[2].data.str.str; - len = arg[2].data.str.len; + p = arg[2].data.str.area; + len = arg[2].data.str.data; while (len) { if (*p == 'i') { arg[0].type_flags |= ARGF_REG_ICASE; @@ -2215,8 +2231,8 @@ static int sample_conv_regsub(const struct arg *arg_p, struct sample *smp, void int flag, max; int found; - start = smp->data.u.str.str; - end = start + smp->data.u.str.len; + start = smp->data.u.str.area; + end = start + smp->data.u.str.data; flag = 0; while (1) { @@ -2233,24 +2249,25 @@ static int sample_conv_regsub(const struct arg *arg_p, struct sample *smp, void pmatch[0].rm_so = end - start; /* copy the heading non-matching part (which may also be the tail if nothing matches) */ - max = trash->size - trash->len; + max = trash->size - trash->data; if (max && pmatch[0].rm_so > 0) { if (max > pmatch[0].rm_so) max = pmatch[0].rm_so; - memcpy(trash->str + trash->len, start, max); - trash->len += max; + memcpy(trash->area + trash->data, start, max); + trash->data += max; } if (!found) break; /* replace the matching part */ - max = trash->size - trash->len; + max = trash->size - trash->data; if (max) { - if (max > arg_p[1].data.str.len) - max = arg_p[1].data.str.len; - memcpy(trash->str + trash->len, arg_p[1].data.str.str, max); - trash->len += max; + if (max > arg_p[1].data.str.data) + max = arg_p[1].data.str.data; + memcpy(trash->area + trash->data, + arg_p[1].data.str.area, max); + trash->data += max; } /* stop here if we're done with this string */ @@ -2262,8 +2279,8 @@ static int sample_conv_regsub(const struct arg *arg_p, struct sample *smp, void * so we have to copy that character and skip to the next one. */ if (!pmatch[0].rm_eo) { - if (trash->len < trash->size) - trash->str[trash->len++] = start[pmatch[0].rm_eo]; + if (trash->data < trash->size) + trash->area[trash->data++] = start[pmatch[0].rm_eo]; pmatch[0].rm_eo++; } @@ -2289,7 +2306,7 @@ static int check_operator(struct arg *args, struct sample_conv *conv, return 1; /* Try to convert an integer */ - str = args[0].data.str.str; + str = args[0].data.str.area; end = str + strlen(str); args[0].data.sint = read_int64(&str, end); if (*str != '\0') { @@ -2617,22 +2634,22 @@ static int sample_conv_concat(const struct arg *arg_p, struct sample *smp, void int max; trash = get_trash_chunk(); - trash->len = smp->data.u.str.len; - if (trash->len > trash->size - 1) - trash->len = trash->size - 1; + trash->data = smp->data.u.str.data; + if (trash->data > trash->size - 1) + trash->data = trash->size - 1; - memcpy(trash->str, smp->data.u.str.str, trash->len); - trash->str[trash->len] = 0; + memcpy(trash->area, smp->data.u.str.area, trash->data); + trash->area[trash->data] = 0; /* append first string */ - max = arg_p[0].data.str.len; - if (max > trash->size - 1 - trash->len) - max = trash->size - 1 - trash->len; + max = arg_p[0].data.str.data; + if (max > trash->size - 1 - trash->data) + max = trash->size - 1 - trash->data; if (max) { - memcpy(trash->str + trash->len, arg_p[0].data.str.str, max); - trash->len += max; - trash->str[trash->len] = 0; + memcpy(trash->area + trash->data, arg_p[0].data.str.area, max); + trash->data += max; + trash->area[trash->data] = 0; } /* append second string (variable) if it's found and we can turn it @@ -2643,26 +2660,27 @@ static int sample_conv_concat(const struct arg *arg_p, struct sample *smp, void (sample_casts[tmp.data.type][SMP_T_STR] == c_none || sample_casts[tmp.data.type][SMP_T_STR](&tmp))) { - max = tmp.data.u.str.len; - if (max > trash->size - 1 - trash->len) - max = trash->size - 1 - trash->len; + max = tmp.data.u.str.data; + if (max > trash->size - 1 - trash->data) + max = trash->size - 1 - trash->data; if (max) { - memcpy(trash->str + trash->len, tmp.data.u.str.str, max); - trash->len += max; - trash->str[trash->len] = 0; + memcpy(trash->area + trash->data, tmp.data.u.str.area, + max); + trash->data += max; + trash->area[trash->data] = 0; } } /* append third string */ - max = arg_p[2].data.str.len; - if (max > trash->size - 1 - trash->len) - max = trash->size - 1 - trash->len; + max = arg_p[2].data.str.data; + if (max > trash->size - 1 - trash->data) + max = trash->size - 1 - trash->data; if (max) { - memcpy(trash->str + trash->len, arg_p[2].data.str.str, max); - trash->len += max; - trash->str[trash->len] = 0; + memcpy(trash->area + trash->data, arg_p[2].data.str.area, max); + trash->data += max; + trash->area[trash->data] = 0; } smp->data.u.str = *trash; @@ -2677,8 +2695,9 @@ static int smp_check_concat(struct arg *args, struct sample_conv *conv, const char *file, int line, char **err) { /* Try to decode a variable. */ - if (args[1].data.str.len > 0 && !vars_check_arg(&args[1], NULL)) { - memprintf(err, "failed to register variable name '%s'", args[1].data.str.str); + if (args[1].data.str.data > 0 && !vars_check_arg(&args[1], NULL)) { + memprintf(err, "failed to register variable name '%s'", + args[1].data.str.area); return 0; } return 1; @@ -2700,11 +2719,11 @@ static int sample_conv_strcmp(const struct arg *arg_p, struct sample *smp, void if (!sample_casts[tmp.data.type][SMP_T_STR](&tmp)) return 0; - max = MIN(smp->data.u.str.len, tmp.data.u.str.len); - result = strncmp(smp->data.u.str.str, tmp.data.u.str.str, max); + max = MIN(smp->data.u.str.data, tmp.data.u.str.data); + result = strncmp(smp->data.u.str.area, tmp.data.u.str.area, max); if (result == 0) { - if (smp->data.u.str.len != tmp.data.u.str.len) { - if (smp->data.u.str.len < tmp.data.u.str.len) { + if (smp->data.u.str.data != tmp.data.u.str.data) { + if (smp->data.u.str.data < tmp.data.u.str.data) { result = -1; } else { @@ -2728,7 +2747,8 @@ static int smp_check_strcmp(struct arg *args, struct sample_conv *conv, if (vars_check_arg(&args[0], NULL)) return 1; - memprintf(err, "failed to register variable name '%s'", args[0].data.str.str); + memprintf(err, "failed to register variable name '%s'", + args[0].data.str.area); return 0; } @@ -2766,14 +2786,14 @@ smp_fetch_env(const struct arg *args, struct sample *smp, const char *kw, void * if (!args || args[0].type != ARGT_STR) return 0; - env = getenv(args[0].data.str.str); + env = getenv(args[0].data.str.area); if (!env) return 0; smp->data.type = SMP_T_STR; smp->flags = SMP_F_CONST; - smp->data.u.str.str = env; - smp->data.u.str.len = strlen(env); + smp->data.u.str.area = env; + smp->data.u.str.data = strlen(env); return 1; } @@ -2811,8 +2831,8 @@ smp_fetch_hostname(const struct arg *args, struct sample *smp, const char *kw, v { smp->data.type = SMP_T_STR; smp->flags = SMP_F_CONST; - smp->data.u.str.str = hostname; - smp->data.u.str.len = strlen(hostname); + smp->data.u.str.area = hostname; + smp->data.u.str.data = strlen(hostname); return 1; } @@ -2873,21 +2893,21 @@ static int smp_fetch_const_str(const struct arg *args, struct sample *smp, const { smp->flags |= SMP_F_CONST; smp->data.type = SMP_T_STR; - smp->data.u.str.str = args[0].data.str.str; - smp->data.u.str.len = args[0].data.str.len; + smp->data.u.str.area = args[0].data.str.area; + smp->data.u.str.data = args[0].data.str.data; return 1; } static int smp_check_const_bool(struct arg *args, char **err) { - if (strcasecmp(args[0].data.str.str, "true") == 0 || - strcasecmp(args[0].data.str.str, "1") == 0) { + if (strcasecmp(args[0].data.str.area, "true") == 0 || + strcasecmp(args[0].data.str.area, "1") == 0) { args[0].type = ARGT_SINT; args[0].data.sint = 1; return 1; } - if (strcasecmp(args[0].data.str.str, "false") == 0 || - strcasecmp(args[0].data.str.str, "0") == 0) { + if (strcasecmp(args[0].data.str.area, "false") == 0 || + strcasecmp(args[0].data.str.area, "0") == 0) { args[0].type = ARGT_SINT; args[0].data.sint = 0; return 1; @@ -2929,11 +2949,11 @@ static int smp_check_const_bin(struct arg *args, char **err) char *binstr = NULL; int binstrlen; - if (!parse_binary(args[0].data.str.str, &binstr, &binstrlen, err)) + if (!parse_binary(args[0].data.str.area, &binstr, &binstrlen, err)) return 0; args[0].type = ARGT_STR; - args[0].data.str.str = binstr; - args[0].data.str.len = binstrlen; + args[0].data.str.area = binstr; + args[0].data.str.data = binstrlen; return 1; } @@ -2941,8 +2961,8 @@ static int smp_fetch_const_bin(const struct arg *args, struct sample *smp, const { smp->flags |= SMP_F_CONST; smp->data.type = SMP_T_BIN; - smp->data.u.str.str = args[0].data.str.str; - smp->data.u.str.len = args[0].data.str.len; + smp->data.u.str.area = args[0].data.str.area; + smp->data.u.str.data = args[0].data.str.data; return 1; } @@ -2951,7 +2971,7 @@ static int smp_check_const_meth(struct arg *args, char **err) enum http_meth_t meth; int i; - meth = find_http_meth(args[0].data.str.str, args[0].data.str.len); + meth = find_http_meth(args[0].data.str.area, args[0].data.str.data); if (meth != HTTP_METH_OTHER) { args[0].type = ARGT_SINT; args[0].data.sint = meth; @@ -2961,8 +2981,8 @@ static int smp_check_const_meth(struct arg *args, char **err) * "^" / "_" / "`" / "|" / "~" / DIGIT / ALPHA * token = 1*tchar */ - for (i = 0; i < args[0].data.str.len; i++) { - if (!HTTP_IS_TOKEN(args[0].data.str.str[i])) { + for (i = 0; i < args[0].data.str.data; i++) { + if (!HTTP_IS_TOKEN(args[0].data.str.area[i])) { memprintf(err, "expects valid method."); return 0; } @@ -2977,13 +2997,13 @@ static int smp_fetch_const_meth(const struct arg *args, struct sample *smp, cons if (args[0].type == ARGT_SINT) { smp->flags &= ~SMP_F_CONST; smp->data.u.meth.meth = args[0].data.sint; - smp->data.u.meth.str.str = ""; - smp->data.u.meth.str.len = 0; + smp->data.u.meth.str.area = ""; + smp->data.u.meth.str.data = 0; } else { smp->flags |= SMP_F_CONST; smp->data.u.meth.meth = HTTP_METH_OTHER; - smp->data.u.meth.str.str = args[0].data.str.str; - smp->data.u.meth.str.len = args[0].data.str.len; + smp->data.u.meth.str.area = args[0].data.str.area; + smp->data.u.meth.str.data = args[0].data.str.data; } return 1; } diff --git a/src/server.c b/src/server.c index 17d7663e8..422f8bf1c 100644 --- a/src/server.c +++ b/src/server.c @@ -142,7 +142,7 @@ void srv_set_dyncookie(struct server *s) * on the safe side. */ buffer_len = key_len + addr_len + 4; - tmpbuf = trash.str; + tmpbuf = trash.area; memcpy(tmpbuf, p->dyncookie_key, key_len); memcpy(&(tmpbuf[key_len]), s->addr.ss_family == AF_INET ? @@ -1437,7 +1437,7 @@ static int srv_prepare_for_resolution(struct server *srv, const char *hostname) return 0; hostname_len = strlen(hostname); - hostname_dn = trash.str; + hostname_dn = trash.area; hostname_dn_len = dns_str_to_dn_label(hostname, hostname_len + 1, hostname_dn, trash.size); if (hostname_dn_len == -1) @@ -1826,9 +1826,9 @@ static int srv_tmpl_parse_range(struct server *srv, const char *arg, int *nb_low *nb_high = 0; chunk_printf(&trash, "%s", arg); - *nb_low = atoi(trash.str); + *nb_low = atoi(trash.area); - if ((nb_high_arg = strchr(trash.str, '-'))) { + if ((nb_high_arg = strchr(trash.area, '-'))) { *nb_high_arg++ = '\0'; *nb_high = atoi(nb_high_arg); } @@ -1847,7 +1847,7 @@ static inline void srv_set_id_from_prefix(struct server *srv, const char *prefix { chunk_printf(&trash, "%s%d", prefix, nb); free(srv->id); - srv->id = strdup(trash.str); + srv->id = strdup(trash.area); } /* @@ -2861,7 +2861,7 @@ static void srv_update_state(struct server *srv, int version, char **params) } /* don't apply anything if one error has been detected */ - if (msg->len) + if (msg->data) goto out; HA_SPIN_LOCK(SERVER_LOCK, &srv->lock); @@ -3003,10 +3003,10 @@ static void srv_update_state(struct server *srv, int version, char **params) } out: - if (msg->len) { + if (msg->data) { chunk_appendf(msg, "\n"); ha_warning("server-state application failed for server '%s/%s'%s", - srv->proxy->id, srv->id, msg->str); + srv->proxy->id, srv->id, msg->area); } } @@ -3370,10 +3370,10 @@ int update_server_addr(struct server *s, void *ip, int ip_sin_family, const char s->proxy->id, s->id, oldip, newip, updater); /* write the buffer on stderr */ - ha_warning("%s.\n", trash.str); + ha_warning("%s.\n", trash.area); /* send a log */ - send_log(s->proxy, LOG_NOTICE, "%s.\n", trash.str); + send_log(s->proxy, LOG_NOTICE, "%s.\n", trash.area); } /* save the new IP family */ @@ -3559,7 +3559,7 @@ out: if (updater) chunk_appendf(msg, " by '%s'", updater); chunk_appendf(msg, "\n"); - return msg->str; + return msg->area; } @@ -3600,8 +3600,8 @@ int snr_update_srv_status(struct server *s, int has_no_ip) chunk_printf(&trash, "Server %s/%s administratively READY thanks to valid DNS answer", s->proxy->id, s->id); - ha_warning("%s.\n", trash.str); - send_log(s->proxy, LOG_NOTICE, "%s.\n", trash.str); + ha_warning("%s.\n", trash.area); + send_log(s->proxy, LOG_NOTICE, "%s.\n", trash.area); return 0; case RSLV_STATUS_NX: @@ -3743,7 +3743,7 @@ int snr_resolution_cb(struct dns_requester *requester, struct dns_nameserver *na } else chunk_printf(chk, "DNS cache"); - update_server_addr(s, firstip, firstip_sin_family, (char *)chk->str); + update_server_addr(s, firstip, firstip_sin_family, (char *) chk->area); update_status: snr_update_srv_status(s, has_no_ip); @@ -3873,7 +3873,7 @@ int srv_set_fqdn(struct server *srv, const char *hostname, int dns_locked) chunk_reset(&trash); hostname_len = strlen(hostname); - hostname_dn = trash.str; + hostname_dn = trash.area; hostname_dn_len = dns_str_to_dn_label(hostname, hostname_len + 1, hostname_dn, trash.size); if (hostname_dn_len == -1) @@ -4068,7 +4068,7 @@ const char *update_server_fqdn(struct server *server, const char *fqdn, const ch chunk_appendf(msg, " by '%s'", updater); chunk_appendf(msg, "\n"); - return msg->str; + return msg->area; } @@ -4329,8 +4329,9 @@ static int cli_parse_get_weight(char **args, char *payload, struct appctx *appct } /* return server's effective weight at the moment */ - snprintf(trash.str, trash.size, "%d (initial %d)\n", sv->uweight, sv->iweight); - if (ci_putstr(si_ic(si), trash.str) == -1) { + snprintf(trash.area, trash.size, "%d (initial %d)\n", sv->uweight, + sv->iweight); + if (ci_putstr(si_ic(si), trash.area) == -1) { si_applet_cant_put(si); return 0; } @@ -4557,12 +4558,14 @@ void srv_update_status(struct server *s) s->proxy->id, s->id); srv_append_status(tmptrash, s, NULL, xferred, 0); - ha_warning("%s.\n", tmptrash->str); + ha_warning("%s.\n", tmptrash->area); /* we don't send an alert if the server was previously paused */ log_level = srv_was_stopping ? LOG_NOTICE : LOG_ALERT; - send_log(s->proxy, log_level, "%s.\n", tmptrash->str); - send_email_alert(s, log_level, "%s", tmptrash->str); + send_log(s->proxy, log_level, "%s.\n", + tmptrash->area); + send_email_alert(s, log_level, "%s", + tmptrash->area); free_trash_chunk(tmptrash); tmptrash = NULL; } @@ -4590,8 +4593,9 @@ void srv_update_status(struct server *s) srv_append_status(tmptrash, s, NULL, xferred, 0); - ha_warning("%s.\n", tmptrash->str); - send_log(s->proxy, LOG_NOTICE, "%s.\n", tmptrash->str); + ha_warning("%s.\n", tmptrash->area); + send_log(s->proxy, LOG_NOTICE, "%s.\n", + tmptrash->area); free_trash_chunk(tmptrash); tmptrash = NULL; } @@ -4648,9 +4652,11 @@ void srv_update_status(struct server *s) s->proxy->id, s->id); srv_append_status(tmptrash, s, NULL, xferred, 0); - ha_warning("%s.\n", tmptrash->str); - send_log(s->proxy, LOG_NOTICE, "%s.\n", tmptrash->str); - send_email_alert(s, LOG_NOTICE, "%s", tmptrash->str); + ha_warning("%s.\n", tmptrash->area); + send_log(s->proxy, LOG_NOTICE, "%s.\n", + tmptrash->area); + send_email_alert(s, LOG_NOTICE, "%s", + tmptrash->area); free_trash_chunk(tmptrash); tmptrash = NULL; } @@ -4703,8 +4709,9 @@ void srv_update_status(struct server *s) srv_append_status(tmptrash, s, NULL, -1, (s->next_admin & SRV_ADMF_FMAINT)); if (!(global.mode & MODE_STARTING)) { - ha_warning("%s.\n", tmptrash->str); - send_log(s->proxy, LOG_NOTICE, "%s.\n", tmptrash->str); + ha_warning("%s.\n", tmptrash->area); + send_log(s->proxy, LOG_NOTICE, "%s.\n", + tmptrash->area); } free_trash_chunk(tmptrash); tmptrash = NULL; @@ -4741,8 +4748,9 @@ void srv_update_status(struct server *s) srv_append_status(tmptrash, s, NULL, xferred, (s->next_admin & SRV_ADMF_FMAINT)); if (!(global.mode & MODE_STARTING)) { - ha_warning("%s.\n", tmptrash->str); - send_log(s->proxy, srv_was_stopping ? LOG_NOTICE : LOG_ALERT, "%s.\n", tmptrash->str); + ha_warning("%s.\n", tmptrash->area); + send_log(s->proxy, srv_was_stopping ? LOG_NOTICE : LOG_ALERT, "%s.\n", + tmptrash->area); } free_trash_chunk(tmptrash); tmptrash = NULL; @@ -4817,8 +4825,9 @@ void srv_update_status(struct server *s) (s->next_state == SRV_ST_STOPPED) ? "DOWN" : "UP", (s->next_admin & SRV_ADMF_DRAIN) ? "DRAIN" : "READY"); } - ha_warning("%s.\n", tmptrash->str); - send_log(s->proxy, LOG_NOTICE, "%s.\n", tmptrash->str); + ha_warning("%s.\n", tmptrash->area); + send_log(s->proxy, LOG_NOTICE, "%s.\n", + tmptrash->area); free_trash_chunk(tmptrash); tmptrash = NULL; } @@ -4855,8 +4864,9 @@ void srv_update_status(struct server *s) if (s->track) /* normally it's mandatory here */ chunk_appendf(tmptrash, " via %s/%s", s->track->proxy->id, s->track->id); - ha_warning("%s.\n", tmptrash->str); - send_log(s->proxy, LOG_NOTICE, "%s.\n", tmptrash->str); + ha_warning("%s.\n", tmptrash->area); + send_log(s->proxy, LOG_NOTICE, "%s.\n", + tmptrash->area); free_trash_chunk(tmptrash); tmptrash = NULL; } @@ -4872,8 +4882,9 @@ void srv_update_status(struct server *s) if (s->track) /* normally it's mandatory here */ chunk_appendf(tmptrash, " via %s/%s", s->track->proxy->id, s->track->id); - ha_warning("%s.\n", tmptrash->str); - send_log(s->proxy, LOG_NOTICE, "%s.\n", tmptrash->str); + ha_warning("%s.\n", tmptrash->area); + send_log(s->proxy, LOG_NOTICE, "%s.\n", + tmptrash->area); free_trash_chunk(tmptrash); tmptrash = NULL; } @@ -4885,8 +4896,9 @@ void srv_update_status(struct server *s) "%sServer %s/%s remains in forced maintenance", s->flags & SRV_F_BACKUP ? "Backup " : "", s->proxy->id, s->id); - ha_warning("%s.\n", tmptrash->str); - send_log(s->proxy, LOG_NOTICE, "%s.\n", tmptrash->str); + ha_warning("%s.\n", tmptrash->area); + send_log(s->proxy, LOG_NOTICE, "%s.\n", + tmptrash->area); free_trash_chunk(tmptrash); tmptrash = NULL; } @@ -4919,9 +4931,11 @@ void srv_update_status(struct server *s) srv_append_status(tmptrash, s, NULL, xferred, (s->next_admin & SRV_ADMF_FDRAIN)); if (!(global.mode & MODE_STARTING)) { - ha_warning("%s.\n", tmptrash->str); - send_log(s->proxy, LOG_NOTICE, "%s.\n", tmptrash->str); - send_email_alert(s, LOG_NOTICE, "%s", tmptrash->str); + ha_warning("%s.\n", tmptrash->area); + send_log(s->proxy, LOG_NOTICE, "%s.\n", + tmptrash->area); + send_email_alert(s, LOG_NOTICE, "%s", + tmptrash->area); } free_trash_chunk(tmptrash); tmptrash = NULL; @@ -4963,8 +4977,9 @@ void srv_update_status(struct server *s) s->track->proxy->id, s->track->id); } - ha_warning("%s.\n", tmptrash->str); - send_log(s->proxy, LOG_NOTICE, "%s.\n", tmptrash->str); + ha_warning("%s.\n", tmptrash->area); + send_log(s->proxy, LOG_NOTICE, "%s.\n", + tmptrash->area); free_trash_chunk(tmptrash); tmptrash = NULL; } @@ -5002,8 +5017,9 @@ void srv_update_status(struct server *s) s->flags & SRV_F_BACKUP ? "Backup " : "", s->proxy->id, s->id); } - ha_warning("%s.\n", tmptrash->str); - send_log(s->proxy, LOG_NOTICE, "%s.\n", tmptrash->str); + ha_warning("%s.\n", tmptrash->area); + send_log(s->proxy, LOG_NOTICE, "%s.\n", + tmptrash->area); free_trash_chunk(tmptrash); tmptrash = NULL; } diff --git a/src/session.c b/src/session.c index ae2d9e1d9..6cea612c5 100644 --- a/src/session.c +++ b/src/session.c @@ -282,9 +282,10 @@ int session_accept_fd(struct listener *l, int cfd, struct sockaddr_storage *addr if (ret < 0 && l->bind_conf->xprt == xprt_get(XPRT_RAW) && p->mode == PR_MODE_HTTP) { /* critical error, no more memory, try to emit a 500 response */ struct chunk *err_msg = &p->errmsg[HTTP_ERR_500]; - if (!err_msg->str) + if (!err_msg->area) err_msg = &http_err_chunks[HTTP_ERR_500]; - send(cfd, err_msg->str, err_msg->len, MSG_DONTWAIT|MSG_NOSIGNAL); + send(cfd, err_msg->area, err_msg->data, + MSG_DONTWAIT|MSG_NOSIGNAL); } if (fdtab[cfd].owner) @@ -316,8 +317,9 @@ static void session_prepare_log_prefix(struct session *sess) chunk_printf(&trash, "%s:%d [", pn, get_host_port(&cli_conn->addr.from)); get_localtime(sess->accept_date.tv_sec, &tm); - end = date2str_log(trash.str + trash.len, &tm, &(sess->accept_date), trash.size - trash.len); - trash.len = end - trash.str; + end = date2str_log(trash.area + trash.data, &tm, &(sess->accept_date), + trash.size - trash.data); + trash.data = end - trash.area; if (sess->listener->name) chunk_appendf(&trash, "] %s/%s", sess->fe->id, sess->listener->name); else @@ -362,10 +364,11 @@ static void session_kill_embryonic(struct session *sess) session_prepare_log_prefix(sess); err_msg = conn_err_code_str(conn); if (err_msg) - send_log(sess->fe, level, "%s: %s\n", trash.str, err_msg); + send_log(sess->fe, level, "%s: %s\n", trash.area, + err_msg); else send_log(sess->fe, level, "%s: unknown connection error (code=%d flags=%08x)\n", - trash.str, conn->err_code, conn->flags); + trash.area, conn->err_code, conn->flags); } /* kill the connection now */ diff --git a/src/ssl_sock.c b/src/ssl_sock.c index 9e3341a31..b0b7d2543 100644 --- a/src/ssl_sock.c +++ b/src/ssl_sock.c @@ -64,6 +64,7 @@ #include #include +#include #include #include #include @@ -649,13 +650,14 @@ static int ssl_sock_load_ocsp_response(struct chunk *ocsp_response, struct certi OCSP_BASICRESP *bs = NULL; OCSP_SINGLERESP *sr; OCSP_CERTID *id; - unsigned char *p = (unsigned char *)ocsp_response->str; + unsigned char *p = (unsigned char *) ocsp_response->area; int rc , count_sr; ASN1_GENERALIZEDTIME *revtime, *thisupd, *nextupd = NULL; int reason; int ret = 1; - resp = d2i_OCSP_RESPONSE(NULL, (const unsigned char **)&p, ocsp_response->len); + resp = d2i_OCSP_RESPONSE(NULL, (const unsigned char **)&p, + ocsp_response->data); if (!resp) { memprintf(err, "Unable to parse OCSP response"); goto out; @@ -787,9 +789,9 @@ static int ssl_sock_load_ocsp_response_from_file(const char *ocsp_path, struct c goto end; } - trash.len = 0; - while (trash.len < trash.size) { - r = read(fd, trash.str + trash.len, trash.size - trash.len); + trash.data = 0; + while (trash.data < trash.size) { + r = read(fd, trash.area + trash.data, trash.size - trash.data); if (r < 0) { if (errno == EINTR) continue; @@ -800,7 +802,7 @@ static int ssl_sock_load_ocsp_response_from_file(const char *ocsp_path, struct c else if (r == 0) { break; } - trash.len += r; + trash.data += r; } close(fd); @@ -887,7 +889,8 @@ struct tls_keys_ref *tlskeys_ref_lookupid(int unique_id) void ssl_sock_update_tlskey_ref(struct tls_keys_ref *ref, struct chunk *tlskey) { HA_RWLOCK_WRLOCK(TLSKEYS_REF_LOCK, &ref->lock); - memcpy((char *) (ref->tlskeys + ((ref->tls_ticket_enc_index + 2) % TLS_TICKETS_NO)), tlskey->str, tlskey->len); + memcpy((char *) (ref->tlskeys + ((ref->tls_ticket_enc_index + 2) % TLS_TICKETS_NO)), + tlskey->area, tlskey->data); ref->tls_ticket_enc_index = (ref->tls_ticket_enc_index + 1) % TLS_TICKETS_NO; HA_RWLOCK_WRUNLOCK(TLSKEYS_REF_LOCK, &ref->lock); } @@ -1005,17 +1008,17 @@ int ssl_sock_ocsp_stapling_cbk(SSL *ssl, void *arg) } if (!ocsp || - !ocsp->response.str || - !ocsp->response.len || + !ocsp->response.area || + !ocsp->response.data || (ocsp->expire < now.tv_sec)) return SSL_TLSEXT_ERR_NOACK; - ssl_buf = OPENSSL_malloc(ocsp->response.len); + ssl_buf = OPENSSL_malloc(ocsp->response.data); if (!ssl_buf) return SSL_TLSEXT_ERR_NOACK; - memcpy(ssl_buf, ocsp->response.str, ocsp->response.len); - SSL_set_tlsext_status_ocsp_resp(ssl, ssl_buf, ocsp->response.len); + memcpy(ssl_buf, ocsp->response.area, ocsp->response.data); + SSL_set_tlsext_status_ocsp_resp(ssl, ssl_buf, ocsp->response.data); return SSL_TLSEXT_ERR_OK; } @@ -1232,9 +1235,9 @@ static int ssl_sock_set_ocsp_response_from_file(SSL_CTX *ctx, const char *cert_p return -1; } - trash.len = 0; - while (trash.len < trash.size) { - r = read(fd, trash.str + trash.len, trash.size - trash.len); + trash.data = 0; + while (trash.data < trash.size) { + r = read(fd, trash.area + trash.data, trash.size - trash.data); if (r < 0) { if (errno == EINTR) continue; @@ -1245,10 +1248,11 @@ static int ssl_sock_set_ocsp_response_from_file(SSL_CTX *ctx, const char *cert_p else if (r == 0) { break; } - trash.len += r; + trash.data += r; } close(fd); - return SSL_CTX_set_ocsp_response(ctx, (const uint8_t *)trash.str, trash.len); + return SSL_CTX_set_ocsp_response(ctx, (const uint8_t *) trash.area, + trash.data); } #endif @@ -1269,13 +1273,13 @@ static int ssl_sock_parse_sctl(struct chunk *sctl) int len, pos, sct_len; unsigned char *data; - if (sctl->len < 2) + if (sctl->data < 2) goto out; - data = (unsigned char *)sctl->str; + data = (unsigned char *) sctl->area; len = (data[0] << 8) | data[1]; - if (len + 2 != sctl->len) + if (len + 2 != sctl->data) goto out; data = data + 2; @@ -1309,9 +1313,9 @@ static int ssl_sock_load_sctl_from_file(const char *sctl_path, struct chunk **sc if (fd == -1) goto end; - trash.len = 0; - while (trash.len < trash.size) { - r = read(fd, trash.str + trash.len, trash.size - trash.len); + trash.data = 0; + while (trash.data < trash.size) { + r = read(fd, trash.area + trash.data, trash.size - trash.data); if (r < 0) { if (errno == EINTR) continue; @@ -1321,7 +1325,7 @@ static int ssl_sock_load_sctl_from_file(const char *sctl_path, struct chunk **sc else if (r == 0) { break; } - trash.len += r; + trash.data += r; } ret = ssl_sock_parse_sctl(&trash); @@ -1346,8 +1350,8 @@ int ssl_sock_sctl_add_cbk(SSL *ssl, unsigned ext_type, const unsigned char **out { struct chunk *sctl = add_arg; - *out = (unsigned char *)sctl->str; - *outlen = sctl->len; + *out = (unsigned char *) sctl->area; + *outlen = sctl->data; return 1; } @@ -2219,14 +2223,14 @@ static int ssl_sock_switchctx_cbk(SSL *ssl, int *al, void *arg) } for (i = 0; i < trash.size && i < servername_len; i++) { - trash.str[i] = tolower(servername[i]); - if (!wildp && (trash.str[i] == '.')) - wildp = &trash.str[i]; + trash.area[i] = tolower(servername[i]); + if (!wildp && (trash.area[i] == '.')) + wildp = &trash.area[i]; } - trash.str[i] = 0; + trash.area[i] = 0; /* lookup in full qualified names */ - node = ebst_lookup(&s->sni_ctx, trash.str); + node = ebst_lookup(&s->sni_ctx, trash.area); /* lookup a not neg filter */ for (n = node; n; n = ebmb_next_dup(n)) { @@ -2296,7 +2300,7 @@ static int ssl_sock_switchctx_cbk(SSL *ssl, int *al, void *arg) goto allow_early; } #if (!defined SSL_NO_GENERATE_CERTIFICATES) - if (s->generate_certs && ssl_sock_generate_certificate(trash.str, s, ssl)) { + if (s->generate_certs && ssl_sock_generate_certificate(trash.area, s, ssl)) { /* switch ctx done in ssl_sock_generate_certificate */ goto allow_early; } @@ -2355,14 +2359,14 @@ static int ssl_sock_switchctx_cbk(SSL *ssl, int *al, void *priv) for (i = 0; i < trash.size; i++) { if (!servername[i]) break; - trash.str[i] = tolower(servername[i]); - if (!wildp && (trash.str[i] == '.')) - wildp = &trash.str[i]; + trash.area[i] = tolower(servername[i]); + if (!wildp && (trash.area[i] == '.')) + wildp = &trash.area[i]; } - trash.str[i] = 0; + trash.area[i] = 0; /* lookup in full qualified names */ - node = ebst_lookup(&s->sni_ctx, trash.str); + node = ebst_lookup(&s->sni_ctx, trash.area); /* lookup a not neg filter */ for (n = node; n; n = ebmb_next_dup(n)) { @@ -2685,16 +2689,16 @@ static int ssl_sock_add_cert_sni(SSL_CTX *ctx, struct bind_conf *s, struct ssl_b int j, len; len = strlen(name); for (j = 0; j < len && j < trash.size; j++) - trash.str[j] = tolower(name[j]); + trash.area[j] = tolower(name[j]); if (j >= trash.size) return order; - trash.str[j] = 0; + trash.area[j] = 0; /* Check for duplicates. */ if (wild) - node = ebst_lookup(&s->sni_w_ctx, trash.str); + node = ebst_lookup(&s->sni_w_ctx, trash.area); else - node = ebst_lookup(&s->sni_ctx, trash.str); + node = ebst_lookup(&s->sni_ctx, trash.area); for (; node; node = ebmb_next_dup(node)) { sc = ebmb_entry(node, struct sni_ctx, name); if (sc->ctx == ctx && sc->conf == conf && sc->neg == neg) @@ -2704,7 +2708,7 @@ static int ssl_sock_add_cert_sni(SSL_CTX *ctx, struct bind_conf *s, struct ssl_b sc = malloc(sizeof(struct sni_ctx) + len + 1); if (!sc) return order; - memcpy(sc->name.key, trash.str, len + 1); + memcpy(sc->name.key, trash.area, len + 1); sc->ctx = ctx; sc->conf = conf; sc->kinfo = kinfo; @@ -2929,10 +2933,10 @@ static void ssl_sock_populate_sni_keytypes_hplr(const char *str, struct eb_root for (i = 0; i < trash.size; i++) { if (!str[i]) break; - trash.str[i] = tolower(str[i]); + trash.area[i] = tolower(str[i]); } - trash.str[i] = 0; - node = ebst_lookup(sni_keytypes, trash.str); + trash.area[i] = 0; + node = ebst_lookup(sni_keytypes, trash.area); if (!node) { /* CN not found in tree */ s_kt = malloc(sizeof(struct sni_keytype) + i + 1); @@ -2940,7 +2944,7 @@ static void ssl_sock_populate_sni_keytypes_hplr(const char *str, struct eb_root * strncpy will cause sig_abrt errors under certain versions of gcc with -O2 * See: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=60792 */ - memcpy(s_kt->name.key, trash.str, i+1); + memcpy(s_kt->name.key, trash.area, i+1); s_kt->keytypes = 0; ebst_insert(sni_keytypes, &s_kt->name); } else { @@ -5822,8 +5826,8 @@ ssl_sock_get_serial(X509 *crt, struct chunk *out) if (out->size < serial->length) return -1; - memcpy(out->str, serial->data, serial->length); - out->len = serial->length; + memcpy(out->area, serial->data, serial->length); + out->data = serial->length; return 1; } @@ -5835,7 +5839,7 @@ static int ssl_sock_crt2der(X509 *crt, struct chunk *out) { int len; - unsigned char *p = (unsigned char *)out->str;; + unsigned char *p = (unsigned char *) out->area;; len =i2d_X509(crt, NULL); if (len <= 0) @@ -5845,7 +5849,7 @@ ssl_sock_crt2der(X509 *crt, struct chunk *out) return -1; i2d_X509(crt,&p); - out->len = len; + out->data = len; return 1; } @@ -5867,8 +5871,8 @@ ssl_sock_get_time(ASN1_TIME *tm, struct chunk *out) if (out->size < gentm->length-2) return -1; - memcpy(out->str, gentm->data+2, gentm->length-2); - out->len = gentm->length-2; + memcpy(out->area, gentm->data+2, gentm->length-2); + out->data = gentm->length-2; return 1; } else if (tm->type == V_ASN1_UTCTIME) { @@ -5881,8 +5885,8 @@ ssl_sock_get_time(ASN1_TIME *tm, struct chunk *out) if (out->size < utctm->length) return -1; - memcpy(out->str, utctm->data, utctm->length); - out->len = utctm->length; + memcpy(out->area, utctm->data, utctm->length); + out->data = utctm->length; return 1; } @@ -5908,7 +5912,7 @@ ssl_sock_get_dn_entry(X509_NAME *a, const struct chunk *entry, int pos, struct c name_count = X509_NAME_entry_count(a); - out->len = 0; + out->data = 0; for (i = 0; i < name_count; i++) { if (pos < 0) j = (name_count-1) - i; @@ -5940,8 +5944,8 @@ ssl_sock_get_dn_entry(X509_NAME *a, const struct chunk *entry, int pos, struct c if (data_len > out->size) return -1; - memcpy(out->str, data_ptr, data_len); - out->len = data_len; + memcpy(out->area, data_ptr, data_len); + out->data = data_len; return 1; } @@ -5970,8 +5974,8 @@ ssl_sock_get_dn_oneline(X509_NAME *a, struct chunk *out) name_count = X509_NAME_entry_count(a); - out->len = 0; - p = out->str; + out->data = 0; + p = out->area; for (i = 0; i < name_count; i++) { ne = X509_NAME_get_entry(a, i); obj = X509_NAME_ENTRY_get_object(ne); @@ -5988,7 +5992,7 @@ ssl_sock_get_dn_oneline(X509_NAME *a, struct chunk *out) l += 1 + ln + 1 + data_len; if (l > out->size) return -1; - out->len = l; + out->data = l; *(p++)='/'; memcpy(p, s, ln); @@ -5998,7 +6002,7 @@ ssl_sock_get_dn_oneline(X509_NAME *a, struct chunk *out) p += data_len; } - if (!out->len) + if (!out->data) return 0; return 1; @@ -6041,8 +6045,8 @@ int ssl_sock_get_remote_common_name(struct connection *conn, struct chunk *dest) X509_NAME *name; const char find_cn[] = "CN"; const struct chunk find_cn_chunk = { - .str = (char *)&find_cn, - .len = sizeof(find_cn)-1 + .area = (char *)&find_cn, + .data = sizeof(find_cn)-1 }; int result = -1; @@ -6288,7 +6292,8 @@ smp_fetch_ssl_x_sha1(const struct arg *args, struct sample *smp, const char *kw, smp_trash = get_trash_chunk(); digest = EVP_sha1(); - X509_digest(crt, digest, (unsigned char *)smp_trash->str, (unsigned int *)&smp_trash->len); + X509_digest(crt, digest, (unsigned char *) smp_trash->area, + (unsigned int *)&smp_trash->data); smp->data.u.str = *smp_trash; smp->data.type = SMP_T_BIN; @@ -6595,8 +6600,8 @@ smp_fetch_ssl_x_sig_alg(const struct arg *args, struct sample *smp, const char * X509_ALGOR_get0(&algorithm, NULL, NULL, X509_get0_tbs_sigalg(crt)); nid = OBJ_obj2nid(algorithm); - smp->data.u.str.str = (char *)OBJ_nid2sn(nid); - if (!smp->data.u.str.str) { + smp->data.u.str.area = (char *)OBJ_nid2sn(nid); + if (!smp->data.u.str.area) { /* SSL_get_peer_certificate increase X509 * ref count */ if (cert_peer) X509_free(crt); @@ -6605,7 +6610,7 @@ smp_fetch_ssl_x_sig_alg(const struct arg *args, struct sample *smp, const char * smp->data.type = SMP_T_STR; smp->flags |= SMP_F_CONST; - smp->data.u.str.len = strlen(smp->data.u.str.str); + smp->data.u.str.data = strlen(smp->data.u.str.area); /* SSL_get_peer_certificate increase X509 * ref count */ if (cert_peer) X509_free(crt); @@ -6645,8 +6650,8 @@ smp_fetch_ssl_x_key_alg(const struct arg *args, struct sample *smp, const char * X509_PUBKEY_get0_param(&algorithm, NULL, NULL, NULL, X509_get_X509_PUBKEY(crt)); nid = OBJ_obj2nid(algorithm); - smp->data.u.str.str = (char *)OBJ_nid2sn(nid); - if (!smp->data.u.str.str) { + smp->data.u.str.area = (char *)OBJ_nid2sn(nid); + if (!smp->data.u.str.area) { /* SSL_get_peer_certificate increase X509 * ref count */ if (cert_peer) X509_free(crt); @@ -6655,7 +6660,7 @@ smp_fetch_ssl_x_key_alg(const struct arg *args, struct sample *smp, const char * smp->data.type = SMP_T_STR; smp->flags |= SMP_F_CONST; - smp->data.u.str.len = strlen(smp->data.u.str.str); + smp->data.u.str.data = strlen(smp->data.u.str.area); if (cert_peer) X509_free(crt); @@ -6726,13 +6731,13 @@ smp_fetch_ssl_fc_cipher(const struct arg *args, struct sample *smp, const char * if (!conn || !conn->xprt_ctx || conn->xprt != &ssl_sock) return 0; - smp->data.u.str.str = (char *)SSL_get_cipher_name(conn->xprt_ctx); - if (!smp->data.u.str.str) + smp->data.u.str.area = (char *)SSL_get_cipher_name(conn->xprt_ctx); + if (!smp->data.u.str.area) return 0; smp->data.type = SMP_T_STR; smp->flags |= SMP_F_CONST; - smp->data.u.str.len = strlen(smp->data.u.str.str); + smp->data.u.str.data = strlen(smp->data.u.str.area); return 1; } @@ -6798,11 +6803,12 @@ smp_fetch_ssl_fc_npn(const struct arg *args, struct sample *smp, const char *kw, if (!conn || !conn->xprt_ctx || conn->xprt != &ssl_sock) return 0; - smp->data.u.str.str = NULL; + smp->data.u.str.area = NULL; SSL_get0_next_proto_negotiated(conn->xprt_ctx, - (const unsigned char **)&smp->data.u.str.str, (unsigned *)&smp->data.u.str.len); + (const unsigned char **)&smp->data.u.str.area, + (unsigned *)&smp->data.u.str.data); - if (!smp->data.u.str.str) + if (!smp->data.u.str.area) return 0; return 1; @@ -6822,11 +6828,12 @@ smp_fetch_ssl_fc_alpn(const struct arg *args, struct sample *smp, const char *kw if (!conn || !conn->xprt_ctx || conn->xprt != &ssl_sock) return 0; - smp->data.u.str.str = NULL; + smp->data.u.str.area = NULL; SSL_get0_alpn_selected(conn->xprt_ctx, - (const unsigned char **)&smp->data.u.str.str, (unsigned *)&smp->data.u.str.len); + (const unsigned char **)&smp->data.u.str.area, + (unsigned *)&smp->data.u.str.data); - if (!smp->data.u.str.str) + if (!smp->data.u.str.area) return 0; return 1; @@ -6847,13 +6854,13 @@ smp_fetch_ssl_fc_protocol(const struct arg *args, struct sample *smp, const char if (!conn || !conn->xprt_ctx || conn->xprt != &ssl_sock) return 0; - smp->data.u.str.str = (char *)SSL_get_version(conn->xprt_ctx); - if (!smp->data.u.str.str) + smp->data.u.str.area = (char *)SSL_get_version(conn->xprt_ctx); + if (!smp->data.u.str.area) return 0; smp->data.type = SMP_T_STR; smp->flags = SMP_F_CONST; - smp->data.u.str.len = strlen(smp->data.u.str.str); + smp->data.u.str.data = strlen(smp->data.u.str.area); return 1; } @@ -6880,8 +6887,9 @@ smp_fetch_ssl_fc_session_id(const struct arg *args, struct sample *smp, const ch if (!ssl_sess) return 0; - smp->data.u.str.str = (char *)SSL_SESSION_get_id(ssl_sess, (unsigned int *)&smp->data.u.str.len); - if (!smp->data.u.str.str || !smp->data.u.str.len) + smp->data.u.str.area = (char *)SSL_SESSION_get_id(ssl_sess, + (unsigned int *)&smp->data.u.str.data); + if (!smp->data.u.str.area || !smp->data.u.str.data) return 0; return 1; @@ -6906,8 +6914,10 @@ smp_fetch_ssl_fc_session_key(const struct arg *args, struct sample *smp, const c return 0; data = get_trash_chunk(); - data->len = SSL_SESSION_get_master_key(ssl_sess, (unsigned char *)data->str, data->size); - if (!data->len) + data->data = SSL_SESSION_get_master_key(ssl_sess, + (unsigned char *) data->area, + data->size); + if (!data->data) return 0; smp->flags = 0; @@ -6931,11 +6941,11 @@ smp_fetch_ssl_fc_sni(const struct arg *args, struct sample *smp, const char *kw, if (!conn || !conn->xprt_ctx || conn->xprt != &ssl_sock) return 0; - smp->data.u.str.str = (char *)SSL_get_servername(conn->xprt_ctx, TLSEXT_NAMETYPE_host_name); - if (!smp->data.u.str.str) + smp->data.u.str.area = (char *)SSL_get_servername(conn->xprt_ctx, TLSEXT_NAMETYPE_host_name); + if (!smp->data.u.str.area) return 0; - smp->data.u.str.len = strlen(smp->data.u.str.str); + smp->data.u.str.data = strlen(smp->data.u.str.area); return 1; } #endif @@ -6956,8 +6966,8 @@ smp_fetch_ssl_fc_cl_bin(const struct arg *args, struct sample *smp, const char * smp->flags = SMP_F_CONST; smp->data.type = SMP_T_BIN; - smp->data.u.str.str = capture->ciphersuite; - smp->data.u.str.len = capture->ciphersuite_len; + smp->data.u.str.area = capture->ciphersuite; + smp->data.u.str.data = capture->ciphersuite_len; return 1; } @@ -6970,7 +6980,7 @@ smp_fetch_ssl_fc_cl_hex(const struct arg *args, struct sample *smp, const char * return 0; data = get_trash_chunk(); - dump_binary(data, smp->data.u.str.str, smp->data.u.str.len); + dump_binary(data, smp->data.u.str.area, smp->data.u.str.data); smp->data.type = SMP_T_BIN; smp->data.u.str = *data; return 1; @@ -7006,10 +7016,10 @@ smp_fetch_ssl_fc_cl_str(const struct arg *args, struct sample *smp, const char * return 0; data = get_trash_chunk(); - for (i = 0; i + 1 < smp->data.u.str.len; i += 2) { + for (i = 0; i + 1 < smp->data.u.str.data; i += 2) { const char *str; const SSL_CIPHER *cipher; - const unsigned char *bin = (const unsigned char *)smp->data.u.str.str + i; + const unsigned char *bin = (const unsigned char *) smp->data.u.str.area + i; uint16_t id = (bin[0] << 8) | bin[1]; #if defined(OPENSSL_IS_BORINGSSL) cipher = SSL_get_cipher_by_value(id); @@ -7051,14 +7061,18 @@ smp_fetch_ssl_fc_unique_id(const struct arg *args, struct sample *smp, const cha finished_trash = get_trash_chunk(); if (!SSL_session_reused(conn->xprt_ctx)) - finished_len = SSL_get_peer_finished(conn->xprt_ctx, finished_trash->str, finished_trash->size); + finished_len = SSL_get_peer_finished(conn->xprt_ctx, + finished_trash->area, + finished_trash->size); else - finished_len = SSL_get_finished(conn->xprt_ctx, finished_trash->str, finished_trash->size); + finished_len = SSL_get_finished(conn->xprt_ctx, + finished_trash->area, + finished_trash->size); if (!finished_len) return 0; - finished_trash->len = finished_len; + finished_trash->data = finished_len; smp->data.u.str = *finished_trash; smp->data.type = SMP_T_BIN; @@ -8477,9 +8491,11 @@ static int cli_io_handler_tlskeys_files(struct appctx *appctx) { chunk_reset(t2); /* should never fail here because we dump only a key in the t2 buffer */ - t2->len = a2base64((char *)(ref->tlskeys + (head + 2 + appctx->ctx.cli.i1) % TLS_TICKETS_NO), - sizeof(struct tls_sess_key), t2->str, t2->size); - chunk_appendf(&trash, "%d.%d %s\n", ref->unique_id, appctx->ctx.cli.i1, t2->str); + t2->data = a2base64((char *)(ref->tlskeys + (head + 2 + appctx->ctx.cli.i1) % TLS_TICKETS_NO), + sizeof(struct tls_sess_key), + t2->area, t2->size); + chunk_appendf(&trash, "%d.%d %s\n", ref->unique_id, appctx->ctx.cli.i1, + t2->area); if (ci_putchk(si_ic(si), &trash) == -1) { /* let's try again later from this stream. We add ourselves into @@ -8565,8 +8581,9 @@ static int cli_parse_set_tlskeys(char **args, char *payload, struct appctx *appc return 1; } - trash.len = base64dec(args[4], strlen(args[4]), trash.str, trash.size); - if (trash.len != sizeof(struct tls_sess_key)) { + trash.data = base64dec(args[4], strlen(args[4]), trash.area, + trash.size); + if (trash.data != sizeof(struct tls_sess_key)) { appctx->ctx.cli.severity = LOG_ERR; appctx->ctx.cli.msg = "'set ssl tls-key' received invalid base64 encoded TLS key.\n"; appctx->st0 = CLI_ST_PRINT; @@ -8606,8 +8623,8 @@ static int cli_parse_set_ocspresponse(char **args, char *payload, struct appctx } payload[j] = 0; - trash.len = base64dec(payload, j, trash.str, trash.size); - if (trash.len < 0) { + trash.data = base64dec(payload, j, trash.area, trash.size); + if (trash.data < 0) { appctx->ctx.cli.severity = LOG_ERR; appctx->ctx.cli.msg = "'set ssl ocsp-response' received invalid base64 encoded response.\n"; appctx->st0 = CLI_ST_PRINT; diff --git a/src/standard.c b/src/standard.c index ebe043f18..86827dbbf 100644 --- a/src/standard.c +++ b/src/standard.c @@ -1300,7 +1300,7 @@ int url2sa(const char *url, int ulen, struct sockaddr_storage *addr, struct spli return -1; /* Look for ']' and copy the address in a trash buffer. */ - p = trash.str; + p = trash.area; for (end = curr; end < url + ulen && *end != ']'; end++, p++) @@ -1316,7 +1316,7 @@ int url2sa(const char *url, int ulen, struct sockaddr_storage *addr, struct spli } /* Try IPv6 decoding. */ - if (!inet_pton(AF_INET6, trash.str, &((struct sockaddr_in6 *)addr)->sin6_addr)) + if (!inet_pton(AF_INET6, trash.area, &((struct sockaddr_in6 *)addr)->sin6_addr)) return -1; end++; @@ -1365,11 +1365,11 @@ int url2sa(const char *url, int ulen, struct sockaddr_storage *addr, struct spli for (end = curr; end < url + ulen && *end != '/' && *end != ':'; end++); - memcpy(trash.str, curr, end - curr); - trash.str[end - curr] = '\0'; + memcpy(trash.area, curr, end - curr); + trash.area[end - curr] = '\0'; /* try to resolve an IPv4/IPv6 hostname */ - he = gethostbyname(trash.str); + he = gethostbyname(trash.area); if (!he) return -1; @@ -1557,8 +1557,8 @@ char *encode_chunk(char *start, char *stop, const char escape, const fd_set *map, const struct chunk *chunk) { - char *str = chunk->str; - char *end = chunk->str + chunk->len; + char *str = chunk->area; + char *end = chunk->area + chunk->data; if (start < stop) { stop--; /* reserve one byte for the final '\0' */ @@ -1620,8 +1620,8 @@ char *escape_chunk(char *start, char *stop, const char escape, const fd_set *map, const struct chunk *chunk) { - char *str = chunk->str; - char *end = chunk->str + chunk->len; + char *str = chunk->area; + char *end = chunk->area + chunk->data; if (start < stop) { stop--; /* reserve one byte for the final '\0' */ @@ -1672,8 +1672,8 @@ char *escape_chunk(char *start, char *stop, */ const char *csv_enc_append(const char *str, int quote, struct chunk *output) { - char *end = output->str + output->size; - char *out = output->str + output->len; + char *end = output->area + output->size; + char *out = output->area + output->data; char *ptr = out; if (quote == 1) { @@ -1703,7 +1703,7 @@ const char *csv_enc_append(const char *str, int quote, struct chunk *output) *ptr++ = '"'; *ptr = '\0'; - output->len = ptr - output->str; + output->data = ptr - output->area; return out; } @@ -3833,14 +3833,14 @@ int dump_text(struct chunk *out, const char *buf, int bsize) while (buf[ptr] && ptr < bsize) { c = buf[ptr]; if (isprint(c) && isascii(c) && c != '\\' && c != ' ' && c != '=') { - if (out->len > out->size - 1) + if (out->data > out->size - 1) break; - out->str[out->len++] = c; + out->area[out->data++] = c; } else if (c == '\t' || c == '\n' || c == '\r' || c == '\e' || c == '\\' || c == ' ' || c == '=') { - if (out->len > out->size - 2) + if (out->data > out->size - 2) break; - out->str[out->len++] = '\\'; + out->area[out->data++] = '\\'; switch (c) { case ' ': c = ' '; break; case '\t': c = 't'; break; @@ -3850,15 +3850,15 @@ int dump_text(struct chunk *out, const char *buf, int bsize) case '\\': c = '\\'; break; case '=': c = '='; break; } - out->str[out->len++] = c; + out->area[out->data++] = c; } else { - if (out->len > out->size - 4) + if (out->data > out->size - 4) break; - out->str[out->len++] = '\\'; - out->str[out->len++] = 'x'; - out->str[out->len++] = hextab[(c >> 4) & 0xF]; - out->str[out->len++] = hextab[c & 0xF]; + out->area[out->data++] = '\\'; + out->area[out->data++] = 'x'; + out->area[out->data++] = hextab[(c >> 4) & 0xF]; + out->area[out->data++] = hextab[c & 0xF]; } ptr++; } @@ -3877,10 +3877,10 @@ int dump_binary(struct chunk *out, const char *buf, int bsize) while (ptr < bsize) { c = buf[ptr]; - if (out->len > out->size - 2) + if (out->data > out->size - 2) break; - out->str[out->len++] = hextab[(c >> 4) & 0xF]; - out->str[out->len++] = hextab[c & 0xF]; + out->area[out->data++] = hextab[(c >> 4) & 0xF]; + out->area[out->data++] = hextab[c & 0xF]; ptr++; } @@ -3901,7 +3901,7 @@ int dump_text_line(struct chunk *out, const char *buf, int bsize, int len, int end; unsigned char c; - end = out->len + 80; + end = out->data + 80; if (end > out->size) return ptr; @@ -3910,13 +3910,13 @@ int dump_text_line(struct chunk *out, const char *buf, int bsize, int len, while (ptr < len && ptr < bsize) { c = buf[ptr]; if (isprint(c) && isascii(c) && c != '\\') { - if (out->len > end - 2) + if (out->data > end - 2) break; - out->str[out->len++] = c; + out->area[out->data++] = c; } else if (c == '\t' || c == '\n' || c == '\r' || c == '\e' || c == '\\') { - if (out->len > end - 3) + if (out->data > end - 3) break; - out->str[out->len++] = '\\'; + out->area[out->data++] = '\\'; switch (c) { case '\t': c = 't'; break; case '\n': c = 'n'; break; @@ -3924,24 +3924,24 @@ int dump_text_line(struct chunk *out, const char *buf, int bsize, int len, case '\e': c = 'e'; break; case '\\': c = '\\'; break; } - out->str[out->len++] = c; + out->area[out->data++] = c; } else { - if (out->len > end - 5) + if (out->data > end - 5) break; - out->str[out->len++] = '\\'; - out->str[out->len++] = 'x'; - out->str[out->len++] = hextab[(c >> 4) & 0xF]; - out->str[out->len++] = hextab[c & 0xF]; + out->area[out->data++] = '\\'; + out->area[out->data++] = 'x'; + out->area[out->data++] = hextab[(c >> 4) & 0xF]; + out->area[out->data++] = hextab[c & 0xF]; } if (buf[ptr++] == '\n') { /* we had a line break, let's return now */ - out->str[out->len++] = '\n'; + out->area[out->data++] = '\n'; *line = ptr; return ptr; } } /* we have an incomplete line, we return it as-is */ - out->str[out->len++] = '\n'; + out->area[out->data++] = '\n'; return ptr; } diff --git a/src/stats.c b/src/stats.c index 443024bc3..88d665e97 100644 --- a/src/stats.c +++ b/src/stats.c @@ -343,10 +343,10 @@ int stats_emit_json_data_field(struct chunk *out, const struct field *f) break; } - old_len = out->len; + old_len = out->data; chunk_appendf(out, ",\"value\":{\"type\":%s,\"value\":%s%s%s}", type, quote, value, quote); - return !(old_len == out->len); + return !(old_len == out->data); } /* Emits an encoding of the field type on 3 characters followed by a delimiter. @@ -433,13 +433,13 @@ int stats_emit_json_field_tags(struct chunk *out, const struct field *f) default: scope = "Unknown"; break; } - old_len = out->len; + old_len = out->data; chunk_appendf(out, "\"tags\":{" "\"origin\":\"%s\"," "\"nature\":\"%s\"," "\"scope\":\"%s\"" "}", origin, nature, scope); - return !(old_len == out->len); + return !(old_len == out->data); } /* Dump all fields from into using CSV format */ @@ -505,13 +505,13 @@ static int stats_dump_json_info_fields(struct chunk *out, goto err; started = 1; - old_len = out->len; + old_len = out->data; chunk_appendf(out, "{\"field\":{\"pos\":%d,\"name\":\"%s\"}," "\"processNum\":%u,", field, info_field_names[field], info[INF_PROCESS_NUM].u.u32); - if (old_len == out->len) + if (old_len == out->data) goto err; if (!stats_emit_json_field_tags(out, &info[field])) @@ -565,7 +565,7 @@ static int stats_dump_fields_json(struct chunk *out, const struct field *stats, default: obj_type = "Unknown"; break; } - old_len = out->len; + old_len = out->data; chunk_appendf(out, "{" "\"objType\":\"%s\"," @@ -576,7 +576,7 @@ static int stats_dump_fields_json(struct chunk *out, const struct field *stats, obj_type, stats[ST_F_IID].u.u32, stats[ST_F_SID].u.u32, field, stat_field_names[field], stats[ST_F_PID].u.u32); - if (old_len == out->len) + if (old_len == out->data) goto err; if (!stats_emit_json_field_tags(out, &stats[field])) @@ -2648,15 +2648,16 @@ static int stats_process_http_post(struct stream_interface *si) goto out; } - reql = co_getblk(si_oc(si), temp->str, s->txn->req.body_len, s->txn->req.eoh + 2); + reql = co_getblk(si_oc(si), temp->area, s->txn->req.body_len, + s->txn->req.eoh + 2); if (reql <= 0) { /* we need more data */ appctx->ctx.stats.st_code = STAT_STATUS_NONE; return 0; } - first_param = temp->str; - end_params = temp->str + reql; + first_param = temp->area; + end_params = temp->area + reql; cur_param = next_param = end_params; *end_params = '\0'; @@ -3317,7 +3318,7 @@ static int stats_dump_info_to_buffer(struct stream_interface *si) static void stats_dump_json_schema(struct chunk *out) { - int old_len = out->len; + int old_len = out->data; chunk_strcat(out, "{" @@ -3510,7 +3511,7 @@ static void stats_dump_json_schema(struct chunk *out) "}" "}"); - if (old_len == out->len) { + if (old_len == out->data) { chunk_reset(out); chunk_appendf(out, "{\"errorStr\":\"output buffer too short\"}"); diff --git a/src/stick_table.c b/src/stick_table.c index 3c4e78309..f688740af 100644 --- a/src/stick_table.c +++ b/src/stick_table.c @@ -697,12 +697,12 @@ struct stktable_key *smp_to_stkey(struct sample *smp, struct stktable *t) case SMP_T_STR: if (!smp_make_safe(smp)) return NULL; - static_table_key.key = smp->data.u.str.str; - static_table_key.key_len = smp->data.u.str.len; + static_table_key.key = smp->data.u.str.area; + static_table_key.key_len = smp->data.u.str.data; break; case SMP_T_BIN: - if (smp->data.u.str.len < t->key_size) { + if (smp->data.u.str.data < t->key_size) { /* This type needs padding with 0. */ if (!smp_make_rw(smp)) return NULL; @@ -712,12 +712,12 @@ struct stktable_key *smp_to_stkey(struct sample *smp, struct stktable *t) return NULL; if (smp->data.u.str.size < t->key_size) return NULL; - memset(smp->data.u.str.str + smp->data.u.str.len, 0, - t->key_size - smp->data.u.str.len); - smp->data.u.str.len = t->key_size; + memset(smp->data.u.str.area + smp->data.u.str.data, 0, + t->key_size - smp->data.u.str.data); + smp->data.u.str.data = t->key_size; } - static_table_key.key = smp->data.u.str.str; - static_table_key.key_len = smp->data.u.str.len; + static_table_key.key = smp->data.u.str.area; + static_table_key.key_len = smp->data.u.str.data; break; default: /* impossible case. */ diff --git a/src/stream.c b/src/stream.c index d6ba1733a..6c7bd5b93 100644 --- a/src/stream.c +++ b/src/stream.c @@ -1232,8 +1232,8 @@ static int process_switching_rules(struct stream *s, struct channel *req, int an if (!tmp) goto sw_failed; - if (build_logline(s, tmp->str, tmp->size, &rule->be.expr)) - backend = proxy_be_by_name(tmp->str); + if (build_logline(s, tmp->area, tmp->size, &rule->be.expr)) + backend = proxy_be_by_name(tmp->area); free_trash_chunk(tmp); tmp = NULL; @@ -2381,7 +2381,7 @@ struct task *process_stream(struct task *t, void *context, unsigned short state) s->uniq_id, s->be->id, objt_cs(si_f->end) ? (unsigned short)objt_cs(si_f->end)->conn->handle.fd : -1, objt_cs(si_b->end) ? (unsigned short)objt_cs(si_b->end)->conn->handle.fd : -1); - shut_your_big_mouth_gcc(write(1, trash.str, trash.len)); + shut_your_big_mouth_gcc(write(1, trash.area, trash.data)); } if (si_f->state == SI_ST_CLO && @@ -2390,7 +2390,7 @@ struct task *process_stream(struct task *t, void *context, unsigned short state) s->uniq_id, s->be->id, objt_cs(si_f->end) ? (unsigned short)objt_cs(si_f->end)->conn->handle.fd : -1, objt_cs(si_b->end) ? (unsigned short)objt_cs(si_b->end)->conn->handle.fd : -1); - shut_your_big_mouth_gcc(write(1, trash.str, trash.len)); + shut_your_big_mouth_gcc(write(1, trash.area, trash.data)); } } @@ -2477,7 +2477,7 @@ struct task *process_stream(struct task *t, void *context, unsigned short state) s->uniq_id, s->be->id, objt_cs(si_f->end) ? (unsigned short)objt_cs(si_f->end)->conn->handle.fd : -1, objt_cs(si_b->end) ? (unsigned short)objt_cs(si_b->end)->conn->handle.fd : -1); - shut_your_big_mouth_gcc(write(1, trash.str, trash.len)); + shut_your_big_mouth_gcc(write(1, trash.area, trash.data)); } s->logs.t_close = tv_ms_elapsed(&s->logs.tv_accept, &now); diff --git a/src/stream_interface.c b/src/stream_interface.c index 8190108bf..245f68037 100644 --- a/src/stream_interface.c +++ b/src/stream_interface.c @@ -143,8 +143,8 @@ void stream_int_retnclose(struct stream_interface *si, const struct chunk *msg) channel_erase(ic); channel_truncate(oc); - if (likely(msg && msg->len)) - co_inject(oc, msg->str, msg->len); + if (likely(msg && msg->data)) + co_inject(oc, msg->area, msg->data); oc->wex = tick_add_ifset(now_ms, oc->wto); channel_auto_read(oc); @@ -354,7 +354,9 @@ int conn_si_send_proxy(struct connection *conn, unsigned int flag) if (conn->mux == &mux_pt_ops && cs->data_cb == &si_conn_cb) { struct stream_interface *si = cs->data; struct conn_stream *remote_cs = objt_cs(si_opposite(si)->end); - ret = make_proxy_line(trash.str, trash.size, objt_server(conn->target), remote_cs ? remote_cs->conn : NULL); + ret = make_proxy_line(trash.area, trash.size, + objt_server(conn->target), + remote_cs ? remote_cs->conn : NULL); } else { /* The target server expects a LOCAL line to be sent first. Retrieving @@ -368,7 +370,8 @@ int conn_si_send_proxy(struct connection *conn, unsigned int flag) if (!(conn->flags & CO_FL_ADDR_TO_SET)) goto out_wait; - ret = make_proxy_line(trash.str, trash.size, objt_server(conn->target), conn); + ret = make_proxy_line(trash.area, trash.size, + objt_server(conn->target), conn); } if (!ret) @@ -380,7 +383,9 @@ int conn_si_send_proxy(struct connection *conn, unsigned int flag) /* we have to send trash from (ret+sp for -sp bytes). If the * data layer has a pending write, we'll also set MSG_MORE. */ - ret = conn_sock_send(conn, trash.str + ret + conn->send_proxy_ofs, -conn->send_proxy_ofs, + ret = conn_sock_send(conn, + trash.area + ret + conn->send_proxy_ofs, + -conn->send_proxy_ofs, (conn->flags & CO_FL_XPRT_WR_ENA) ? MSG_MORE : 0); if (ret < 0) diff --git a/src/tcp_rules.c b/src/tcp_rules.c index e21c5b717..1b48dedb9 100644 --- a/src/tcp_rules.c +++ b/src/tcp_rules.c @@ -219,11 +219,12 @@ resume_execution: if (cap[h->index] == NULL) /* no more capture memory */ continue; - len = key->data.u.str.len; + len = key->data.u.str.data; if (len > h->len) len = h->len; - memcpy(cap[h->index], key->data.u.str.str, len); + memcpy(cap[h->index], key->data.u.str.area, + len); cap[h->index][len] = 0; } else { @@ -600,7 +601,8 @@ static int tcp_parse_response_rule(char **args, int arg, int section_type, action_build_list(&tcp_res_cont_keywords, &trash); memprintf(err, "'%s %s' expects 'accept', 'close', 'reject', %s in %s '%s' (got '%s')", - args[0], args[1], trash.str, proxy_type_str(curpx), curpx->id, args[arg]); + args[0], args[1], trash.area, + proxy_type_str(curpx), curpx->id, args[arg]); return -1; } } @@ -849,7 +851,8 @@ static int tcp_parse_request_rule(char **args, int arg, int section_type, memprintf(err, "'%s %s' expects 'accept', 'reject', 'track-sc0' ... 'track-sc%d', %s " "in %s '%s' (got '%s').\n", - args[0], args[1], MAX_SESS_STKCTR-1, trash.str, proxy_type_str(curpx), + args[0], args[1], MAX_SESS_STKCTR-1, + trash.area, proxy_type_str(curpx), curpx->id, args[arg]); return -1; } diff --git a/src/vars.c b/src/vars.c index 566ead6ec..5787cf6ed 100644 --- a/src/vars.c +++ b/src/vars.c @@ -95,12 +95,12 @@ unsigned int var_clear(struct var *var) unsigned int size = 0; if (var->data.type == SMP_T_STR || var->data.type == SMP_T_BIN) { - free(var->data.u.str.str); - size += var->data.u.str.len; + free(var->data.u.str.area); + size += var->data.u.str.data; } else if (var->data.type == SMP_T_METH && var->data.u.meth.meth == HTTP_METH_OTHER) { - free(var->data.u.meth.str.str); - size += var->data.u.meth.str.len; + free(var->data.u.meth.str.area); + size += var->data.u.meth.str.data; } LIST_DEL(&var->l); pool_free(var_pool, var); @@ -343,12 +343,14 @@ static int sample_store(struct vars *vars, const char *name, struct sample *smp) /* free its used memory. */ if (var->data.type == SMP_T_STR || var->data.type == SMP_T_BIN) { - free(var->data.u.str.str); - var_accounting_diff(vars, smp->sess, smp->strm, -var->data.u.str.len); + free(var->data.u.str.area); + var_accounting_diff(vars, smp->sess, smp->strm, + -var->data.u.str.data); } else if (var->data.type == SMP_T_METH && var->data.u.meth.meth == HTTP_METH_OTHER) { - free(var->data.u.meth.str.str); - var_accounting_diff(vars, smp->sess, smp->strm, -var->data.u.meth.str.len); + free(var->data.u.meth.str.area); + var_accounting_diff(vars, smp->sess, smp->strm, + -var->data.u.meth.str.data); } } else { @@ -381,37 +383,41 @@ static int sample_store(struct vars *vars, const char *name, struct sample *smp) break; case SMP_T_STR: case SMP_T_BIN: - if (!var_accounting_add(vars, smp->sess, smp->strm, smp->data.u.str.len)) { + if (!var_accounting_add(vars, smp->sess, smp->strm, smp->data.u.str.data)) { var->data.type = SMP_T_BOOL; /* This type doesn't use additional memory. */ return 0; } - var->data.u.str.str = malloc(smp->data.u.str.len); - if (!var->data.u.str.str) { - var_accounting_diff(vars, smp->sess, smp->strm, -smp->data.u.str.len); + var->data.u.str.area = malloc(smp->data.u.str.data); + if (!var->data.u.str.area) { + var_accounting_diff(vars, smp->sess, smp->strm, + -smp->data.u.str.data); var->data.type = SMP_T_BOOL; /* This type doesn't use additional memory. */ return 0; } - var->data.u.str.len = smp->data.u.str.len; - memcpy(var->data.u.str.str, smp->data.u.str.str, var->data.u.str.len); + var->data.u.str.data = smp->data.u.str.data; + memcpy(var->data.u.str.area, smp->data.u.str.area, + var->data.u.str.data); break; case SMP_T_METH: var->data.u.meth.meth = smp->data.u.meth.meth; if (smp->data.u.meth.meth != HTTP_METH_OTHER) break; - if (!var_accounting_add(vars, smp->sess, smp->strm, smp->data.u.meth.str.len)) { + if (!var_accounting_add(vars, smp->sess, smp->strm, smp->data.u.meth.str.data)) { var->data.type = SMP_T_BOOL; /* This type doesn't use additional memory. */ return 0; } - var->data.u.meth.str.str = malloc(smp->data.u.meth.str.len); - if (!var->data.u.meth.str.str) { - var_accounting_diff(vars, smp->sess, smp->strm, -smp->data.u.meth.str.len); + var->data.u.meth.str.area = malloc(smp->data.u.meth.str.data); + if (!var->data.u.meth.str.area) { + var_accounting_diff(vars, smp->sess, smp->strm, + -smp->data.u.meth.str.data); var->data.type = SMP_T_BOOL; /* This type doesn't use additional memory. */ return 0; } - var->data.u.meth.str.len = smp->data.u.meth.str.len; - var->data.u.meth.str.size = smp->data.u.meth.str.len; - memcpy(var->data.u.meth.str.str, smp->data.u.meth.str.str, var->data.u.meth.str.len); + var->data.u.meth.str.data = smp->data.u.meth.str.data; + var->data.u.meth.str.size = smp->data.u.meth.str.data; + memcpy(var->data.u.meth.str.area, smp->data.u.meth.str.area, + var->data.u.meth.str.data); break; } return 1; @@ -497,7 +503,9 @@ int vars_check_arg(struct arg *arg, char **err) } /* Register new variable name. */ - name = register_name(arg->data.str.str, arg->data.str.len, &scope, 1, err); + name = register_name(arg->data.str.area, arg->data.str.data, &scope, + 1, + err); if (!name) return 0; diff --git a/src/wurfl.c b/src/wurfl.c index 591fbdba3..9d2dfa644 100644 --- a/src/wurfl.c +++ b/src/wurfl.c @@ -576,8 +576,8 @@ static int ha_wurfl_get_all(const struct arg *args, struct sample *smp, const ch } wurfl_device_destroy(dHandle); - smp->data.u.str.str = temp->str; - smp->data.u.str.len = temp->len; + smp->data.u.str.area = temp->area; + smp->data.u.str.data = temp->data; return 1; } @@ -602,9 +602,9 @@ static int ha_wurfl_get(const struct arg *args, struct sample *smp, const char * temp = get_trash_chunk(); chunk_reset(temp); - while (args[i].data.str.str) { + while (args[i].data.str.area) { chunk_appendf(temp, "%c", global_wurfl.information_list_separator); - node = ebst_lookup(&global_wurfl.btree, args[i].data.str.str); + node = ebst_lookup(&global_wurfl.btree, args[i].data.str.area); wn = container_of(node, wurfl_data_t, nd); if (wn) { @@ -644,15 +644,16 @@ static int ha_wurfl_get(const struct arg *args, struct sample *smp, const char * } } else { - ha_wurfl_log("WURFL: %s not in wurfl-information-list \n", args[i].data.str.str); + ha_wurfl_log("WURFL: %s not in wurfl-information-list \n", + args[i].data.str.area); } i++; } wurfl_device_destroy(dHandle); - smp->data.u.str.str = temp->str; - smp->data.u.str.len = temp->len; + smp->data.u.str.area = temp->area; + smp->data.u.str.data = temp->data; return 1; }