--- lbbs/src/article_cache.c 2025/06/01 14:04:19 1.8 +++ lbbs/src/article_cache.c 2025/06/02 10:33:25 1.10 @@ -118,9 +118,23 @@ int article_cache_generate(const char *c cache.data_len = header_len + strlen(content); header_line_cnt = split_data_lines(header, SCREEN_COLS, cache.line_offsets, MAX_SPLIT_FILE_LINES); + + if (header_len != cache.line_offsets[header_line_cnt]) + { + log_std("Header of article(aid=%d) is truncated from %ld to %ld\n", p_article->aid, header_len, cache.line_offsets[header_line_cnt]); + header_len = (size_t)cache.line_offsets[header_line_cnt]; + } + cache.line_total = header_line_cnt + split_data_lines(content, SCREEN_COLS, cache.line_offsets + header_line_cnt, MAX_SPLIT_FILE_LINES - header_line_cnt); + if (cache.data_len - header_len != (size_t)cache.line_offsets[cache.line_total]) + { + log_std("Body of article(aid=%d) is truncated from %ld to %ld\n", + p_article->aid, cache.data_len - header_len, cache.line_offsets[cache.line_total]); + cache.data_len = header_len + (size_t)(cache.line_offsets[cache.line_total]); + } + for (i = header_line_cnt; i <= cache.line_total; i++) { cache.line_offsets[i] += (long)header_len; @@ -128,6 +142,13 @@ int article_cache_generate(const char *c footer_line_cnt = split_data_lines(footer, SCREEN_COLS, cache.line_offsets + cache.line_total, MAX_SPLIT_FILE_LINES - cache.line_total); + if (footer_len != cache.line_offsets[cache.line_total + footer_line_cnt]) + { + log_std("Footer of article(aid=%d) is truncated from %ld to %ld\n", + p_article->aid, footer_len, cache.line_offsets[cache.line_total + footer_line_cnt]); + footer_len = (size_t)(cache.line_offsets[cache.line_total + footer_line_cnt]); + } + for (i = 0; i <= footer_line_cnt; i++) { cache.line_offsets[cache.line_total + i] += (long)cache.data_len; @@ -224,6 +245,7 @@ int article_cache_load(ARTICLE_CACHE *p_ return -3; } + bzero(p_cache, sizeof(*p_cache)); memcpy((void *)p_cache, p_mmap, (size_t)(((ARTICLE_CACHE *)p_mmap)->mmap_len - ((ARTICLE_CACHE *)p_mmap)->data_len)); p_cache->p_mmap = p_mmap;