libseat: Handle SERVER_ERROR correctly

The connection buffer position was erroneously rewinded before reading
the protocol message when the message was a SERVER_ERROR.
This commit is contained in:
Kenny Levinsen 2020-09-07 23:33:50 +02:00
parent 1867f29d42
commit 047d8b284c

View file

@ -165,14 +165,13 @@ static size_t read_header(struct backend_seatd *backend, uint16_t expected_opcod
return SIZE_MAX; return SIZE_MAX;
} }
if (header.opcode != expected_opcode) { if (header.opcode != expected_opcode) {
connection_restore(&backend->connection, sizeof header);
struct proto_server_error msg; struct proto_server_error msg;
if (header.opcode != SERVER_ERROR) { if (header.opcode != SERVER_ERROR) {
log_errorf("Unexpected response: expected opcode %d, received opcode %d", log_errorf("Unexpected response: expected opcode %d, received opcode %d",
expected_opcode, header.opcode); expected_opcode, header.opcode);
set_error(backend); set_error(backend);
errno = EBADMSG; errno = EBADMSG;
} else if (conn_get(backend, &msg, sizeof msg) == -1) { } else if (header.size != sizeof msg || conn_get(backend, &msg, sizeof msg) == -1) {
set_error(backend); set_error(backend);
errno = EBADMSG; errno = EBADMSG;
} else { } else {