aboutsummaryrefslogtreecommitdiff
path: root/src/Groups.c
diff options
context:
space:
mode:
authorswhite <swhite@1faa4e14-9dd3-4be0-9f0e-ffe519881164>2004-04-06 17:45:14 +0000
committerswhite <swhite@1faa4e14-9dd3-4be0-9f0e-ffe519881164>2004-04-06 17:45:14 +0000
commit89b88d27b20641e04cd1c2714c299d8908822b54 (patch)
tree5b31770e8864f4d6f0953acbe24af5cc80d43730 /src/Groups.c
parent3ccc27cd1bf0912054213a88798b088010173f1e (diff)
Regarding Cactus bug report 1632 "HTTPD contains buffer overflows"
1) Got rid of most strcat/sprintf into automatic array, replaced with a String module that allocates dynamic memory on the heap. 2) Went a long way toward initializing all variables. 3) Tested: Ran two copies with same parfile except different port, one with my changes, one with original. Went through different kinds of pages by hand, checked by eye. 4) Tried to make HTML XHTML 1.0-compliant. Checked with Amaya. One problem: How to deal with raw less-than characters, etc. Made a function to convert them to HTML Character Entities, but isn't clear this will work properly in the forms. So I left these symbols in the forms. 5) Also checked with more primitive browsers, lynx and dillo. 6) Marked a few instances of questionable code with 'SW' To do ----- Document a few new functions, esp. in Content.c git-svn-id: http://svn.cactuscode.org/arrangements/CactusConnect/HTTPD/trunk@187 1faa4e14-9dd3-4be0-9f0e-ffe519881164
Diffstat (limited to 'src/Groups.c')
-rw-r--r--src/Groups.c156
1 files changed, 80 insertions, 76 deletions
diff --git a/src/Groups.c b/src/Groups.c
index de46bad..08a54ad 100644
--- a/src/Groups.c
+++ b/src/Groups.c
@@ -19,6 +19,8 @@
#include "http_Request.h"
#include "http_Content.h"
+#include "http_SString.h"
+
static const char *rcsid = "$Header$";
CCTK_FILEVERSION(CactusConnect_HTTPD_Groups_c)
@@ -96,7 +98,7 @@ int HTTPi_RegisterGroupsPages(void)
static int GroupsPage(const cGH *cctkGH, httpRequest *request, void *data)
{
int retval;
- char message[4098];
+ String *message = String_New();
int i,j;
int ngroups,nvars;
cGroup gdata;
@@ -105,140 +107,142 @@ static int GroupsPage(const cGH *cctkGH, httpRequest *request, void *data)
/* avoid compiler warning about unused parameter */
data = data;
- /* Status message */
- strcpy(message,"HTTP/1.0 200 OK\r\n");
-
- HTTP_Write(request, message, strlen(message));
+ SendHTTP_OK_Header( request );
- /* Content-Type */
- strcpy(message,"Content-Type: text/html\r\n\r\n");
+ /* Start the page */
+ SetHTML_Doctype( message );
+ Send_HTTP_String(request, message);
- HTTP_Write(request, message, strlen(message));
+ Send_HTTP(request,"<html><head>\n");
+ Send_HTTP(request,"<title>Cactus Simulation Group Information</title>\n");
+ SetHTML_HeadHeader( message);
+ Send_HTTP_String(request, message );
- /* Start the page */
- strcpy(message,"<HTML><HEAD><TITLE>Cactus Simulation Group Information</TITLE>\n");
-
- HTTP_Write(request, message, strlen(message));
+ Send_HTTP(request,"</head>\n<body>\n");
/* HTTP_Write out the header part. */
- HTTP_ContentHeader(cctkGH,0,strlen(message),message,NULL);
+ SetHTML_ContentHeader(cctkGH,0,message,NULL);
- retval = HTTP_Write(request, message, strlen(message));
+ retval = Send_HTTP_String(request, message);
ngroups = CCTK_NumGroups();
- strcpy(message, "<center><h1>Groups and Grid Variables</h1></center>"
- "<p>These pages describe the grid variables and groups "
- "active in this simulation.</p>");
- retval = HTTP_Write(request, message, strlen(message));
-
- sprintf(message,"<p>This simulation contains %d groups, and %d variables, "
- "set in %d-space dimensions. Groups for which storage is "
- "currently assigned are written in <font color=red>red</font>. "
+ retval = Send_HTTP(request, "<h1>Groups and Grid Variables</h1>\n"
+ "<p>These pages describe the grid variables and groups \n"
+ "active in this simulation.</p>\n");
+
+ SetToCString(message,
+ "<p>This simulation contains ");
+ ConcatDecimal(message, CCTK_NumGroups());
+ ConcatCString(message,
+ " groups, and ");
+ ConcatDecimal(message, CCTK_NumVars());
+ ConcatCString(message,
+ " variables, "
+ "set in ");
+ ConcatDecimal(message, CCTK_MaxDim());
+ ConcatCString(message,
+ "-space dimensions. \nGroups for which storage is currently\n"
+ "assigned are written in <span class=\"hilite\">red</span>. \n"
"The numbers in square brackets are the group and variable indices."
- "</p>",
- CCTK_NumGroups(),CCTK_NumVars(),
- CCTK_MaxDim());
- retval = HTTP_Write(request, message, strlen(message));
+ "</p>\n");
+ retval = Send_HTTP_String(request, message);
- strcpy(message,"<FORM action=\"/Groups.html\" method=\"GET\">\n");
- retval = HTTP_Write(request, message, strlen(message));
+ retval = Send_HTTP(request,"<form action=\"/Groups.html\" method=\"get\">\n");
- strcpy(message,"<center><table width=100%% cellpadding=5 "
- "cellspacing=5 BGCOLOR=\"#E9F4D3\">"
+ retval = Send_HTTP(request,"<div class=\"centered\">\n"
+ "<table class=\"groups\" width=\"100%\" cellpadding=\"5\" "
+ "cellspacing=\"5\">\n"
"<tr><th>Groups</th><th>Group Properties</th>"
- "<th>Variables</th></tr>");
- retval = HTTP_Write(request, message, strlen(message));
+ "<th>Variables</th></tr>\n");
for(i=0; i < ngroups; i++)
{
- strcpy(message,"<tr valign=top halign=left>");
+ SetToCString(message,"<tr>");
groupname = CCTK_GroupName(i);
if (CCTK_QueryGroupStorageI(cctkGH,i))
{
- sprintf(message,"%s <td>[%d] <font color=red>%s</font></td>"
- "\n", message, i, groupname);
+ ConcatCString(message, " <td>[");
+ ConcatDecimal(message, i);
+ ConcatCString(message, "] <span class=\"hilite\">");
+ ConcatCString(message, groupname);
+ ConcatCString(message, "</span></td>\n");
}
else
{
- sprintf(message,"%s <td VALIGN=TOP ALIGN=LEFT>[%d] %s</td>\n",
- message, i, groupname);
- }
+ ConcatCString(message, " <td>[");
+ ConcatDecimal(message, i);
+ ConcatCString(message, "] ");
+ ConcatCString(message, groupname);
+ ConcatCString(message, "</td>\n");
+ }
free(groupname);
- HTTP_Write(request, message, strlen(message));
+ Send_HTTP_String(request, message);
/* Group Description */
- sprintf(message,"<td>");
+ SetToCString(message, "<td>");
- if (CCTK_GroupData(i,&gdata)>-1)
+ if (CCTK_GroupData(i,&gdata) > -1)
{
switch (CCTK_GroupTypeI(i))
{
case CCTK_SCALAR:
- strcat(message,"Grid scalar");
+ ConcatCString(message,"Grid scalar");
break;
case CCTK_ARRAY:
- strcat(message,"Grid array");
+ ConcatCString(message,"Grid array");
break;
case CCTK_GF:
- strcat(message,"Grid function");
+ ConcatCString(message,"Grid function");
break;
}
- sprintf(message, "%s %s <br>(%d bytes)", message,
- CCTK_VarTypeName(gdata.vartype),CCTK_VarTypeSize(gdata.vartype));
+ ConcatCString(message, " " );
+ ConcatCString(message, CCTK_VarTypeName(gdata.vartype) );
+ ConcatCString(message, " <br />\n(");
+ ConcatDecimal(message, CCTK_VarTypeSize(gdata.vartype));
+ ConcatCString(message, " bytes)");
if (!(CCTK_GroupTypeI(i) == CCTK_SCALAR))
{
- sprintf(message,"%s <br>Dimension %d",message,gdata.dim);
- sprintf(message, "%s <br>Timelevels %d",message, gdata.numtimelevels);
+ ConcatCString(message, " <br />\nDimension ");
+ ConcatDecimal(message, gdata.dim);
+ ConcatCString(message, " <br />\nTimelevels ");
+ ConcatDecimal(message, gdata.numtimelevels);
}
- HTTP_Write(request, message, strlen(message));
+ Send_HTTP_String(request, message);
}
- strcpy(message,"</td>");
+ Send_HTTP(request,"</td>");
nvars = CCTK_NumVarsInGroupI(i);
- strcat(message,"<TD VALIGN=TOP ALIGN=LEFT><DL>");
+ SetToCString(message,"<td>");
for(j=CCTK_FirstVarIndexI(i); j < CCTK_FirstVarIndexI(i)+nvars; j++)
{
- sprintf(message,"%s <DT>[%d] %s\n", message, j, CCTK_VarName(j) );
+ ConcatCString(message, "[" );
+ ConcatDecimal(message, j);
+ ConcatCString(message, "] " );
+ ConcatCString(message, CCTK_VarName(j) );
+ ConcatCString(message, "<br />\n" );
}
- strcat(message,"</DL></TD></TR>");
- HTTP_Write(request, message, strlen(message));
+ ConcatCString(message,"</td></tr>");
+ Send_HTTP_String(request, message);
- /*
- strcpy(message,"<TD align=center valign=center>");
- if (CCTK_GroupTypeI(i) == CCTK_SCALAR)
- {
- for(j=CCTK_FirstVarIndexI(i); j < CCTK_FirstVarIndexI(i)+nvars; j++)
- {
- sprintf(message,"%s "
- "<INPUT type=\"checkbox\" name=\"var%d\" %s value=\"1\"><br>",
- message,j,watch[j] ? "checked" : "unchecked");
- }
- }
- else
- {
- strcat(message,"&nbsp;");
- }
- sprintf(message,"%s </TD></TR>",message);
- HTTP_Write(request, message, strlen(message));
- */
}
- strcpy(message,"</TABLE></FORM></center>\n");
- HTTP_Write(request, message, strlen(message));
+ Send_HTTP(request,"</table></div></form>\n");
/* Write out the footer part. */
- HTTP_ContentFooter(cctkGH,0,strlen(message),message);
- retval = HTTP_Write(request, message, strlen(message));
+ SetHTML_ContentFooter(cctkGH,0,message);
+ retval = Send_HTTP_String(request, message);
+
+ String_Delete( message );
return retval;
}