commit 9307af9e3cb00ecb2647b4a62818fb728ca05dd4 from: Omar Polo date: Sun Jan 21 12:04:45 2024 UTC use imsg_get_data() instead of accessing imsg.data commit - 50e0da0e7f8e07ab5d5c970ebca132a49b5fdbd8 commit + 9307af9e3cb00ecb2647b4a62818fb728ca05dd4 blob - a564ad9a76e0273f9f5f0df79e9d1725d8f655c1 blob + b4c6b13bb50662e21b5c2c07350b4534676818f0 --- amused.c +++ amused.c @@ -103,6 +103,7 @@ main_dispatch_player(int sig, int event, void *d) struct imsgev *iev = d; struct imsgbuf *imsgbuf = &iev->imsgbuf; struct imsg imsg; + struct ibuf ibuf; size_t datalen; ssize_t n; int shut = 0; @@ -126,32 +127,28 @@ main_dispatch_player(int sig, int event, void *d) if (n == 0) /* No more messages. */ break; - datalen = IMSG_DATA_SIZE(imsg); switch (imsg.hdr.type) { case IMSG_POS: - if (datalen != sizeof(current_position)) - fatalx("IMSG_POS: got wrong size (%zu vs %zu)", - datalen, sizeof(current_position)); - memcpy(¤t_position, imsg.data, - sizeof(current_position)); + if (imsg_get_data(&imsg, ¤t_position, + sizeof(current_position)) == -1) + fatalx("IMSG_POS: got wrong size"); if (current_position < 0) current_position = -1; control_notify(IMSG_CTL_SEEK); break; case IMSG_LEN: - if (datalen != sizeof(current_duration)) - fatalx("IMSG_LEN: got wrong size (%zu vs %zu)", - datalen, sizeof(current_duration)); - memcpy(¤t_duration, imsg.data, - sizeof(current_duration)); + if (imsg_get_data(&imsg, ¤t_duration, + sizeof(current_duration)) == -1) + fatalx("IMSG_LEN: got wrong size"); if (current_duration < 0) current_duration = -1; break; case IMSG_ERR: - if (datalen == 0) + if (imsg_get_ibuf(&imsg, &ibuf) == -1 || + (datalen = ibuf_size(&ibuf)) == 0) errstr = "unknown error"; else { - errstr = imsg.data; + errstr = ibuf_data(&ibuf); errstr[datalen-1] = '\0'; } log_warnx("%s; skipping %s", errstr, current_song); @@ -425,17 +422,14 @@ main_play_song(const char *path) void main_playlist_jump(struct imsgev *iev, struct imsg *imsg) { - size_t datalen; char arg[PATH_MAX]; const char *song; - datalen = IMSG_DATA_SIZE(*imsg); - if (datalen != sizeof(arg)) { + if (imsg_get_data(imsg, arg, sizeof(arg)) == -1) { main_senderr(iev, "wrong size"); return; } - memcpy(arg, imsg->data, sizeof(arg)); if (arg[sizeof(arg)-1] != '\0') { main_senderr(iev, "data corrupted"); return; @@ -521,18 +515,15 @@ void main_enqueue(int tx, struct playlist *px, struct imsgev *iev, struct imsg *imsg) { - size_t datalen; char path[PATH_MAX]; const char *err = NULL; - datalen = IMSG_DATA_SIZE(*imsg); - if (datalen != sizeof(path)) { + if (imsg_get_data(imsg, path, sizeof(path)) == -1) { err = "data size mismatch"; goto err; } - memcpy(path, imsg->data, sizeof(path)); - if (path[datalen-1] != '\0') { + if (path[sizeof(path)-1] != '\0') { err = "malformed data"; goto err; } blob - 988d2bcd20786c9e57b0a22d5009d482ff7259d8 blob + 9d5e547e17bd94286648f3a42a40c7e637c55821 --- control.c +++ control.c @@ -378,11 +378,10 @@ control_dispatch_imsg(int fd, int event, void *bula) main_playlist_jump(&c->iev, &imsg); break; case IMSG_CTL_MODE: - if (IMSG_DATA_SIZE(imsg) != sizeof(mode)) { + if (imsg_get_data(&imsg, &mode, sizeof(mode)) == -1) { log_warnx("%s: got wrong size", __func__); break; } - memcpy(&mode, imsg.data, sizeof(mode)); consume = new_mode(consume, mode.consume); repeat_all = new_mode(repeat_all, mode.repeat_all); repeat_one = new_mode(repeat_one, mode.repeat_one); @@ -413,11 +412,10 @@ control_dispatch_imsg(int fd, int event, void *bula) main_senderr(&c->iev, "locked"); break; } - if (IMSG_DATA_SIZE(imsg) != sizeof(off)) { + if (imsg_get_data(&imsg, &off, sizeof(off)) == -1) { main_senderr(&c->iev, "wrong size"); break; } - memcpy(&off, imsg.data, sizeof(off)); playlist_swap(&control_state.play, off); memset(&control_state.play, 0, sizeof(control_state.play)); @@ -430,11 +428,10 @@ control_dispatch_imsg(int fd, int event, void *bula) c->monitor = 1; break; case IMSG_CTL_SEEK: - if (IMSG_DATA_SIZE(imsg) != sizeof(seek)) { + if (imsg_get_data(&imsg, &seek, sizeof(seek)) == -1) { main_senderr(&c->iev, "wrong size"); break; } - memcpy(&seek, imsg.data, sizeof(seek)); main_seek(&seek); break; default: blob - 465d6a472c51cdb319d512a85f9bb2ee5280c1e7 blob + cb65f159136ceeccc6d056e7c9214215f8d47380 --- ctl.c +++ ctl.c @@ -215,12 +215,14 @@ load_files(struct parse_result *res, int *ret) static const char * imsg_strerror(struct imsg *imsg) { + struct ibuf ibuf; size_t datalen; const char *msg; - datalen = IMSG_DATA_SIZE(*imsg); - msg = imsg->data; - if (datalen == 0 || msg[datalen-1] != '\0') + if (imsg_get_ibuf(imsg, &ibuf) == -1 || + (datalen = ibuf_size(&ibuf)) == 0 || + (msg = ibuf_data(&ibuf)) == NULL || + msg[datalen - 1] != '\0') fatalx("malformed error message"); return msg; @@ -361,7 +363,6 @@ ctlaction(struct parse_result *res) struct imsg imsg; struct player_status ps; struct player_event ev; - size_t datalen; ssize_t n; int i, ret = 0, done = 1; @@ -497,8 +498,6 @@ ctlaction(struct parse_result *res) done = 1; break; } - - datalen = IMSG_DATA_SIZE(imsg); switch (res->action) { case ADD: @@ -515,13 +514,13 @@ ctlaction(struct parse_result *res) done = res->files[i] == NULL; break; case SHOW: - if (datalen == 0) { + if (imsg_get_len(&imsg) == 0) { done = 1; break; } - if (datalen != sizeof(ps)) + if (imsg_get_data(&imsg, &ps, sizeof(ps)) + == -1) fatalx("data size mismatch"); - memcpy(&ps, imsg.data, sizeof(ps)); if (ps.path[sizeof(ps.path) - 1] != '\0') fatalx("received corrupted data"); if (res->pretty) { @@ -543,9 +542,9 @@ ctlaction(struct parse_result *res) fatalx("invalid message %d", imsg.hdr.type); - if (datalen != sizeof(ps)) + if (imsg_get_data(&imsg, &ps, sizeof(ps)) + == -1) fatalx("data size mismatch"); - memcpy(&ps, imsg.data, sizeof(ps)); if (ps.path[sizeof(ps.path) - 1] != '\0') fatalx("received corrupted data"); @@ -571,10 +570,10 @@ ctlaction(struct parse_result *res) fatalx("invalid message %d", imsg.hdr.type); - if (datalen != sizeof(ev)) + if (imsg_get_data(&imsg, &ev, sizeof(ev)) + == -1) fatalx("data size mismatch"); - memcpy(&ev, imsg.data, sizeof(ev)); if (ev.event < 0 || ev.event > IMSG__LAST) fatalx("received corrupted data"); blob - 856bac10e35258f4711b55437794f4e815427be0 blob + 9270889eb3a67de7cfa82fc7a63d2f9e198ac5a5 --- player.c +++ player.c @@ -142,9 +142,8 @@ again: case IMSG_CTL_SEEK: if (s == NULL) break; - if (IMSG_DATA_SIZE(imsg) != sizeof(seek)) + if (imsg_get_data(&imsg, &seek, sizeof(seek)) == -1) fatalx("wrong size for seek ctl"); - memcpy(&seek, imsg.data, sizeof(seek)); if (seek.percent) *s = (double)seek.offset * (double)duration / 100.0; else blob - 8e365099a89783bf8a46797ee6c04fe3e0610a28 blob + 77c66abdeb8de47549a767232c6a8ff8264bdfdc --- web/web.c +++ web/web.c @@ -437,6 +437,7 @@ imsg_dispatch(int fd, int ev, void *d) static int off_found; char seekmsg[128]; struct imsg imsg; + struct ibuf ibuf; struct player_status ps; struct player_event event; const char *msg; @@ -467,8 +468,10 @@ imsg_dispatch(int fd, int ev, void *d) switch (imsg.hdr.type) { case IMSG_CTL_ERR: - msg = imsg.data; - if (datalen == 0 || msg[datalen - 1] != '\0') + if (imsg_get_ibuf(&imsg, &ibuf) == -1 || + (datalen = ibuf_size(&ibuf)) == 0 || + (msg = ibuf_data(&ibuf)) == NULL || + msg[datalen - 1] != '\0') fatalx("malformed error message"); log_warnx("error: %s", msg); break; @@ -480,9 +483,8 @@ imsg_dispatch(int fd, int ev, void *d) break; case IMSG_CTL_MONITOR: - if (datalen != sizeof(event)) + if (imsg_get_data(&imsg, &event, sizeof(event)) == -1) fatalx("corrupted IMSG_CTL_MONITOR"); - memcpy(&event, imsg.data, sizeof(event)); switch (event.event) { case IMSG_CTL_PLAY: case IMSG_CTL_PAUSE: @@ -522,7 +524,7 @@ imsg_dispatch(int fd, int ev, void *d) break; case IMSG_CTL_SHOW: - if (datalen == 0) { + if (imsg_get_len(&imsg) == 0) { if (playlist_tmp.len == 0) { dispatch_event("x:"); off = -1; @@ -535,9 +537,8 @@ imsg_dispatch(int fd, int ev, void *d) off_found = 0; break; } - if (datalen != sizeof(ps)) + if (imsg_get_data(&imsg, &ps, sizeof(ps)) == -1) fatalx("corrupted IMSG_CTL_SHOW"); - memcpy(&ps, imsg.data, sizeof(ps)); if (ps.path[sizeof(ps.path) - 1] != '\0') fatalx("corrupted IMSG_CTL_SHOW"); if (playlist_tmp.len == 0) @@ -551,9 +552,9 @@ imsg_dispatch(int fd, int ev, void *d) break; case IMSG_CTL_STATUS: - if (datalen != sizeof(player_status)) + if (imsg_get_data(&imsg, &player_status, + sizeof(player_status)) == -1) fatalx("corrupted IMSG_CTL_STATUS"); - memcpy(&player_status, imsg.data, datalen); if (player_status.path[sizeof(player_status.path) - 1] != '\0') fatalx("corrupted IMSG_CTL_STATUS");