Skip to content

Commit f50a02e

Browse files
tchronocosmo0920
andauthored
config: allow up to 32MB length of line buffer in read_config (#7691)
--------- Signed-off-by: Thiago Padilha <[email protected]> Signed-off-by: Hiroshi Hatake <[email protected]> Co-authored-by: Hiroshi Hatake <[email protected]>
1 parent 00f94c8 commit f50a02e

File tree

4 files changed

+93
-12
lines changed

4 files changed

+93
-12
lines changed

include/fluent-bit/flb_config_format.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,6 @@
2929
#include "config_format/flb_cf_yaml.h"
3030
#endif
3131

32-
#endif
32+
#define FLB_DEFAULT_CF_BUF_SIZE 4096
33+
34+
#endif

src/config_format/flb_cf_fluentbit.c

Lines changed: 30 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@
4040
#define PATH_MAX MAX_PATH
4141
#endif
4242

43-
#define FLB_CF_BUF_SIZE 4096
4443
#define FLB_CF_FILE_NUM_LIMIT 1000
4544

4645
/* indent checker return codes */
@@ -418,6 +417,8 @@ static int read_config(struct flb_cf *cf, struct local_ctx *ctx,
418417
char *val = NULL;
419418
int val_len;
420419
char *buf;
420+
char *fgets_ptr;
421+
size_t bufsize = FLB_DEFAULT_CF_BUF_SIZE;
421422
char tmp[PATH_MAX];
422423
flb_sds_t section = NULL;
423424
flb_sds_t indent = NULL;
@@ -427,6 +428,9 @@ static int read_config(struct flb_cf *cf, struct local_ctx *ctx,
427428
struct flb_cf_section *current_section = NULL;
428429
struct flb_cf_group *current_group = NULL;
429430
struct cfl_variant *var;
431+
unsigned long line_hard_limit;
432+
433+
line_hard_limit = 32 * 1024 * 1024; /* 32MiB */
430434

431435
FILE *f = NULL;
432436

@@ -479,14 +483,14 @@ static int read_config(struct flb_cf *cf, struct local_ctx *ctx,
479483

480484
#ifndef FLB_HAVE_STATIC_CONF
481485
/* Open configuration file */
482-
if ((f = fopen(cfg_file, "r")) == NULL) {
486+
if ((f = fopen(cfg_file, "rb")) == NULL) {
483487
flb_warn("[config] I cannot open %s file", cfg_file);
484488
return -1;
485489
}
486490
#endif
487491

488492
/* Allocate temporal buffer to read file content */
489-
buf = flb_malloc(FLB_CF_BUF_SIZE);
493+
buf = flb_malloc(bufsize);
490494
if (!buf) {
491495
flb_errno();
492496
goto error;
@@ -501,26 +505,41 @@ static int read_config(struct flb_cf *cf, struct local_ctx *ctx,
501505
while (static_fgets(buf, FLB_CF_BUF_SIZE, in_data, &off)) {
502506
#else
503507
/* normal mode, read lines into a buffer */
504-
while (fgets(buf, FLB_CF_BUF_SIZE, f)) {
508+
/* note that we use "fgets_ptr" so we can continue reading after realloc */
509+
fgets_ptr = buf;
510+
while (fgets(fgets_ptr, bufsize - (fgets_ptr - buf), f)) {
505511
#endif
506512
len = strlen(buf);
507513
if (len > 0 && buf[len - 1] == '\n') {
508514
buf[--len] = 0;
509515
if (len && buf[len - 1] == '\r') {
510516
buf[--len] = 0;
511517
}
518+
/* after a successful line read, restore "fgets_ptr" to point to the
519+
* beginning of buffer */
520+
fgets_ptr = buf;
521+
} else if (feof(f)) {
522+
/* handle EOF without a newline(CRLF or LF) */
523+
fgets_ptr = buf;
512524
}
513525
#ifndef FLB_HAVE_STATIC_CONF
514526
else {
515-
/*
516-
* If we don't find a break line, validate if we got an EOF or not. No EOF
517-
* means that the incoming string is not finished so we must raise an
518-
* exception.
519-
*/
520-
if (!feof(f)) {
521-
config_error(cfg_file, line, "length of content has exceeded limit");
527+
/* resize the line buffer */
528+
bufsize *= 2;
529+
if (bufsize > line_hard_limit) {
530+
flb_error("reading line is exceeded to the limit size of %lu. Current size is: %zu",
531+
line_hard_limit, bufsize);
522532
goto error;
523533
}
534+
buf = flb_realloc(buf, bufsize);
535+
if (!buf) {
536+
flb_error("failed to resize line buffer to %zu", bufsize);
537+
flb_errno();
538+
goto error;
539+
}
540+
/* read more, starting at the buf + len position */
541+
fgets_ptr = buf + len;
542+
continue;
524543
}
525544
#endif
526545

tests/internal/config_format_fluentbit.c

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#define FLB_002 FLB_TESTS_DATA_PATH "/data/config_format/classic/indent_level_error.conf"
1818
#define FLB_003 FLB_TESTS_DATA_PATH "/data/config_format/classic/recursion.conf"
1919
#define FLB_004 FLB_TESTS_DATA_PATH "/data/config_format/classic/issue6281.conf"
20+
#define FLB_005 FLB_TESTS_DATA_PATH "/data/config_format/classic/nolimitline.conf"
2021

2122
#define ERROR_LOG "fluentbit_conf_error.log"
2223

@@ -258,11 +259,59 @@ void not_current_dir_files()
258259
}
259260
}
260261

262+
/* data/config_format/nolimitline.conf */
263+
void test_nolimit_line()
264+
{
265+
struct mk_list *head;
266+
struct flb_cf *cf;
267+
struct flb_cf_section *s;
268+
struct cfl_list *p_head;
269+
struct cfl_kvpair *kv;
270+
271+
cf = flb_cf_fluentbit_create(NULL, FLB_005, NULL, 0);
272+
TEST_CHECK(cf != NULL);
273+
274+
/* Total number of sections */
275+
TEST_CHECK(mk_list_size(&cf->sections) == 3);
276+
277+
/* SERVICE check */
278+
TEST_CHECK(cf->service == NULL);
279+
280+
/* Meta commands */
281+
TEST_CHECK(mk_list_size(&cf->metas) == 0);
282+
283+
/* Check number sections per list */
284+
TEST_CHECK(mk_list_size(&cf->inputs) == 1);
285+
TEST_CHECK(mk_list_size(&cf->filters) == 1);
286+
TEST_CHECK(mk_list_size(&cf->outputs) == 1);
287+
288+
/* Check the previous line buffer limit */
289+
s = flb_cf_section_get_by_name(cf, "filter");
290+
TEST_CHECK(s != NULL);
291+
TEST_CHECK(mk_list_size(&s->groups) == 0);
292+
293+
if (cfl_list_size(&s->properties->list) > 0) {
294+
TEST_CHECK(cfl_list_size(&s->properties->list) == 4);
295+
cfl_list_foreach(p_head, &s->properties->list) {
296+
kv = cfl_list_entry(p_head, struct cfl_kvpair, _head);
297+
if (strcmp(kv->key, "code") == 0) {
298+
TEST_CHECK(cfl_sds_len(kv->val->data.as_string) > FLB_DEFAULT_CF_BUF_SIZE);
299+
}
300+
}
301+
}
302+
303+
printf("\n");
304+
flb_cf_dump(cf);
305+
306+
flb_cf_destroy(cf);
307+
}
308+
261309
TEST_LIST = {
262310
{ "basic" , test_basic},
263311
{ "missing_value_issue5880" , missing_value},
264312
{ "indent_level_error" , indent_level_error},
265313
{ "recursion" , recursion},
266314
{ "not_current_dir_files", not_current_dir_files},
315+
{ "no_limit_line", test_nolimit_line},
267316
{ 0 }
268317
};
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
[INPUT]
2+
name dummy
3+
4+
[FILTER]
5+
Name lua
6+
Match *
7+
code local str = 'abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcd'; function cb_filter(tag, ts, record) record.str = str; return 1, ts, record end
8+
call cb_filter
9+
10+
[OUTPUT]
11+
name stdout

0 commit comments

Comments
 (0)