Try to address the potential buffer overflows

This commit is contained in:
Bastien Dejean 2012-09-29 11:57:41 +02:00
parent e08cecaa05
commit 36140fe1c3
7 changed files with 46 additions and 37 deletions

16
bspc.c
View file

@ -19,18 +19,22 @@ int main(int argc, char *argv[])
char *sp = getenv(SOCKET_ENV_VAR);
strcpy(socket_path, (sp == NULL ? DEFAULT_SOCKET_PATH : sp));
strncpy(socket_path, (sp == NULL ? DEFAULT_SOCKET_PATH : sp), sizeof(socket_path));
msg[0] = '\0';
for (i = 1; i < argc; i++) {
strcat(msg, argv[i]);
if (i < (argc - 1))
strcat(msg, TOKEN_SEP);
int max = sizeof(msg);
for (i = 1; max > 0 && i < argc; i++) {
strncat(msg, argv[i], max);
max -= strlen(argv[i]);
if (i < (argc - 1)) {
strncat(msg, TOKEN_SEP, max);
max -= strlen(TOKEN_SEP);
}
}
sock_address.sun_family = AF_UNIX;
strcpy(sock_address.sun_path, socket_path);
strncpy(sock_address.sun_path, socket_path, sizeof(sock_address.sun_path));
sock_fd = socket(AF_UNIX, SOCK_STREAM, 0);
connect(sock_fd, (struct sockaddr *) &sock_address, sizeof(sock_address));

View file

@ -106,10 +106,10 @@ int main(void)
char *sp = getenv(SOCKET_ENV_VAR);
strcpy(socket_path, (sp == NULL ? DEFAULT_SOCKET_PATH : sp));
strncpy(socket_path, (sp == NULL ? DEFAULT_SOCKET_PATH : sp), sizeof(socket_path));
sock_address.sun_family = AF_UNIX;
strcpy(sock_address.sun_path, socket_path);
strncpy(sock_address.sun_path, socket_path, sizeof(sock_address.sun_path));
unlink(socket_path);
sock_fd = socket(AF_UNIX, SOCK_STREAM, 0);
@ -141,7 +141,7 @@ int main(void)
ret_fd = accept(sock_fd, NULL, 0);
if (ret_fd > 0 && (nbr = recv(ret_fd, msg, sizeof(msg), 0)) > 0) {
msg[nbr] = '\0';
strcpy(rsp, EMPTY_RESPONSE);
strncpy(rsp, EMPTY_RESPONSE, sizeof(rsp));
process_message(msg, rsp);
send(ret_fd, rsp, strlen(rsp), 0);
close(ret_fd);

View file

@ -75,7 +75,7 @@ void map_request(xcb_generic_event_t *evt)
xcb_icccm_get_wm_class_reply_t reply;
if (xcb_icccm_get_wm_class_reply(dpy, xcb_icccm_get_wm_class(dpy, win), &reply, NULL) == 1) {
strcpy(c->class_name, reply.class_name);
strncpy(c->class_name, reply.class_name, sizeof(c->class_name));
xcb_icccm_get_wm_class_reply_wipe(&reply);
}

View file

@ -26,7 +26,7 @@ void process_message(char *msg, char *rsp)
} else if (strcmp(cmd, "set") == 0) {
char *name = strtok(NULL, TOKEN_SEP);
char *value = strtok(NULL, TOKEN_SEP);
set_setting(name, value);
set_setting(name, value, rsp);
return;
} else if (strcmp(cmd, "dump") == 0) {
dump_tree(desk, desk->root, rsp, 0);
@ -126,7 +126,7 @@ void process_message(char *msg, char *rsp)
if (d != NULL) {
char *new_name = strtok(NULL, TOKEN_SEP);
if (new_name != NULL) {
strcpy(d->name, new_name);
strncpy(d->name, new_name, sizeof(d->name));
ewmh_update_desktop_names();
}
}
@ -163,13 +163,13 @@ void process_message(char *msg, char *rsp)
char *name = strtok(NULL, TOKEN_SEP);
if (name != NULL) {
rule_t *rule = make_rule();
strcpy(rule->cause.name, name);
strncpy(rule->cause.name, name, sizeof(rule->cause.name));
char *arg = strtok(NULL, TOKEN_SEP);
while (arg != NULL) {
if (strcmp(arg, "floating") == 0) {
rule->effect.floating = true;
} else {
strcpy(rule->effect.desk_name, arg);
strncpy(rule->effect.desk_name, arg, sizeof(rule->effect.desk_name));
}
arg = strtok(NULL, TOKEN_SEP);
}
@ -208,14 +208,14 @@ void process_message(char *msg, char *rsp)
quit();
return;
} else {
sprintf(rsp, "unknown command: %s\n", cmd);
snprintf(rsp, BUFSIZ, "unknown command: %s\n", cmd);
return;
}
apply_layout(desk, desk->root, root_rect);
}
void set_setting(char *name, char *value)
void set_setting(char *name, char *value, char *rsp)
{
if (name == NULL || value == NULL)
return;
@ -245,37 +245,40 @@ void set_setting(char *name, char *value)
sscanf(value, "%i", &bottom_padding);
update_root_dimensions();
} else if (strcmp(name, "active_border_color") == 0) {
strcpy(active_border_color, value);
strncpy(active_border_color, value, sizeof(active_border_color));
active_border_color_pxl = get_color(active_border_color);
} else if (strcmp(name, "normal_border_color") == 0) {
strcpy(normal_border_color, value);
strncpy(normal_border_color, value, sizeof(normal_border_color));
normal_border_color_pxl = get_color(normal_border_color);
} else if (strcmp(name, "inner_border_color") == 0) {
strcpy(inner_border_color, value);
strncpy(inner_border_color, value, sizeof(inner_border_color));
inner_border_color_pxl = get_color(inner_border_color);
} else if (strcmp(name, "outer_border_color") == 0) {
strcpy(outer_border_color, value);
strncpy(outer_border_color, value, sizeof(outer_border_color));
outer_border_color_pxl = get_color(outer_border_color);
} else if (strcmp(name, "presel_border_color") == 0) {
strcpy(presel_border_color, value);
strncpy(presel_border_color, value, sizeof(presel_border_color));
presel_border_color_pxl = get_color(presel_border_color);
} else if (strcmp(name, "active_locked_border_color") == 0) {
strcpy(active_locked_border_color, value);
strncpy(active_locked_border_color, value, sizeof(active_locked_border_color));
active_locked_border_color_pxl = get_color(active_locked_border_color);
} else if (strcmp(name, "normal_locked_border_color") == 0) {
strcpy(normal_locked_border_color, value);
strncpy(normal_locked_border_color, value, sizeof(normal_locked_border_color));
normal_locked_border_color_pxl = get_color(normal_locked_border_color);
} else if (strcmp(name, "urgent_border_color") == 0) {
strcpy(urgent_border_color, value);
strncpy(urgent_border_color, value, sizeof(urgent_border_color));
urgent_border_color_pxl = get_color(urgent_border_color);
} else if (strcmp(name, "borderless_monocle") == 0) {
bool b;
if (parse_bool(value, &b))
borderless_monocle = b;
} else if (strcmp(name, "wm_name") == 0) {
strcpy(wm_name, value);
strncpy(wm_name, value, sizeof(wm_name));
ewmh_update_wm_name();
return;
} else {
snprintf(rsp, BUFSIZ, "unknown setting: %s\n", name);
return;
}
apply_layout(desk, desk->root, root_rect);
@ -324,6 +327,8 @@ void get_setting(char *name, char* rsp)
sprintf(rsp, "%s\n", BOOLSTR(borderless_monocle));
else if (strcmp(name, "wm_name") == 0)
sprintf(rsp, "%s\n", wm_name);
else
snprintf(rsp, BUFSIZ, "unknown setting: %s\n", name);
}

View file

@ -5,7 +5,7 @@
void process_message(char*, char*);
void get_setting(char*, char*);
void set_setting(char*, char*);
void set_setting(char*, char*, char*);
bool parse_bool(char *, bool *);
bool parse_layout(char *, layout_t *);
bool parse_direction(char *, direction_t *);

View file

@ -32,14 +32,14 @@ void run_autostart(void)
void load_settings(void)
{
strcpy(normal_border_color, NORMAL_BORDER_COLOR);
strcpy(active_border_color, ACTIVE_BORDER_COLOR);
strcpy(inner_border_color, INNER_BORDER_COLOR);
strcpy(outer_border_color, OUTER_BORDER_COLOR);
strcpy(presel_border_color, PRESEL_BORDER_COLOR);
strcpy(active_locked_border_color, ACTIVE_LOCKED_BORDER_COLOR);
strcpy(normal_locked_border_color, NORMAL_LOCKED_BORDER_COLOR);
strcpy(urgent_border_color, URGENT_BORDER_COLOR);
strncpy(normal_border_color, NORMAL_BORDER_COLOR, sizeof(normal_border_color));
strncpy(active_border_color, ACTIVE_BORDER_COLOR, sizeof(active_border_color));
strncpy(inner_border_color, INNER_BORDER_COLOR, sizeof(inner_border_color));
strncpy(outer_border_color, OUTER_BORDER_COLOR, sizeof(outer_border_color));
strncpy(presel_border_color, PRESEL_BORDER_COLOR, sizeof(presel_border_color));
strncpy(active_locked_border_color, ACTIVE_LOCKED_BORDER_COLOR, sizeof(active_locked_border_color));
strncpy(normal_locked_border_color, NORMAL_LOCKED_BORDER_COLOR, sizeof(normal_locked_border_color));
strncpy(urgent_border_color, URGENT_BORDER_COLOR, sizeof(urgent_border_color));
normal_border_color_pxl = get_color(normal_border_color);
active_border_color_pxl = get_color(active_border_color);
@ -50,7 +50,7 @@ void load_settings(void)
normal_locked_border_color_pxl = get_color(normal_locked_border_color);
urgent_border_color_pxl = get_color(urgent_border_color);
strcpy(wm_name, WM_NAME);
strncpy(wm_name, WM_NAME, sizeof(wm_name));
inner_border_width = INNER_BORDER_WIDTH;
main_border_width = MAIN_BORDER_WIDTH;

View file

@ -19,7 +19,7 @@ node_t *make_node(void)
desktop_t *make_desktop(const char *name)
{
desktop_t *d = malloc(sizeof(desktop_t));
strcpy(d->name, name);
strncpy(d->name, name, sizeof(d->name));
d->layout = LAYOUT_TILED;
d->prev = d->next = NULL;
d->root = d->focus = d->last_focus = NULL;
@ -29,7 +29,7 @@ desktop_t *make_desktop(const char *name)
client_t *make_client(xcb_window_t win)
{
client_t *c = malloc(sizeof(client_t));
strcpy(c->class_name, MISSING_VALUE);
strncpy(c->class_name, MISSING_VALUE, sizeof(c->class_name));
c->border_width = border_width;
c->window = win;
c->floating = c->transient = c->fullscreen = c->locked = c->urgent = false;