чување 5ac575d5232fb7cad24e1eb21c8ff0a243c65e68
родитељ 0bdca2057a8c6f9348638ea767540d3370026005
Аутор: Страхиња Радић <contact@strahinja.org>
Датум: Fri, 6 Oct 2023 06:48:00 +0200
Bugfix: Handle lines >BUFSIZE, realloc line if needed; declare functions
Signed-off-by: Страхиња Радић <contact@strahinja.org>
Diffstat:
измењених датотека: 2, додавања: 20(+), брисања: 8(-)
diff --git a/slweb.c b/slweb.c
@@ -90,15 +90,19 @@ static int incdir_only_summary = 0;
ptoken = token; \
} while (0)
+int slweb_cleanup(void);
+int usage(void);
+int version(void);
+
int
-version()
+version(void)
{
printf("%s %s, committed on %s\n", PROGRAMNAME, VERSION, DATE);
return 0;
}
int
-usage()
+usage(void)
{
printf("Usage: %s [-b|--body-only] [-d|--basedir <dir>]"
" [-p|--global-link-prefix <URL>] [-h|--help]"
@@ -149,7 +153,7 @@ free_keyvalue(KeyValue** list, const size_t list_count)
}
int
-slweb_cleanup()
+slweb_cleanup(void)
{
free(basedir);
free(input_dirname);
@@ -2901,6 +2905,7 @@ slweb_parse(FILE* output, const char* source_filename, const u8* buffer,
u8* line = NULL;
u8* pline = NULL;
size_t line_len = 0;
+ size_t line_size = 0;
u8* token = NULL;
u8* ptoken = NULL;
size_t token_size = 0;
@@ -2925,6 +2930,7 @@ slweb_parse(FILE* output, const char* source_filename, const u8* buffer,
int footnote_at_line_start = 0;
size_t pline_len = 0;
int madeby_present = 0;
+ u8* eol = NULL;
if (!buffer)
exit(error(1, (u8*)"Empty buffer"));
@@ -2959,7 +2965,8 @@ slweb_parse(FILE* output, const char* source_filename, const u8* buffer,
incdir_only_summary
= var_incdir_only_summary && *var_incdir_only_summary == '1';
- CALLOC(line, u8, BUFSIZE);
+ line_size = BUFSIZE;
+ CALLOC(line, u8, line_size);
token_size = BUFSIZE;
CALLOC(token, u8, BUFSIZE);
CALLOC(link_macro, u8, BUFSIZE);
@@ -2987,15 +2994,18 @@ slweb_parse(FILE* output, const char* source_filename, const u8* buffer,
RESET_TOKEN(token, ptoken, token_size);
-do_buffer:;
- u8* eol = (u8*)strchr((char*)pbuffer, '\n');
+do_buffer:
+ eol = (u8*)strchr((char*)pbuffer, '\n');
if (!eol)
goto done_buffer;
pline = line;
while (pbuffer != eol)
- *pline++ = *pbuffer++;
- pbuffer++;
+ CHECKCOPY(line, pline, line_size, pbuffer);
+
+ if (pbuffer == eol)
+ pbuffer++;
+
*pline = 0;
pline = line;
line_len = strlen((char*)line);
diff --git a/test/overflow_line.sh b/test/overflow_line.sh
@@ -0,0 +1,2 @@
+#!/bin/sh
+{ for j in $(seq 300); do for i in $(seq 0 9); do printf "%d" "$i"; done; done; printf "\n"; } | slweb