summaryrefslogtreecommitdiff
path: root/pkg/libfido2/patch/0003-io-avoid-use-of-packed-struct.patch
diff options
context:
space:
mode:
authorMichael Forney <mforney@mforney.org>2020-04-15 15:48:58 -0700
committerMichael Forney <mforney@mforney.org>2020-04-15 19:07:19 -0700
commit73f62cd40a9db1f012d2e95b8f7a77d95845f80e (patch)
tree397dad316397dbdd4094901e75b43ae904be5886 /pkg/libfido2/patch/0003-io-avoid-use-of-packed-struct.patch
parent60636d3b1a15c00a6488ed2287499a0ffc0b0c16 (diff)
libfido2: Update to 1.4.0
Diffstat (limited to 'pkg/libfido2/patch/0003-io-avoid-use-of-packed-struct.patch')
-rw-r--r--pkg/libfido2/patch/0003-io-avoid-use-of-packed-struct.patch184
1 files changed, 93 insertions, 91 deletions
diff --git a/pkg/libfido2/patch/0003-io-avoid-use-of-packed-struct.patch b/pkg/libfido2/patch/0003-io-avoid-use-of-packed-struct.patch
index ec44ca5d..c2c4b27b 100644
--- a/pkg/libfido2/patch/0003-io-avoid-use-of-packed-struct.patch
+++ b/pkg/libfido2/patch/0003-io-avoid-use-of-packed-struct.patch
@@ -1,14 +1,14 @@
-From d72b3ec7c3a4afbc72c50379a65d5c4f2f7c5684 Mon Sep 17 00:00:00 2001
+From 4c52200f4480b8f0491d79df9934918762376d81 Mon Sep 17 00:00:00 2001
From: Michael Forney <mforney@mforney.org>
Date: Tue, 26 Nov 2019 18:52:13 -0800
Subject: [PATCH] io: avoid use of packed struct
---
- src/io.c | 128 +++++++++++++++++++++++++++----------------------------
- 1 file changed, 62 insertions(+), 66 deletions(-)
+ src/io.c | 143 ++++++++++++++++++++++++++-----------------------------
+ 1 file changed, 67 insertions(+), 76 deletions(-)
diff --git a/src/io.c b/src/io.c
-index aa88720..caff99d 100644
+index af2f49a..9e6af3d 100644
--- a/src/io.c
+++ b/src/io.c
@@ -9,25 +9,19 @@
@@ -50,40 +50,56 @@ index aa88720..caff99d 100644
#ifndef MIN
#define MIN(x, y) ((x) > (y) ? (y) : (x))
-@@ -36,22 +30,19 @@ struct frame {
- static size_t
- tx_preamble(fido_dev_t *d, uint8_t cmd, const void *buf, size_t count)
+@@ -36,14 +30,11 @@ struct frame {
+ static int
+ tx_empty(fido_dev_t *d, uint8_t cmd)
{
- struct frame *fp;
-- unsigned char pkt[sizeof(*fp) + 1];
-- int n;
+- unsigned char pkt[sizeof(*fp) + 1];
+- int n;
+ uint8_t pkt[1 + CTAP_RPT_SIZE] = {0};
+ int n;
- if (d->io.write == NULL || (cmd & 0x80) == 0)
- return (0);
+- memset(&pkt, 0, sizeof(pkt));
+- fp = (struct frame *)(pkt + 1);
+- fp->cid = d->cid;
+- fp->body.init.cmd = CTAP_FRAME_INIT | cmd;
++ memcpy(pkt + 1 + CID, &d->cid, 4);
++ pkt[1 + INIT_CMD] = CTAP_FRAME_INIT | cmd;
+ n = d->io.write(d->io_handle, pkt, sizeof(pkt));
+ if (n < 0 || (size_t)n != sizeof(pkt))
+@@ -55,18 +46,15 @@ tx_empty(fido_dev_t *d, uint8_t cmd)
+ static size_t
+ tx_preamble(fido_dev_t *d, uint8_t cmd, const void *buf, size_t count)
+ {
+- struct frame *fp;
+- unsigned char pkt[sizeof(*fp) + 1];
+- int n;
+-
- memset(&pkt, 0, sizeof(pkt));
- fp = (struct frame *)(pkt + 1);
- fp->cid = d->cid;
-- fp->body.init.cmd = 0x80 | cmd;
+- fp->body.init.cmd = CTAP_FRAME_INIT | cmd;
- fp->body.init.bcnth = (count >> 8) & 0xff;
- fp->body.init.bcntl = count & 0xff;
- count = MIN(count, sizeof(fp->body.init.data));
-+ memcpy(&pkt[1], &d->cid, 4);
-+ pkt[1 + INIT_CMD] = 0x80 | cmd;
+- memcpy(&fp->body.init.data, buf, count);
++ uint8_t pkt[1 + CTAP_RPT_SIZE] = {0};
++ int n;
++
++ memcpy(pkt + 1 + CID, &d->cid, 4);
++ pkt[1 + INIT_CMD] = CTAP_FRAME_INIT | cmd;
+ pkt[1 + INIT_BCNTH] = (count >> 8) & 0xff;
+ pkt[1 + INIT_BCNTL] = count & 0xff;
+ count = MIN(count, CTAP_RPT_SIZE - INIT_DATA);
- if (count)
-- memcpy(&fp->body.init.data, buf, count);
-+ memcpy(&pkt[1 + INIT_DATA], buf, count);
++ memcpy(pkt + 1 + INIT_DATA, buf, count);
n = d->io.write(d->io_handle, pkt, sizeof(pkt));
if (n < 0 || (size_t)n != sizeof(pkt))
-@@ -63,19 +54,16 @@ tx_preamble(fido_dev_t *d, uint8_t cmd, const void *buf, size_t count)
+@@ -78,16 +66,13 @@ tx_preamble(fido_dev_t *d, uint8_t cmd, const void *buf, size_t count)
static size_t
- tx_frame(fido_dev_t *d, int seq, const void *buf, size_t count)
+ tx_frame(fido_dev_t *d, uint8_t seq, const void *buf, size_t count)
{
- struct frame *fp;
- unsigned char pkt[sizeof(*fp) + 1];
@@ -91,23 +107,20 @@ index aa88720..caff99d 100644
+ uint8_t pkt[1 + CTAP_RPT_SIZE] = {0};
+ int n;
- if (d->io.write == NULL || seq < 0 || seq > UINT8_MAX)
- return (0);
-
- memset(&pkt, 0, sizeof(pkt));
- fp = (struct frame *)(pkt + 1);
- fp->cid = d->cid;
-- fp->body.cont.seq = (uint8_t)seq;
+- fp->body.cont.seq = seq;
- count = MIN(count, sizeof(fp->body.cont.data));
- memcpy(&fp->body.cont.data, buf, count);
-+ memcpy(&pkt[1], &d->cid, 4);
++ memcpy(pkt + 1 + CID, &d->cid, 4);
+ pkt[1 + CONT_SEQ] = seq;
+ count = MIN(count, CTAP_RPT_SIZE - CONT_DATA);
-+ memcpy(&pkt[1 + CONT_DATA], buf, count);
++ memcpy(pkt + 1 + CONT_DATA, buf, count);
n = d->io.write(d->io_handle, pkt, sizeof(pkt));
if (n < 0 || (size_t)n != sizeof(pkt))
-@@ -123,31 +111,34 @@ fido_tx(fido_dev_t *d, uint8_t cmd, const void *buf, size_t count)
+@@ -142,39 +127,42 @@ fido_tx(fido_dev_t *d, uint8_t cmd, const void *buf, size_t count)
}
static int
@@ -116,9 +129,6 @@ index aa88720..caff99d 100644
{
int n;
- if (d->io.read == NULL)
- return (-1);
-
- n = d->io.read(d->io_handle, (unsigned char *)fp, sizeof(*fp), ms);
- if (n < 0 || (size_t)n != sizeof(*fp))
+ n = d->io.read(d->io_handle, (unsigned char *)fp, CTAP_RPT_SIZE, ms);
@@ -129,8 +139,8 @@ index aa88720..caff99d 100644
}
static int
--rx_preamble(fido_dev_t *d, struct frame *fp, int ms)
-+rx_preamble(fido_dev_t *d, uint8_t *fp, int ms)
+-rx_preamble(fido_dev_t *d, uint8_t cmd, struct frame *fp, int ms)
++rx_preamble(fido_dev_t *d, uint8_t cmd, uint8_t *fp, int ms)
{
+ uint32_t cid;
+
@@ -147,79 +157,71 @@ index aa88720..caff99d 100644
+ } while (cid == d->cid &&
+ fp[INIT_CMD] == (CTAP_FRAME_INIT | CTAP_KEEPALIVE));
- return (0);
- }
-@@ -155,7 +146,8 @@ rx_preamble(fido_dev_t *d, struct frame *fp, int ms)
- int
- fido_rx(fido_dev_t *d, uint8_t cmd, void *buf, size_t count, int ms)
+ fido_log_debug("%s: initiation frame at %p", __func__, (void *)fp);
+- fido_log_xxd(fp, sizeof(*fp));
++ fido_log_xxd(fp, CTAP_RPT_SIZE);
+
+ #ifdef FIDO_FUZZ
+- fp->body.init.cmd = (CTAP_FRAME_INIT | cmd);
++ fp[INIT_CMD] = (CTAP_FRAME_INIT | cmd);
+ #endif
+
+- if (fp->cid != d->cid || fp->body.init.cmd != (CTAP_FRAME_INIT | cmd)) {
++ if (cid != d->cid || fp[INIT_CMD] != (CTAP_FRAME_INIT | cmd)) {
+ fido_log_debug("%s: cid (0x%x, 0x%x), cmd (0x%02x, 0x%02x)",
+- __func__, fp->cid, d->cid, fp->body.init.cmd, cmd);
++ __func__, cid, d->cid, fp[INIT_CMD], cmd);
+ return (-1);
+ }
+
+@@ -184,15 +172,16 @@ rx_preamble(fido_dev_t *d, uint8_t cmd, struct frame *fp, int ms)
+ static int
+ rx(fido_dev_t *d, uint8_t cmd, unsigned char *buf, size_t count, int ms)
{
-- struct frame f;
+- struct frame f;
+- uint16_t r, payload_len;
+ uint8_t f[CTAP_RPT_SIZE];
+ uint32_t cid;
- uint16_t r;
- uint16_t flen;
- int seq;
-@@ -166,7 +158,7 @@ fido_rx(fido_dev_t *d, uint8_t cmd, void *buf, size_t count, int ms)
- return (-1);
- }
++ uint16_t r, payload_len;
-- if (rx_preamble(d, &f, ms) < 0) {
-+ if (rx_preamble(d, f, ms) < 0) {
+- if (rx_preamble(d, cmd, &f, ms) < 0) {
++ if (rx_preamble(d, cmd, f, ms) < 0) {
fido_log_debug("%s: rx_preamble", __func__);
return (-1);
}
-@@ -175,34 +167,36 @@ fido_rx(fido_dev_t *d, uint8_t cmd, void *buf, size_t count, int ms)
- (void *)&f, sizeof(f));
- fido_log_xxd(&f, sizeof(f));
-+ memcpy(&cid, &f[CID], 4);
-+
- #ifdef FIDO_FUZZ
-- f.cid = d->cid;
-- f.body.init.cmd = cmd;
-+ cid = d->cid;
-+ f[INIT_CMD] = cmd;
- #endif
+- payload_len = (f.body.init.bcnth << 8) | f.body.init.bcntl;
++ payload_len = (f[INIT_BCNTH] << 8) | f[INIT_BCNTL];
+ fido_log_debug("%s: payload_len=%zu", __func__, (size_t)payload_len);
-- if (f.cid != d->cid || f.body.init.cmd != cmd) {
-+ if (cid != d->cid || f[INIT_CMD] != cmd) {
- fido_log_debug("%s: cid (0x%x, 0x%x), cmd (0x%02x, 0x%02x)",
-- __func__, f.cid, d->cid, f.body.init.cmd, cmd);
-+ __func__, cid, d->cid, f[INIT_CMD], cmd);
+ if (count < (size_t)payload_len) {
+@@ -200,16 +189,16 @@ rx(fido_dev_t *d, uint8_t cmd, unsigned char *buf, size_t count, int ms)
return (-1);
}
-- flen = (f.body.init.bcnth << 8) | f.body.init.bcntl;
-+ flen = (f[INIT_BCNTH] << 8) | f[INIT_BCNTL];
- if (count < (size_t)flen) {
- fido_log_debug("%s: count < flen (%zu, %zu)", __func__, count,
- (size_t)flen);
- return (-1);
- }
-- if (flen < sizeof(f.body.init.data)) {
-- memcpy(buf, f.body.init.data, flen);
-+ if (flen < CTAP_RPT_SIZE - INIT_DATA) {
-+ memcpy(buf, &f[INIT_DATA], flen);
- return (flen);
+- if (payload_len < sizeof(f.body.init.data)) {
+- memcpy(buf, f.body.init.data, payload_len);
++ if (payload_len < CTAP_RPT_SIZE - INIT_DATA) {
++ memcpy(buf, f + INIT_DATA, payload_len);
+ return (payload_len);
}
- memcpy(buf, f.body.init.data, sizeof(f.body.init.data));
- r = sizeof(f.body.init.data);
-+ memcpy(buf, &f[INIT_DATA], CTAP_RPT_SIZE - INIT_DATA);
++ memcpy(buf, f + INIT_DATA, CTAP_RPT_SIZE - INIT_DATA);
+ r = CTAP_RPT_SIZE - INIT_DATA;
- seq = 0;
- while ((size_t)r < flen) {
+ for (int seq = 0; (size_t)r < payload_len; seq++) {
- if (rx_frame(d, &f, ms) < 0) {
+ if (rx_frame(d, f, ms) < 0) {
fido_log_debug("%s: rx_frame", __func__);
return (-1);
}
-@@ -211,24 +205,26 @@ fido_rx(fido_dev_t *d, uint8_t cmd, void *buf, size_t count, int ms)
- __func__, (void *)&f, sizeof(f));
+@@ -218,23 +207,25 @@ rx(fido_dev_t *d, uint8_t cmd, unsigned char *buf, size_t count, int ms)
+ (void *)&f);
fido_log_xxd(&f, sizeof(f));
-+ memcpy(&cid, &f[CID], 4);
++ memcpy(&cid, f + CID, 4);
+
#ifdef FIDO_FUZZ
- f.cid = d->cid;
@@ -228,28 +230,28 @@ index aa88720..caff99d 100644
+ f[CONT_SEQ] = seq;
#endif
-- if (f.cid != d->cid || f.body.cont.seq != seq++) {
-+ if (cid != d->cid || f[CONT_SEQ] != seq++) {
+- if (f.cid != d->cid || f.body.cont.seq != seq) {
++ if (cid != d->cid || f[CONT_SEQ] != seq) {
fido_log_debug("%s: cid (0x%x, 0x%x), seq (%d, %d)",
- __func__, f.cid, d->cid, f.body.cont.seq, seq);
+ __func__, cid, d->cid, f[CONT_SEQ], seq);
return (-1);
}
- uint8_t *p = (uint8_t *)buf + r;
-
-- if ((size_t)(flen - r) > sizeof(f.body.cont.data)) {
-- memcpy(p, f.body.cont.data, sizeof(f.body.cont.data));
+- if ((size_t)(payload_len - r) > sizeof(f.body.cont.data)) {
+- memcpy(buf + r, f.body.cont.data,
+- sizeof(f.body.cont.data));
- r += sizeof(f.body.cont.data);
-+ if ((size_t)(flen - r) > CTAP_RPT_SIZE - CONT_DATA) {
-+ memcpy(p, &f[CONT_DATA], CTAP_RPT_SIZE - CONT_DATA);
++ if ((size_t)(payload_len - r) > CTAP_RPT_SIZE - CONT_DATA) {
++ memcpy(buf + r, f + CONT_DATA,
++ CTAP_RPT_SIZE - CONT_DATA);
+ r += CTAP_RPT_SIZE - CONT_DATA;
} else {
-- memcpy(p, f.body.cont.data, flen - r);
-+ memcpy(p, &f[CONT_DATA], flen - r);
- r += (flen - r); /* break */
+- memcpy(buf + r, f.body.cont.data, payload_len - r);
++ memcpy(buf + r, f + CONT_DATA, payload_len - r);
+ r += (payload_len - r); /* break */
}
}
--
-2.24.0
+2.26.1