Skip to content

Commit 4a4584c

Browse files
committed
BPF: Address review comments
1 parent 6ae0742 commit 4a4584c

4 files changed

Lines changed: 23 additions & 7 deletions

File tree

‎src/bpf-bsd.c‎

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ 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+
const uint8_t *payload;
142142

143143
bpf->bpf_flags &= ~BPF_EOF;
144144
for (;;) {
@@ -159,11 +159,21 @@ bpf_read(struct bpf *bpf, void *data, size_t len)
159159
bpf->bpf_pos = 0;
160160
}
161161
bytes = -1;
162-
payload = (const char *)bpf->bpf_buffer + bpf->bpf_pos;
162+
if (bpf->bpf_pos + sizeof(packet) > bpf->bpf_len) {
163+
errno = EINVAL;
164+
goto err;
165+
}
166+
payload = (const uint8_t *)bpf->bpf_buffer + bpf->bpf_pos;
163167
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. */
168+
if (packet.bh_hdrlen > SIZE_MAX - packet.bh_caplen) {
169+
errno = EOVERFLOW;
170+
goto err;
171+
}
172+
if (packet.bh_hdrlen + packet.bh_caplen >
173+
bpf->bpf_len - bpf->bpf_pos) {
174+
errno = EBADMSG;
175+
goto err;
176+
}
167177
payload += packet.bh_hdrlen;
168178
if (packet.bh_caplen > len)
169179
bytes = (ssize_t)len;
@@ -174,7 +184,6 @@ bpf_read(struct bpf *bpf, void *data, size_t len)
174184
else
175185
bpf->bpf_flags &= ~BPF_BCAST;
176186
memcpy(data, payload, (size_t)bytes);
177-
next:
178187
bpf->bpf_pos += BPF_WORDALIGN(
179188
packet.bh_hdrlen + packet.bh_caplen);
180189
if (bpf->bpf_pos >= bpf->bpf_len) {
@@ -186,6 +195,11 @@ bpf_read(struct bpf *bpf, void *data, size_t len)
186195
}
187196

188197
/* NOTREACHED */
198+
199+
err:
200+
bpf->bpf_len = bpf->bpf_pos = 0;
201+
bpf->bpf_flags |= BPF_EOF;
202+
return -1;
189203
}
190204

191205
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: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

‎src/bpf.c‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -365,7 +365,6 @@ bpf_arp_rw(const struct bpf *bpf, const struct in_addr *ia, bool recv)
365365
len = (unsigned int)(bp - buf);
366366
if (recv) return bpf_setfilter(bpf, buf, len);
367367
return bpf_setwfilter(bpf, buf, len);
368-
return -1;
369368
}
370369

371370
int

0 commit comments

Comments
 (0)