mirror of
https://codeberg.org/dnkl/foot.git
synced 2026-02-04 04:06:06 -05:00
server: avoid doing unaligned struct accesses
This commit is contained in:
parent
997c6a4ae3
commit
f4de500a18
1 changed files with 31 additions and 28 deletions
59
server.c
59
server.c
|
|
@ -119,7 +119,6 @@ fdm_client(struct fdm *fdm, int fd, int events, void *data)
|
|||
struct server *server = client->server;
|
||||
|
||||
char **argv = NULL;
|
||||
int argc = 0;
|
||||
|
||||
if (events & EPOLLHUP)
|
||||
goto shutdown;
|
||||
|
|
@ -211,36 +210,40 @@ fdm_client(struct fdm *fdm, int fd, int events, void *data)
|
|||
uint8_t *p = client->buffer.data;
|
||||
const uint8_t *end = &client->buffer.data[client->buffer.idx];
|
||||
|
||||
const struct client_data *cdata = (const struct client_data *)p;
|
||||
CHECK_BUF(sizeof(*cdata));
|
||||
p += sizeof(*cdata);
|
||||
struct client_data cdata;
|
||||
CHECK_BUF(sizeof(cdata));
|
||||
memcpy(&cdata, p, sizeof(cdata));
|
||||
p += sizeof(cdata);
|
||||
|
||||
CHECK_BUF_AND_NULL(cdata->cwd_len);
|
||||
const char *cwd = (const char *)p; p += cdata->cwd_len;
|
||||
LOG_DBG("CWD = %.*s", cdata->cwd_len, cwd);
|
||||
CHECK_BUF_AND_NULL(cdata.cwd_len);
|
||||
const char *cwd = (const char *)p; p += cdata.cwd_len;
|
||||
LOG_DBG("CWD = %.*s", cdata.cwd_len, cwd);
|
||||
|
||||
CHECK_BUF_AND_NULL(cdata->term_len);
|
||||
const char *term_env = (const char *)p; p += cdata->term_len;
|
||||
LOG_DBG("TERM = %.*s", cdata->term_len, term_env);
|
||||
CHECK_BUF_AND_NULL(cdata.term_len);
|
||||
const char *term_env = (const char *)p; p += cdata.term_len;
|
||||
LOG_DBG("TERM = %.*s", cdata.term_len, term_env);
|
||||
|
||||
CHECK_BUF_AND_NULL(cdata->title_len);
|
||||
const char *title = (const char *)p; p += cdata->title_len;
|
||||
LOG_DBG("title = %.*s", cdata->title_len, title);
|
||||
CHECK_BUF_AND_NULL(cdata.title_len);
|
||||
const char *title = (const char *)p; p += cdata.title_len;
|
||||
LOG_DBG("title = %.*s", cdata.title_len, title);
|
||||
|
||||
CHECK_BUF_AND_NULL(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);
|
||||
CHECK_BUF_AND_NULL(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);
|
||||
|
||||
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++) {
|
||||
const struct client_argv *arg = (const struct client_argv *)p;
|
||||
CHECK_BUF(sizeof(*arg));
|
||||
p += sizeof(*arg);
|
||||
for (uint16_t i = 0; i < cdata.argc; i++) {
|
||||
struct client_argv arg;
|
||||
CHECK_BUF(sizeof(arg));
|
||||
memcpy(&arg, p, sizeof(arg));
|
||||
p += sizeof(arg);
|
||||
|
||||
CHECK_BUF_AND_NULL(arg->len);
|
||||
argv[i] = (char *)p; p += arg->len;
|
||||
CHECK_BUF_AND_NULL(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
|
||||
|
|
@ -252,17 +255,17 @@ fdm_client(struct fdm *fdm, int fd, int events, void *data)
|
|||
? xstrdup(title) : xstrdup(server->conf->title);
|
||||
client->conf.app_id = strlen(app_id) > 0
|
||||
? xstrdup(app_id) : xstrdup(server->conf->app_id);
|
||||
client->conf.hold_at_exit = cdata->hold;
|
||||
client->conf.login_shell = cdata->login_shell;
|
||||
client->conf.hold_at_exit = cdata.hold;
|
||||
client->conf.login_shell = cdata.login_shell;
|
||||
|
||||
if (cdata->maximized)
|
||||
if (cdata.maximized)
|
||||
client->conf.startup_mode = STARTUP_MAXIMIZED;
|
||||
else if (cdata->fullscreen)
|
||||
else if (cdata.fullscreen)
|
||||
client->conf.startup_mode = STARTUP_FULLSCREEN;
|
||||
|
||||
client->term = term_init(
|
||||
&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) {
|
||||
LOG_ERR("failed to instantiate new terminal");
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue