From 42eb413c91d8130ffb78dcee6dcda2412486dc2f Mon Sep 17 00:00:00 2001 From: Dan Cross Date: Sat, 13 Oct 2018 14:28:56 +0000 Subject: [PATCH] More changing formatting to use stralloc. Specifically, change the www_last10 HTML rendering logic to use stralloc and strftime(). This eliminates a lot of duplication. It would be easier to test this with a unit test if the logic of reading the last10 entries from a file were separated from the HTML rendering logic. An area for future enhancement. Also start in on www_email.c, which is the last bastion of significant realloc() use for page generation. An explicit goal is to get rid of unsafe string handling functions such as strcpy, strcat, sprintf, etc. Signed-off-by: Dan Cross --- src/www_email.c | 76 ++++++-------------------------------- src/www_last10.c | 95 ++++++++++++++++-------------------------------- 2 files changed, 44 insertions(+), 127 deletions(-) diff --git a/src/www_email.c b/src/www_email.c index 05b436b..20c3ae5 100644 --- a/src/www_email.c +++ b/src/www_email.c @@ -141,72 +141,20 @@ int www_send_email(struct user_record *user, char *recipient, char *subject, cha } char *www_new_email() { - char *page; - int max_len; - int len; - char buffer[4096]; + stralloc page = EMPTY_STRALLOC; - page = (char *)malloz(4096); - max_len = 4096; - len = 0; + stralloc_copys(&page, "

New Email

\n"); + stralloc_cats(&page, "
\n"); + stralloc_cats(&page, "To :
\n"); + stralloc_cats(&page, "Subject :
\n"); + stralloc_cats(&page, "\n
"); + stralloc_cats(&page, "\n
"); + stralloc_cats(&page, "
\n"); + stralloc_0(&page); - sprintf(buffer, "

New Email

\n"); - if (len + strlen(buffer) > max_len - 1) { - max_len += 4096; - page = (char *)realloc(page, max_len); - } - strcat(page, buffer); - len += strlen(buffer); - - sprintf(buffer, "
\n", conf.www_url); - if (len + strlen(buffer) > max_len - 1) { - max_len += 4096; - page = (char *)realloc(page, max_len); - } - strcat(page, buffer); - len += strlen(buffer); - - sprintf(buffer, "To :
\n"); - if (len + strlen(buffer) > max_len - 1) { - max_len += 4096; - page = (char *)realloc(page, max_len); - } - strcat(page, buffer); - len += strlen(buffer); - - sprintf(buffer, "Subject :
\n"); - if (len + strlen(buffer) > max_len - 1) { - max_len += 4096; - page = (char *)realloc(page, max_len); - } - strcat(page, buffer); - len += strlen(buffer); - - sprintf(buffer, "\n
"); - if (len + strlen(buffer) > max_len - 1) { - max_len += 4096; - page = (char *)realloc(page, max_len); - } - strcat(page, buffer); - len += strlen(buffer); - - sprintf(buffer, "\n
"); - if (len + strlen(buffer) > max_len - 1) { - max_len += 4096; - page = (char *)realloc(page, max_len); - } - strcat(page, buffer); - len += strlen(buffer); - - sprintf(buffer, "
\n"); - if (len + strlen(buffer) > max_len - 1) { - max_len += 4096; - page = (char *)realloc(page, max_len); - } - strcat(page, buffer); - len += strlen(buffer); - - return page; + return page.s; } char *www_email_display(struct user_record *user, int email) { diff --git a/src/www_last10.c b/src/www_last10.c index 8476d24..af202d5 100644 --- a/src/www_last10.c +++ b/src/www_last10.c @@ -1,88 +1,57 @@ #if defined(ENABLE_WWW) -#include #include #include +#include + #include "bbs.h" extern struct bbs_config conf; char *www_last10() { - char *page; - int max_len; - int len; - char buffer[4096]; + size_t n = 0; + stralloc page = EMPTY_STRALLOC; struct last10_callers callers[10]; - int i, z; - struct tm l10_time; FILE *fptr = fopen("last10v2.dat", "rb"); - if (fptr != NULL) { - - for (i = 0; i < 10; i++) { - if (fread(&callers[i], sizeof(struct last10_callers), 1, fptr) < 1) { + for ( ; n < 10; ++n) + if (fread(&callers[n], sizeof(callers[n]), 1, fptr) != sizeof(callers[n])) break; - } - } - fclose(fptr); - } else { - i = 0; } - page = (char *)malloz(4096); - max_len = 4096; - len = 0; + stralloc_copys(&page, "

Last 10 Callers

\n"); + stralloc_cats(&page, "
\n"); + for (size_t i = 0; i < n; ++i) { + struct tm called; + char buffer[32]; - sprintf(buffer, "

Last 10 Callers

\n"); - if (len + strlen(buffer) > max_len - 1) { - max_len += 4096; - page = (char *)realloc(page, max_len); - } - strcat(page, buffer); - len += strlen(buffer); + stralloc_cats(&page, "
"); + stralloc_cats(&page, callers[i].name); + stralloc_cats(&page, "
"); + stralloc_cats(&page, callers[i].location); + stralloc_cats(&page, "
"); + stralloc_cats(&page, "
"); - sprintf(buffer, "
\n"); - if (len + strlen(buffer) > max_len - 1) { - max_len += 4096; - page = (char *)realloc(page, max_len); - } - strcat(page, buffer); - len += strlen(buffer); - - for (z = 0; z < i; z++) { - localtime_r(&callers[z].time, &l10_time); - if (conf.date_style == 1) { - if (callers[z].calls == 1) { - sprintf(buffer, "
%s
%s
%.2d:%.2d %.2d-%.2d-%.2d
\n", callers[z].name, callers[z].location, l10_time.tm_hour, l10_time.tm_min, l10_time.tm_mon + 1, l10_time.tm_mday, l10_time.tm_year - 100, conf.www_url); - } else { - sprintf(buffer, "
%s
%s
%.2d:%.2d %.2d-%.2d-%.2d
\n", callers[z].name, callers[z].location, l10_time.tm_hour, l10_time.tm_min, l10_time.tm_mon + 1, l10_time.tm_mday, l10_time.tm_year - 100); - } - } else { - if (callers[z].calls == 1) { - sprintf(buffer, "
%s
%s
%.2d:%.2d %.2d-%.2d-%.2d
\n", callers[z].name, callers[z].location, l10_time.tm_hour, l10_time.tm_min, l10_time.tm_mday, l10_time.tm_mon + 1, l10_time.tm_year - 100, conf.www_url); - } else { - sprintf(buffer, "
%s
%s
%.2d:%.2d %.2d-%.2d-%.2d
\n", callers[z].name, callers[z].location, l10_time.tm_hour, l10_time.tm_min, l10_time.tm_mday, l10_time.tm_mon + 1, l10_time.tm_year - 100); - } + localtime_r(&callers[i].time, &called); + if (conf.date_style == 1) + strftime(buffer, sizeof buffer, "%H:%M %m-%d-%y", &called); + else + strftime(buffer, sizeof buffer, "%H:%M %d-%m-%y", &called); + stralloc_cats(&page, buffer); + stralloc_cats(&page, "
\n"); + if (callers[i].calls == 1) { + stralloc_cats(&page, "
"); } - if (len + strlen(buffer) > max_len - 1) { - max_len += 4096; - page = (char *)realloc(page, max_len); - } - strcat(page, buffer); - len += strlen(buffer); + stralloc_cats(&page, "
\n"); } + stralloc_cats(&page, "
\n"); + stralloc_0(&page); - sprintf(buffer, "
\n"); - if (len + strlen(buffer) > max_len - 1) { - max_len += 4096; - page = (char *)realloc(page, max_len); - } - strcat(page, buffer); - len += strlen(buffer); - - return page; + return page.s; } #endif