diff options
Diffstat (limited to 'libterminput_unmarshal_state.c')
-rw-r--r-- | libterminput_unmarshal_state.c | 27 |
1 files changed, 26 insertions, 1 deletions
diff --git a/libterminput_unmarshal_state.c b/libterminput_unmarshal_state.c index fd1d6db..a41c4fe 100644 --- a/libterminput_unmarshal_state.c +++ b/libterminput_unmarshal_state.c @@ -5,5 +5,30 @@ int libterminput_unmarshal_state(struct libterminput_unmarshaller *how, struct libterminput_state *what) /* TODO test */ { - return how->load(how, what, sizeof(*what)); + if (how->load(how, what, sizeof(*what))) + return -1; + if (what->inited < 0 || what->inited > 1 || + what->bracketed_paste > 1U || + what->meta > 2U || + what->n >= sizeof(what->partial) || + what->npartial >= sizeof(what->partial) || + what->stored_tail > what->stored_head || + what->stored_head > sizeof(what->stored) || + what->unused_bits) + goto einval; + switch (what->mouse_tracking) { + case 0: + case 1: + case 2: + case 3: + case 6: + break; + default: + goto einval; + } + return 0; + +einval: + errno = EINVAL; + return -1; } |