Skip to content

Commit 157f7c7

Browse files
committed
BPF: Address review comments
1 parent 6ae0742 commit 157f7c7

4 files changed

Lines changed: 36 additions & 12 deletions

File tree

‎src/bpf-bsd.c‎

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
#include "bpf.h"
4141
#include "logerr.h"
4242

43-
const char *bpf_name = "Berkley Packet Filter";
43+
const char *bpf_name = "Berkeley Packet Filter";
4444

4545
struct bpf *
4646
bpf_open(const struct interface *ifp,
@@ -138,7 +138,8 @@ bpf_read(struct bpf *bpf, void *data, size_t len)
138138
{
139139
ssize_t bytes;
140140
struct bpf_hdr packet;
141-
const char *payload;
141+
size_t hdr_max;
142+
const uint8_t *payload;
142143

143144
bpf->bpf_flags &= ~BPF_EOF;
144145
for (;;) {
@@ -159,11 +160,22 @@ bpf_read(struct bpf *bpf, void *data, size_t len)
159160
bpf->bpf_pos = 0;
160161
}
161162
bytes = -1;
162-
payload = (const char *)bpf->bpf_buffer + bpf->bpf_pos;
163+
if (bpf->bpf_pos + sizeof(packet) > bpf->bpf_len) {
164+
errno = EINVAL;
165+
goto err;
166+
}
167+
payload = (const uint8_t *)bpf->bpf_buffer + bpf->bpf_pos;
163168
memcpy(&packet, payload, sizeof(packet));
164-
if (bpf->bpf_pos + packet.bh_caplen + packet.bh_hdrlen >
165-
bpf->bpf_len)
166-
goto next; /* Packet beyond buffer, drop. */
169+
hdr_max = SIZE_MAX - packet.bh_caplen;
170+
if (packet.bh_hdrlen > hdr_max) {
171+
errno = EOVERFLOW;
172+
goto err;
173+
}
174+
if (packet.bh_hdrlen + packet.bh_caplen >
175+
bpf->bpf_len - bpf->bpf_pos) {
176+
errno = EBADMSG;
177+
goto err;
178+
}
167179
payload += packet.bh_hdrlen;
168180
if (packet.bh_caplen > len)
169181
bytes = (ssize_t)len;
@@ -174,7 +186,6 @@ bpf_read(struct bpf *bpf, void *data, size_t len)
174186
else
175187
bpf->bpf_flags &= ~BPF_BCAST;
176188
memcpy(data, payload, (size_t)bytes);
177-
next:
178189
bpf->bpf_pos += BPF_WORDALIGN(
179190
packet.bh_hdrlen + packet.bh_caplen);
180191
if (bpf->bpf_pos >= bpf->bpf_len) {
@@ -186,6 +197,11 @@ bpf_read(struct bpf *bpf, void *data, size_t len)
186197
}
187198

188199
/* NOTREACHED */
200+
201+
err:
202+
bpf->bpf_len = bpf->bpf_pos = 0;
203+
bpf->bpf_flags |= BPF_EOF;
204+
return -1;
189205
}
190206

191207
int

‎src/bpf-linux.c‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ bpf_open(const struct interface *ifp,
6464
return NULL;
6565
bpf->bpf_ifp = ifp;
6666
bpf->bpf_flags = BPF_EOF;
67+
bpf->bpf_fd = -1;
6768

6869
/* Allocate a suitably large buffer for a single packet. */
6970
bpf->bpf_size = ETH_FRAME_LEN;

‎src/bpf-pcap.c‎

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@
4747

4848
#define ETH_MTU 1500
4949

50-
const char *bpf_name = "Berkley Packet Filter (libpcap)";
50+
const char *bpf_name = "Berkeley Packet Filter (libpcap)";
5151

5252
struct bpf *
5353
bpf_open(const struct interface *ifp,
@@ -124,6 +124,8 @@ bpf_read(struct bpf *bpf, void *data, size_t len)
124124

125125
err = pcap_next_ex(bpf->bpf_handle, &pkt_header, &pkt_data);
126126

127+
if (err == 0)
128+
return 0;
127129
if (err < 0)
128130
return -1;
129131

@@ -133,6 +135,11 @@ bpf_read(struct bpf *bpf, void *data, size_t len)
133135
cap_len = len;
134136
memcpy(data, pkt_data, cap_len);
135137

138+
if (bpf_frame_bcast(bpf->bpf_ifp, pkt_data) == 0)
139+
bpf->bpf_flags |= BPF_BCAST;
140+
else
141+
bpf->bpf_flags &= ~BPF_BCAST;
142+
136143
return (ssize_t)cap_len;
137144
}
138145

‎src/bpf.c‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -363,9 +363,9 @@ bpf_arp_rw(const struct bpf *bpf, const struct in_addr *ia, bool recv)
363363
bp++;
364364

365365
len = (unsigned int)(bp - buf);
366-
if (recv) return bpf_setfilter(bpf, buf, len);
366+
if (recv)
367+
return bpf_setfilter(bpf, buf, len);
367368
return bpf_setwfilter(bpf, buf, len);
368-
return -1;
369369
}
370370

371371
int
@@ -441,7 +441,7 @@ static const struct bpf_insn bpf_bootp_write[] = {
441441
BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, (BOOTPC << 16) + BOOTPS, 1, 0),
442442
BPF_STMT(BPF_RET + BPF_K, 0),
443443
};
444-
#define BPF_BOOTP_WRITE_LEN __arraycount(bpf_bootp_write)
444+
#define BPF_BOOTP_WRITE_LEN __arraycount(bpf_bootp_write)
445445

446446
#define BPF_BOOTP_CHADDR_LEN ((BOOTP_CHADDR_LEN / 4) * 3)
447447
#define BPF_BOOTP_XID_LEN 4 /* BOUND check is 4 instructions */
@@ -503,7 +503,7 @@ int
503503
bpf_filter_bootp(const struct bpf *bpf, __unused const struct in_addr *ia)
504504
{
505505
if (bpf_bootp_rw(bpf, true) == -1)
506-
return -1;
506+
return -1;
507507
if (bpf_bootp_rw(bpf, false) == -1 && errno != ENOSYS)
508508
return -1;
509509
if (bpf_lock(bpf) == -1 && errno != ENOSYS)

0 commit comments

Comments
 (0)