|
|
|
|
@ -68,7 +68,7 @@ int mf_encode(const struct mf_message* m, uint8_t* p, size_t cap) {
|
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|
memset(p, 0, MF_WIRE_HEADER); |
|
|
|
|
p[0] = 3; p[1] = m->kind; p[2] = m->command; p[3] = (uint8_t)m->status; p[4] = (uint8_t)(m->status >> 8); |
|
|
|
|
p[0] = MF_PROTOCOL_VERSION; p[1] = m->kind; p[2] = m->command; p[3] = (uint8_t)m->status; p[4] = (uint8_t)(m->status >> 8); |
|
|
|
|
mf_put64(p + 5, m->request_id); mf_put64(p + 13, m->owner); mf_put64(p + 21, m->offset); |
|
|
|
|
mf_put64(p + 29, m->size); mf_put64(p + 37, m->cursor); |
|
|
|
|
memcpy(p + 45, m->version, 16); memcpy(p + 61, m->upload, 16); memcpy(p + 77, m->hash, 32); |
|
|
|
|
@ -84,7 +84,7 @@ int mf_decode(const uint8_t* p, size_t n, struct mf_message* m) {
|
|
|
|
|
if (!p || !m || n < MF_WIRE_HEADER) goto bad; |
|
|
|
|
size_t a = p[119] | ((size_t)p[120] << 8), b = p[121] | ((size_t)p[122] << 8); |
|
|
|
|
size_t d = p[123] | ((size_t)p[124] << 8); |
|
|
|
|
if (p[0] != 3 || (p[1] != MF_REQUEST && p[1] != MF_RESPONSE) || p[2] < MF_LIST || p[2] > MF_QUOTA || |
|
|
|
|
if (p[0] != MF_PROTOCOL_VERSION || (p[1] != MF_REQUEST && p[1] != MF_RESPONSE) || p[2] < MF_LIST || p[2] > MF_QUOTA || |
|
|
|
|
a > MF_PATH_MAX || b > MF_PATH_MAX || d > MF_BLOCK_SIZE || n != MF_WIRE_HEADER + a + b + d || |
|
|
|
|
memchr(p + MF_WIRE_HEADER, 0, a + b) || p[118] > 1) goto bad; |
|
|
|
|
memset(m, 0, sizeof(*m)); |
|
|
|
|
|