Eliminated WEB_BUFFER_SIZE and made memory allocation dynamically

SVN revision: 496
This commit is contained in:
Stefan Ritt 2003-04-11 07:25:52 +00:00
parent 82d43af37d
commit 183de1dcab
2 changed files with 123 additions and 108 deletions

View File

@ -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 Version 2.3.5, released April 9th, 2003
======================================= =======================================

View File

@ -6,6 +6,9 @@
Contents: Web server program for Electronic Logbook ELOG Contents: Web server program for Electronic Logbook ELOG
$Log$ $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 Revision 1.81 2003/04/09 14:02:18 midas
Better error message on email send failure Better error message on email send failure
@ -863,9 +866,8 @@ typedef int INT;
#define EL_NEXT 3 #define EL_NEXT 3
#define EL_PREV 4 #define EL_PREV 4
#define WEB_BUFFER_SIZE 2000000 char *return_buffer;
int return_buffer_size;
char return_buffer[WEB_BUFFER_SIZE];
int strlen_retbuf; int strlen_retbuf;
int keep_alive; int keep_alive;
char header_buffer[1000]; char header_buffer[1000];
@ -3564,11 +3566,14 @@ char buf[256];
void rsputs(const char *str) void rsputs(const char *str)
{ {
if (strlen_retbuf + strlen(str) > sizeof(return_buffer)) if (strlen_retbuf + (int)strlen(str) > return_buffer_size)
strcpy(return_buffer, "<H1>Error: return buffer too small</H1>"); {
else return_buffer = realloc(return_buffer, return_buffer_size + 100000);
strcpy(return_buffer+strlen_retbuf, str); memset(return_buffer + return_buffer_size, 0, 100000);
return_buffer_size += 100000;
}
strcpy(return_buffer+strlen_retbuf, str);
strlen_retbuf += strlen(str); strlen_retbuf += strlen(str);
} }
@ -3581,68 +3586,70 @@ void rsputs2(const char *str)
int i, j, k, l; int i, j, k, l;
char *p, link[256]; char *p, link[256];
if (strlen_retbuf + strlen(str) > sizeof(return_buffer)) if (strlen_retbuf + (int)strlen(str) > return_buffer_size)
strcpy(return_buffer, "<H1>Error: return buffer too small</H1>");
else
{ {
j = strlen_retbuf; return_buffer = realloc(return_buffer, return_buffer_size + 100000);
for (i=0 ; i<(int)strlen(str) ; i++) 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]);
p = (char *) (str+i+strlen(list[l])); for (k=0 ; *p && strcspn(p, "> ,\t\n\r({[)}]") ; k++,i++)
i += strlen(list[l]); link[k] = *p++;
for (k=0 ; *p && strcspn(p, "> ,\t\n\r({[)}]") ; k++,i++) link[k] = 0;
link[k] = *p++; i--;
link[k] = 0;
i--;
if (strcmp(list[l], "elog:") == 0) if (strcmp(list[l], "elog:") == 0)
{ {
/* if link contains '/' (reference to other logbook), add ".." in front */ /* if link contains '/' (reference to other logbook), add ".." in front */
if (strchr(link, '/')) if (strchr(link, '/'))
sprintf(return_buffer+j, "<a href=\"../%s\">elog:%s</a>", link, link); sprintf(return_buffer+j, "<a href=\"../%s\">elog:%s</a>", link, link);
else
sprintf(return_buffer+j, "<a href=\"%s\">elog:%s</a>", link, link);
}
else else
sprintf(return_buffer+j, "<a href=\"%s%s\">%s%s</a>", list[l], link, list[l], link); sprintf(return_buffer+j, "<a href=\"%s\">elog:%s</a>", link, link);
j += strlen(return_buffer+j);
break;
}
}
if (!list[l][0])
{
if (strncmp(str+i, "<br>", 4) == 0)
{
strcpy(return_buffer+j, "<br>");
j+=4;
i+=3;
} }
else else
switch (str[i]) sprintf(return_buffer+j, "<a href=\"%s%s\">%s%s</a>", list[l], link, list[l], link);
{
case '<': strcat(return_buffer, "&lt;"); j+=4; break;
case '>': strcat(return_buffer, "&gt;"); j+=4; break;
/* the translation for the search highliting */ j += strlen(return_buffer+j);
case '\001' : strcat(return_buffer, "<"); j++; break; 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; if (!list[l][0])
strlen_retbuf = j; {
if (strncmp(str+i, "<br>", 4) == 0)
{
strcpy(return_buffer+j, "<br>");
j+=4;
i+=3;
}
else
switch (str[i])
{
case '<': strcat(return_buffer, "&lt;"); j+=4; break;
case '>': strcat(return_buffer, "&gt;"); 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); vsprintf(str, (char *) format, argptr);
va_end(argptr); va_end(argptr);
if (strlen_retbuf + strlen(str) > sizeof(return_buffer)) if (strlen_retbuf + (int)strlen(str) > return_buffer_size)
strcpy(return_buffer, "<H1>Error: return buffer too small</H1>"); {
else return_buffer = realloc(return_buffer, return_buffer_size + 100000);
strcpy(return_buffer+strlen_retbuf, str); memset(return_buffer + return_buffer_size, 0, 100000);
return_buffer_size += 100000;
}
strcpy(return_buffer+strlen_retbuf, str);
strlen_retbuf += strlen(str); strlen_retbuf += strlen(str);
} }
@ -4564,7 +4575,7 @@ BOOL global;
void send_file_direct(char *file_name) void send_file_direct(char *file_name)
{ {
int fh, i, length; int fh, i, length, delta;
char str[MAX_PATH_LENGTH]; char str[MAX_PATH_LENGTH];
time_t now; time_t now;
struct tm *gmt; struct tm *gmt;
@ -4611,12 +4622,14 @@ struct tm *gmt;
rsprintf("Content-Length: %d\r\n\r\n", length); rsprintf("Content-Length: %d\r\n\r\n", length);
/* return if file too big */ /* increase return buffer size if file too big */
if (length > (int) (sizeof(return_buffer) - strlen(return_buffer))) if (length > return_buffer_size - (int)strlen(return_buffer))
{ {
printf("return buffer too small\n"); delta = length - (return_buffer_size - strlen(return_buffer)) + 1000;
close(fh);
return; 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; 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) int show_download_page(LOGBOOK *lbs, char *path)
{ {
char file_name[256]; 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; char message[TEXT_SIZE+1000], *p;
message_id = atoi(path); message_id = atoi(path);
@ -6963,11 +6976,14 @@ char message[TEXT_SIZE+1000], *p;
rsprintf("Content-Type: text/plain\r\n"); rsprintf("Content-Type: text/plain\r\n");
rsprintf("Content-Length: %d\r\n\r\n", size); rsprintf("Content-Length: %d\r\n\r\n", size);
/* return if file too big */ /* increase return buffer size if file too big */
if (size > (int) (sizeof(return_buffer) - strlen(return_buffer))) if (size > return_buffer_size - (int)strlen(return_buffer))
{ {
printf("return buffer too small\n"); delta = size - (return_buffer_size - strlen(return_buffer)) + 1000;
return EL_MEM_ERROR;
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; 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 N_MAX_CONNECTION 10
#define KEEP_ALIVE_TIME 60 #define KEEP_ALIVE_TIME 60
@ -12099,6 +12113,14 @@ struct hostent *phe;
fd_set readfds; fd_set readfds;
struct timeval timeout; struct timeval timeout;
struct stat cfg_stat; 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 #ifdef OS_WINNT
{ {
@ -12374,7 +12396,7 @@ struct stat cfg_stat;
if (_sock > 0) if (_sock > 0)
{ {
memset(net_buffer, 0, sizeof(net_buffer)); memset(net_buffer, 0, net_buffer_size);
len = 0; len = 0;
header_length = 0; header_length = 0;
n_error = 0; n_error = 0;
@ -12389,7 +12411,7 @@ struct stat cfg_stat;
status = select(FD_SETSIZE, (void *) &readfds, NULL, NULL, (void *) &timeout); status = select(FD_SETSIZE, (void *) &readfds, NULL, NULL, (void *) &timeout);
if (FD_ISSET(_sock, &readfds)) 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 else
goto finished; goto finished;
@ -12400,40 +12422,28 @@ struct stat cfg_stat;
if (i>0) if (i>0)
len += i; len += i;
/* check if net_buffer too small */ /* check if net_buffer needs to be increased */
if (len >= sizeof(net_buffer)) if (len == net_buffer_size)
{ {
/* drain incoming remaining data */ net_buffer = realloc(net_buffer, net_buffer_size + 100000);
do
if (net_buffer == NULL)
{ {
FD_ZERO(&readfds); sprintf(str, "Error: Cannot increase net_buffer, out of memory, net_buffer_size = %d", net_buffer_size);
FD_SET(_sock, &readfds); show_error(str);
send(_sock, return_buffer, strlen_retbuf+1, 0);
timeout.tv_sec = 2; keep_alive = 0;
timeout.tv_usec = 0; if (verbose)
{
status = select(FD_SETSIZE, (void *) &readfds, NULL, NULL, (void *) &timeout); printf("==== Return ================================\n");
puts(return_buffer);
if (FD_ISSET(_sock, &readfds)) printf("\n\n");
i = recv(_sock, net_buffer, sizeof(net_buffer), 0); }
else goto finished;
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");
} }
goto finished;
memset(net_buffer + net_buffer_size, 0, 100000);
net_buffer_size += 100000;
} }
if (i == 0) if (i == 0)
@ -12590,7 +12600,7 @@ struct stat cfg_stat;
*strchr(browser, '\r') = 0; *strchr(browser, '\r') = 0;
} }
memset(return_buffer, 0, sizeof(return_buffer)); memset(return_buffer, 0, return_buffer_size);
strlen_retbuf = 0; strlen_retbuf = 0;
if (strncmp(net_buffer, "GET", 3) != 0 && if (strncmp(net_buffer, "GET", 3) != 0 &&