23
23
extern int fuzzing_netdev (gnrc_netif_t * );
24
24
extern void fuzzing_netdev_wait (void );
25
25
26
+ /* buffer sizes for reading from an fd */
27
+ #define FUZZING_BSIZE 1024
28
+ #define FUZZING_BSTEP 128
29
+
26
30
/* used by gnrc_pktbuf_malloc to exit on free */
27
31
gnrc_pktsnip_t * gnrc_pktbuf_fuzzptr = NULL ;
28
32
@@ -48,40 +52,22 @@ fuzzing_init(ipv6_addr_t *addr, unsigned pfx_len)
48
52
int
49
53
fuzzing_read_packet (int fd , gnrc_pktsnip_t * pkt )
50
54
{
51
- ssize_t r ;
52
- size_t csiz , rsiz ;
55
+ size_t rsiz ;
53
56
54
57
/* can only be called once currently */
55
58
assert (gnrc_pktbuf_fuzzptr == NULL );
56
59
57
- csiz = 0 ;
58
- rsiz = FUZZING_BSIZE ;
59
- if (gnrc_pktbuf_realloc_data (pkt , rsiz )) {
60
- return - ENOMEM ;
61
- }
62
-
63
- while ((r = read (fd , & ((char * )pkt -> data )[csiz ], rsiz )) > 0 ) {
64
- assert ((size_t )r <= rsiz );
65
-
66
- csiz += r ;
67
- rsiz -= r ;
68
-
69
- if (rsiz == 0 ) {
70
- if (gnrc_pktbuf_realloc_data (pkt , csiz + FUZZING_BSTEP )) {
71
- return - ENOMEM ;
72
- }
73
- rsiz += FUZZING_BSTEP ;
74
- }
75
- }
76
- if (r == -1 ) {
60
+ uint8_t * input = fuzzing_read_bytes (fd , & rsiz );
61
+ if (input == NULL ) {
77
62
return - errno ;
78
63
}
79
64
80
- /* shrink packet to actual size */
81
- if (gnrc_pktbuf_realloc_data (pkt , csiz )) {
65
+ if (gnrc_pktbuf_realloc_data (pkt , rsiz )) {
82
66
return - ENOMEM ;
83
67
}
84
68
69
+ memcpy (pkt -> data , input , rsiz );
70
+
85
71
gnrc_pktbuf_fuzzptr = pkt ;
86
72
return 0 ;
87
73
}
@@ -116,7 +102,7 @@ fuzzing_read_bytes(int fd, size_t *size)
116
102
return NULL ;
117
103
}
118
104
119
- /* shrink packet to actual size */
105
+ /* shrink buffer to actual size */
120
106
if ((buffer = realloc (buffer , csiz )) == NULL ) {
121
107
return NULL ;
122
108
}
0 commit comments