slweb

Једноставни генератор статичких веб страна
git clone https://git.sr.ht/~strahinja/slweb
Дневник | Датотеке | Референце | ПРОЧИТАЈМЕ | ЛИЦЕНЦА

чување 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:
Mslweb.c | 26++++++++++++++++++--------
Atest/overflow_line.sh | 2++
измењених датотека: 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