Merge pull request #442 from h2o/kazuho/decode8
`ptls_decode8` for consistency
diff --git a/include/picotls.h b/include/picotls.h
index bbd9a6f..2d3c096 100644
--- a/include/picotls.h
+++ b/include/picotls.h
@@ -1163,6 +1163,7 @@
goto Exit; \
} while (0)
+int ptls_decode8(uint8_t *value, const uint8_t **src, const uint8_t *end);
int ptls_decode16(uint16_t *value, const uint8_t **src, const uint8_t *end);
int ptls_decode24(uint32_t *value, const uint8_t **src, const uint8_t *end);
int ptls_decode32(uint32_t *value, const uint8_t **src, const uint8_t *end);
diff --git a/lib/picotls.c b/lib/picotls.c
index ddb56fd..1c747b4 100644
--- a/lib/picotls.c
+++ b/lib/picotls.c
@@ -856,6 +856,14 @@
ptls_decode_assert_block_close((src), end); \
} while (0)
+int ptls_decode8(uint8_t *value, const uint8_t **src, const uint8_t *end)
+{
+ if (*src == end)
+ return PTLS_ALERT_DECODE_ERROR;
+ *value = *(*src)++;
+ return 0;
+}
+
int ptls_decode16(uint16_t *value, const uint8_t **src, const uint8_t *end)
{
if (end - *src < 2)
@@ -2288,10 +2296,14 @@
}
}
- /* legacy_compression_method */
- if (src == end || *src++ != 0) {
- ret = PTLS_ALERT_ILLEGAL_PARAMETER;
- goto Exit;
+ { /* legacy_compression_method */
+ uint8_t method;
+ if ((ret = ptls_decode8(&method, &src, end)) != 0)
+ goto Exit;
+ if (method != 0) {
+ ret = PTLS_ALERT_ILLEGAL_PARAMETER;
+ goto Exit;
+ }
}
if (sh->is_retry_request)
@@ -3112,12 +3124,10 @@
int ret = 0;
ptls_decode_open_block(*src, end, 2, {
- if (*src == end) {
- ret = PTLS_ALERT_DECODE_ERROR;
- goto Exit;
- }
do {
- uint8_t type = *(*src)++;
+ uint8_t type;
+ if ((ret = ptls_decode8(&type, src, end)) != 0)
+ goto Exit;
ptls_decode_open_block(*src, end, 2, {
switch (type) {
case PTLS_SERVER_NAME_TYPE_HOSTNAME:
@@ -3471,11 +3481,10 @@
ch->cookie.ch1_hash = ptls_iovec_init(src, end - src);
src = end;
});
- if (src == end) {
- ret = PTLS_ALERT_DECODE_ERROR;
+ uint8_t sent_key_share;
+ if ((ret = ptls_decode8(&sent_key_share, &src, end)) != 0)
goto Exit;
- }
- switch (*src++) {
+ switch (sent_key_share) {
case 0:
assert(!ch->cookie.sent_key_share);
break;
@@ -3530,14 +3539,13 @@
} break;
case PTLS_EXTENSION_TYPE_PSK_KEY_EXCHANGE_MODES:
ptls_decode_block(src, end, 1, {
- if (src == end) {
- ret = PTLS_ALERT_DECODE_ERROR;
- goto Exit;
- }
- for (; src != end; ++src) {
- if (*src < sizeof(ch->psk.ke_modes) * 8)
- ch->psk.ke_modes |= 1u << *src;
- }
+ do {
+ uint8_t mode;
+ if ((ret = ptls_decode8(&mode, &src, end)) != 0)
+ goto Exit;
+ if (mode < sizeof(ch->psk.ke_modes) * 8)
+ ch->psk.ke_modes |= 1u << mode;
+ } while (src != end);
});
break;
case PTLS_EXTENSION_TYPE_EARLY_DATA: