@@ -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
191205int
0 commit comments