server: avoid doing unaligned struct accesses

This commit is contained in:
Daniel Eklöf 2020-11-21 20:47:17 +01:00
parent 997c6a4ae3
commit f4de500a18
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F

View file

@ -119,7 +119,6 @@ fdm_client(struct fdm *fdm, int fd, int events, void *data)
struct server *server = client->server; struct server *server = client->server;
char **argv = NULL; char **argv = NULL;
int argc = 0;
if (events & EPOLLHUP) if (events & EPOLLHUP)
goto shutdown; goto shutdown;
@ -211,36 +210,40 @@ fdm_client(struct fdm *fdm, int fd, int events, void *data)
uint8_t *p = client->buffer.data; uint8_t *p = client->buffer.data;
const uint8_t *end = &client->buffer.data[client->buffer.idx]; const uint8_t *end = &client->buffer.data[client->buffer.idx];
const struct client_data *cdata = (const struct client_data *)p; struct client_data cdata;
CHECK_BUF(sizeof(*cdata)); CHECK_BUF(sizeof(cdata));
p += sizeof(*cdata); memcpy(&cdata, p, sizeof(cdata));
p += sizeof(cdata);
CHECK_BUF_AND_NULL(cdata->cwd_len); CHECK_BUF_AND_NULL(cdata.cwd_len);
const char *cwd = (const char *)p; p += cdata->cwd_len; const char *cwd = (const char *)p; p += cdata.cwd_len;
LOG_DBG("CWD = %.*s", cdata->cwd_len, cwd); LOG_DBG("CWD = %.*s", cdata.cwd_len, cwd);
CHECK_BUF_AND_NULL(cdata->term_len); CHECK_BUF_AND_NULL(cdata.term_len);
const char *term_env = (const char *)p; p += cdata->term_len; const char *term_env = (const char *)p; p += cdata.term_len;
LOG_DBG("TERM = %.*s", cdata->term_len, term_env); LOG_DBG("TERM = %.*s", cdata.term_len, term_env);
CHECK_BUF_AND_NULL(cdata->title_len); CHECK_BUF_AND_NULL(cdata.title_len);
const char *title = (const char *)p; p += cdata->title_len; const char *title = (const char *)p; p += cdata.title_len;
LOG_DBG("title = %.*s", cdata->title_len, title); LOG_DBG("title = %.*s", cdata.title_len, title);
CHECK_BUF_AND_NULL(cdata->app_id_len); CHECK_BUF_AND_NULL(cdata.app_id_len);
const char *app_id = (const char *)p; p += cdata->app_id_len; const char *app_id = (const char *)p; p += cdata.app_id_len;
LOG_DBG("app-id = %.*s", cdata->app_id_len, app_id); LOG_DBG("app-id = %.*s", cdata.app_id_len, app_id);
argv = xcalloc(cdata->argc + 1, sizeof(argv[0])); argv = xcalloc(cdata.argc + 1, sizeof(argv[0]));
for (uint16_t i = 0; i < cdata->argc; i++) { for (uint16_t i = 0; i < cdata.argc; i++) {
const struct client_argv *arg = (const struct client_argv *)p; struct client_argv arg;
CHECK_BUF(sizeof(*arg)); CHECK_BUF(sizeof(arg));
p += sizeof(*arg); memcpy(&arg, p, sizeof(arg));
p += sizeof(arg);
CHECK_BUF_AND_NULL(arg->len); CHECK_BUF_AND_NULL(arg.len);
argv[i] = (char *)p; p += arg->len; argv[i] = (char *)p; p += arg.len;
LOG_DBG("argv[%hu] = %.*s", i, arg.len, argv[i]);
} }
argv[cdata.argc] = NULL;
#undef CHECK_BUF_AND_NULL #undef CHECK_BUF_AND_NULL
#undef CHECK_BUF #undef CHECK_BUF
@ -252,17 +255,17 @@ fdm_client(struct fdm *fdm, int fd, int events, void *data)
? xstrdup(title) : xstrdup(server->conf->title); ? xstrdup(title) : xstrdup(server->conf->title);
client->conf.app_id = strlen(app_id) > 0 client->conf.app_id = strlen(app_id) > 0
? xstrdup(app_id) : xstrdup(server->conf->app_id); ? xstrdup(app_id) : xstrdup(server->conf->app_id);
client->conf.hold_at_exit = cdata->hold; client->conf.hold_at_exit = cdata.hold;
client->conf.login_shell = cdata->login_shell; client->conf.login_shell = cdata.login_shell;
if (cdata->maximized) if (cdata.maximized)
client->conf.startup_mode = STARTUP_MAXIMIZED; client->conf.startup_mode = STARTUP_MAXIMIZED;
else if (cdata->fullscreen) else if (cdata.fullscreen)
client->conf.startup_mode = STARTUP_FULLSCREEN; client->conf.startup_mode = STARTUP_FULLSCREEN;
client->term = term_init( client->term = term_init(
&client->conf, server->fdm, server->reaper, server->wayl, &client->conf, server->fdm, server->reaper, server->wayl,
"footclient", cwd, argc, argv, &term_shutdown_handler, client); "footclient", cwd, cdata.argc, argv, &term_shutdown_handler, client);
if (client->term == NULL) { if (client->term == NULL) {
LOG_ERR("failed to instantiate new terminal"); LOG_ERR("failed to instantiate new terminal");