Fix buffer overflow in dial_server.c (b/16673295)
Change-Id: Icc92bfdb7b98028035949c4243cedfb0f40d005e
diff --git a/src/server/dial_server.c b/src/server/dial_server.c
index 43413b4..ca3ee5e 100644
--- a/src/server/dial_server.c
+++ b/src/server/dial_server.c
@@ -118,7 +118,7 @@
const char *app_name,
const char *origin_header) {
char additional_data_param[256] = {0, };
- char body[DIAL_MAX_PAYLOAD + sizeof(additional_data_param) + 2] = {0, };
+ char body[DIAL_MAX_PAYLOAD] = {0, };
DIALApp *app;
DIALServer *ds = request_info->user_data;
int body_size;
@@ -143,15 +143,17 @@
in_port_t dial_port = DIAL_get_port(ds);
if (app->useAdditionalData) {
- if (body_size != 0) {
- strcat(body, "&");
- }
// Construct additionalDataUrl=http://host:port/apps/app_name/dial_data
- sprintf(additional_data_param,
- "additionalDataUrl=http%%3A%%2F%%2Flocalhost%%3A%d%%2Fapps%%2F%s%%2Fdial_data%%3F",
+ snprintf(additional_data_param, sizeof(additional_data_param),
+ "%sadditionalDataUrl=http%%3A%%2F%%2Flocalhost%%3A%d%%2Fapps%%2F%s%%2Fdial_data%%3F",
+ (body_size != 0) ? "&" : "",
dial_port, app_name);
- strcat(body, additional_data_param);
- body_size = strlen(body);
+ if ((body_size + strlen(additional_data_param)) < DIAL_MAX_PAYLOAD) {
+ strcat(body, additional_data_param);
+ body_size = strlen(body);
+ } else {
+ fprintf(stderr, "payload too small for additional data\n");
+ }
}
fprintf(stderr, "Starting the app with params %s\n", body);
app->state = app->callbacks.start_cb(ds, app_name, body, body_size,
@@ -168,7 +170,11 @@
laddr, dial_port, app_name, origin_header);
// copy the payload into the application struct
memset(app->payload, 0, DIAL_MAX_PAYLOAD);
- memcpy(app->payload, body, body_size);
+ if (body_size<=DIAL_MAX_PAYLOAD) {
+ memcpy(app->payload, body, body_size);
+ } else {
+ fprintf(stderr, "payload too small for body of %d bytes\n", body_size);
+ }
} else {
mg_send_http_error(conn, 503, "Service Unavailable",
"Service Unavailable");