diff --git a/doc/ChangeLog b/doc/ChangeLog index 78165279..bd11b986 100755 --- a/doc/ChangeLog +++ b/doc/ChangeLog @@ -1,3 +1,8 @@ +Version 2.3.6, released April xxx, 2003 +======================================= + +- Eliminated WEB_BUFFER_SIZE, made memory allocation dynamically + Version 2.3.5, released April 9th, 2003 ======================================= diff --git a/src/elogd.c b/src/elogd.c index 8509f929..6edb682f 100755 --- a/src/elogd.c +++ b/src/elogd.c @@ -6,6 +6,9 @@ Contents: Web server program for Electronic Logbook ELOG $Log$ + Revision 1.82 2003/04/11 07:25:52 midas + Eliminated WEB_BUFFER_SIZE and made memory allocation dynamically + Revision 1.81 2003/04/09 14:02:18 midas Better error message on email send failure @@ -863,9 +866,8 @@ typedef int INT; #define EL_NEXT 3 #define EL_PREV 4 -#define WEB_BUFFER_SIZE 2000000 - -char return_buffer[WEB_BUFFER_SIZE]; +char *return_buffer; +int return_buffer_size; int strlen_retbuf; int keep_alive; char header_buffer[1000]; @@ -3564,11 +3566,14 @@ char buf[256]; void rsputs(const char *str) { - if (strlen_retbuf + strlen(str) > sizeof(return_buffer)) - strcpy(return_buffer, "

Error: return buffer too small

"); - else - strcpy(return_buffer+strlen_retbuf, str); + if (strlen_retbuf + (int)strlen(str) > return_buffer_size) + { + return_buffer = realloc(return_buffer, return_buffer_size + 100000); + memset(return_buffer + return_buffer_size, 0, 100000); + return_buffer_size += 100000; + } + strcpy(return_buffer+strlen_retbuf, str); strlen_retbuf += strlen(str); } @@ -3581,68 +3586,70 @@ void rsputs2(const char *str) int i, j, k, l; char *p, link[256]; - if (strlen_retbuf + strlen(str) > sizeof(return_buffer)) - strcpy(return_buffer, "

Error: return buffer too small

"); - else + if (strlen_retbuf + (int)strlen(str) > return_buffer_size) { - j = strlen_retbuf; - for (i=0 ; i<(int)strlen(str) ; i++) + return_buffer = realloc(return_buffer, return_buffer_size + 100000); + memset(return_buffer + return_buffer_size, 0, 100000); + return_buffer_size += 100000; + } + + j = strlen_retbuf; + for (i=0 ; i<(int)strlen(str) ; i++) + { + for (l=0 ; list[l][0] ; l++) { - for (l=0 ; list[l][0] ; l++) + if (strncmp(str+i, list[l], strlen(list[l])) == 0) { - if (strncmp(str+i, list[l], strlen(list[l])) == 0) - { - p = (char *) (str+i+strlen(list[l])); - i += strlen(list[l]); - for (k=0 ; *p && strcspn(p, "> ,\t\n\r({[)}]") ; k++,i++) - link[k] = *p++; - link[k] = 0; - i--; + p = (char *) (str+i+strlen(list[l])); + i += strlen(list[l]); + for (k=0 ; *p && strcspn(p, "> ,\t\n\r({[)}]") ; k++,i++) + link[k] = *p++; + link[k] = 0; + i--; - if (strcmp(list[l], "elog:") == 0) - { - /* if link contains '/' (reference to other logbook), add ".." in front */ - if (strchr(link, '/')) - sprintf(return_buffer+j, "elog:%s", link, link); - else - sprintf(return_buffer+j, "elog:%s", link, link); - } + if (strcmp(list[l], "elog:") == 0) + { + /* if link contains '/' (reference to other logbook), add ".." in front */ + if (strchr(link, '/')) + sprintf(return_buffer+j, "elog:%s", link, link); else - sprintf(return_buffer+j, "%s%s", list[l], link, list[l], link); - - j += strlen(return_buffer+j); - break; - } - } - - if (!list[l][0]) - { - if (strncmp(str+i, "
", 4) == 0) - { - strcpy(return_buffer+j, "
"); - j+=4; - i+=3; + sprintf(return_buffer+j, "elog:%s", link, link); } else - switch (str[i]) - { - case '<': strcat(return_buffer, "<"); j+=4; break; - case '>': strcat(return_buffer, ">"); j+=4; break; + sprintf(return_buffer+j, "%s%s", list[l], link, list[l], link); - /* the translation for the search highliting */ - case '\001' : strcat(return_buffer, "<"); j++; break; - case '\002' : strcat(return_buffer, ">"); j++; break; - case '\003' : strcat(return_buffer, "\""); j++; break; - case '\004' : strcat(return_buffer, " "); j++; break; - - default: return_buffer[j++] = str[i]; - } + j += strlen(return_buffer+j); + break; } } - return_buffer[j] = 0; - strlen_retbuf = j; + if (!list[l][0]) + { + if (strncmp(str+i, "
", 4) == 0) + { + strcpy(return_buffer+j, "
"); + j+=4; + i+=3; + } + else + switch (str[i]) + { + case '<': strcat(return_buffer, "<"); j+=4; break; + case '>': strcat(return_buffer, ">"); j+=4; break; + + /* the translation for the search highliting */ + case '\001' : strcat(return_buffer, "<"); j++; break; + case '\002' : strcat(return_buffer, ">"); j++; break; + case '\003' : strcat(return_buffer, "\""); j++; break; + case '\004' : strcat(return_buffer, " "); j++; break; + + default: return_buffer[j++] = str[i]; + } + } } + + return_buffer[j] = 0; + strlen_retbuf = j; } /*------------------------------------------------------------------*/ @@ -3656,10 +3663,14 @@ char str[10000]; vsprintf(str, (char *) format, argptr); va_end(argptr); - if (strlen_retbuf + strlen(str) > sizeof(return_buffer)) - strcpy(return_buffer, "

Error: return buffer too small

"); - else - strcpy(return_buffer+strlen_retbuf, str); + if (strlen_retbuf + (int)strlen(str) > return_buffer_size) + { + return_buffer = realloc(return_buffer, return_buffer_size + 100000); + memset(return_buffer + return_buffer_size, 0, 100000); + return_buffer_size += 100000; + } + + strcpy(return_buffer+strlen_retbuf, str); strlen_retbuf += strlen(str); } @@ -4564,7 +4575,7 @@ BOOL global; void send_file_direct(char *file_name) { -int fh, i, length; +int fh, i, length, delta; char str[MAX_PATH_LENGTH]; time_t now; struct tm *gmt; @@ -4611,12 +4622,14 @@ struct tm *gmt; rsprintf("Content-Length: %d\r\n\r\n", length); - /* return if file too big */ - if (length > (int) (sizeof(return_buffer) - strlen(return_buffer))) + /* increase return buffer size if file too big */ + if (length > return_buffer_size - (int)strlen(return_buffer)) { - printf("return buffer too small\n"); - close(fh); - return; + delta = length - (return_buffer_size - strlen(return_buffer)) + 1000; + + return_buffer = realloc(return_buffer, return_buffer_size + delta); + memset(return_buffer + return_buffer_size, 0, delta); + return_buffer_size += delta; } return_length = strlen(return_buffer)+length; @@ -6904,7 +6917,7 @@ char attrib[MAX_N_ATTR][NAME_LENGTH]; int show_download_page(LOGBOOK *lbs, char *path) { char file_name[256]; -int index, message_id, fh, i, size; +int index, message_id, fh, i, size, delta; char message[TEXT_SIZE+1000], *p; message_id = atoi(path); @@ -6963,11 +6976,14 @@ char message[TEXT_SIZE+1000], *p; rsprintf("Content-Type: text/plain\r\n"); rsprintf("Content-Length: %d\r\n\r\n", size); - /* return if file too big */ - if (size > (int) (sizeof(return_buffer) - strlen(return_buffer))) + /* increase return buffer size if file too big */ + if (size > return_buffer_size - (int)strlen(return_buffer)) { - printf("return buffer too small\n"); - return EL_MEM_ERROR; + delta = size - (return_buffer_size - strlen(return_buffer)) + 1000; + + return_buffer = realloc(return_buffer, return_buffer_size + delta); + memset(return_buffer + return_buffer_size, 0, delta); + return_buffer_size += delta; } return_length = strlen(return_buffer)+size; @@ -12076,8 +12092,6 @@ void ctrlc_handler(int sig) /*------------------------------------------------------------------*/ -char net_buffer[WEB_BUFFER_SIZE]; - #define N_MAX_CONNECTION 10 #define KEEP_ALIVE_TIME 60 @@ -12099,6 +12113,14 @@ struct hostent *phe; fd_set readfds; struct timeval timeout; struct stat cfg_stat; +char *net_buffer = NULL; +int net_buffer_size; + + net_buffer_size = 100000; + net_buffer = malloc(net_buffer_size); + + return_buffer_size = 100000; + return_buffer = malloc(return_buffer_size); #ifdef OS_WINNT { @@ -12374,7 +12396,7 @@ struct stat cfg_stat; if (_sock > 0) { - memset(net_buffer, 0, sizeof(net_buffer)); + memset(net_buffer, 0, net_buffer_size); len = 0; header_length = 0; n_error = 0; @@ -12389,7 +12411,7 @@ struct stat cfg_stat; status = select(FD_SETSIZE, (void *) &readfds, NULL, NULL, (void *) &timeout); if (FD_ISSET(_sock, &readfds)) - i = recv(_sock, net_buffer+len, sizeof(net_buffer)-len, 0); + i = recv(_sock, net_buffer+len, net_buffer_size-len, 0); else goto finished; @@ -12400,40 +12422,28 @@ struct stat cfg_stat; if (i>0) len += i; - /* check if net_buffer too small */ - if (len >= sizeof(net_buffer)) + /* check if net_buffer needs to be increased */ + if (len == net_buffer_size) { - /* drain incoming remaining data */ - do + net_buffer = realloc(net_buffer, net_buffer_size + 100000); + + if (net_buffer == NULL) { - FD_ZERO(&readfds); - FD_SET(_sock, &readfds); - - timeout.tv_sec = 2; - timeout.tv_usec = 0; - - status = select(FD_SETSIZE, (void *) &readfds, NULL, NULL, (void *) &timeout); - - if (FD_ISSET(_sock, &readfds)) - i = recv(_sock, net_buffer, sizeof(net_buffer), 0); - else - break; - } while (i); - - memset(return_buffer, 0, sizeof(return_buffer)); - strlen_retbuf = 0; - return_length = 0; - - show_error("Submitted attachment too large, please increase WEB_BUFFER_SIZE in elogd.c and recompile"); - send(_sock, return_buffer, strlen_retbuf+1, 0); - keep_alive = 0; - if (verbose) - { - printf("==== Return ================================\n"); - puts(return_buffer); - printf("\n\n"); + sprintf(str, "Error: Cannot increase net_buffer, out of memory, net_buffer_size = %d", net_buffer_size); + show_error(str); + send(_sock, return_buffer, strlen_retbuf+1, 0); + keep_alive = 0; + if (verbose) + { + printf("==== Return ================================\n"); + puts(return_buffer); + printf("\n\n"); + } + goto finished; } - goto finished; + + memset(net_buffer + net_buffer_size, 0, 100000); + net_buffer_size += 100000; } if (i == 0) @@ -12590,7 +12600,7 @@ struct stat cfg_stat; *strchr(browser, '\r') = 0; } - memset(return_buffer, 0, sizeof(return_buffer)); + memset(return_buffer, 0, return_buffer_size); strlen_retbuf = 0; if (strncmp(net_buffer, "GET", 3) != 0 &&