xref: /aosp_15_r20/external/AFLplusplus/src/afl-fuzz-statsd.c (revision 08b48e0b10e97b33e7b60c5b6e2243bd915777f2)
1*08b48e0bSAndroid Build Coastguard Worker /*
2*08b48e0bSAndroid Build Coastguard Worker  * This implements rpc.statsd support, see docs/rpc_statsd.md
3*08b48e0bSAndroid Build Coastguard Worker  *
4*08b48e0bSAndroid Build Coastguard Worker  */
5*08b48e0bSAndroid Build Coastguard Worker 
6*08b48e0bSAndroid Build Coastguard Worker #include <stdio.h>
7*08b48e0bSAndroid Build Coastguard Worker #include <stdlib.h>
8*08b48e0bSAndroid Build Coastguard Worker #include <sys/socket.h>
9*08b48e0bSAndroid Build Coastguard Worker #include <arpa/inet.h>
10*08b48e0bSAndroid Build Coastguard Worker #include <string.h>
11*08b48e0bSAndroid Build Coastguard Worker #include <sys/types.h>
12*08b48e0bSAndroid Build Coastguard Worker #include <netdb.h>
13*08b48e0bSAndroid Build Coastguard Worker #include <unistd.h>
14*08b48e0bSAndroid Build Coastguard Worker #include "afl-fuzz.h"
15*08b48e0bSAndroid Build Coastguard Worker 
16*08b48e0bSAndroid Build Coastguard Worker #define MAX_STATSD_PACKET_SIZE 4096
17*08b48e0bSAndroid Build Coastguard Worker #define MAX_TAG_LEN 200
18*08b48e0bSAndroid Build Coastguard Worker #define METRIC_PREFIX "fuzzing"
19*08b48e0bSAndroid Build Coastguard Worker 
20*08b48e0bSAndroid Build Coastguard Worker /* Tags format for metrics
21*08b48e0bSAndroid Build Coastguard Worker   DogStatsD:
22*08b48e0bSAndroid Build Coastguard Worker   metric.name:<value>|<type>|#key:value,key2:value2
23*08b48e0bSAndroid Build Coastguard Worker 
24*08b48e0bSAndroid Build Coastguard Worker   InfluxDB
25*08b48e0bSAndroid Build Coastguard Worker   metric.name,key=value,key2=value2:<value>|<type>
26*08b48e0bSAndroid Build Coastguard Worker 
27*08b48e0bSAndroid Build Coastguard Worker   Librato
28*08b48e0bSAndroid Build Coastguard Worker   metric.name#key=value,key2=value2:<value>|<type>
29*08b48e0bSAndroid Build Coastguard Worker 
30*08b48e0bSAndroid Build Coastguard Worker   SignalFX
31*08b48e0bSAndroid Build Coastguard Worker   metric.name[key=value,key2=value2]:<value>|<type>
32*08b48e0bSAndroid Build Coastguard Worker 
33*08b48e0bSAndroid Build Coastguard Worker */
34*08b48e0bSAndroid Build Coastguard Worker 
35*08b48e0bSAndroid Build Coastguard Worker // after the whole metric.
36*08b48e0bSAndroid Build Coastguard Worker #define DOGSTATSD_TAGS_FORMAT "|#banner:%s,afl_version:%s"
37*08b48e0bSAndroid Build Coastguard Worker 
38*08b48e0bSAndroid Build Coastguard Worker // just after the metric name.
39*08b48e0bSAndroid Build Coastguard Worker #define LIBRATO_TAGS_FORMAT "#banner=%s,afl_version=%s"
40*08b48e0bSAndroid Build Coastguard Worker #define INFLUXDB_TAGS_FORMAT ",banner=%s,afl_version=%s"
41*08b48e0bSAndroid Build Coastguard Worker #define SIGNALFX_TAGS_FORMAT "[banner=%s,afl_version=%s]"
42*08b48e0bSAndroid Build Coastguard Worker 
43*08b48e0bSAndroid Build Coastguard Worker // For DogstatsD
44*08b48e0bSAndroid Build Coastguard Worker #define STATSD_TAGS_TYPE_SUFFIX 1
45*08b48e0bSAndroid Build Coastguard Worker #define STATSD_TAGS_SUFFIX_METRICS                                       \
46*08b48e0bSAndroid Build Coastguard Worker   METRIC_PREFIX                                                          \
47*08b48e0bSAndroid Build Coastguard Worker   ".cycle_done:%llu|g%s\n" METRIC_PREFIX                                 \
48*08b48e0bSAndroid Build Coastguard Worker   ".cycles_wo_finds:%llu|g%s\n" METRIC_PREFIX                            \
49*08b48e0bSAndroid Build Coastguard Worker   ".execs_done:%llu|g%s\n" METRIC_PREFIX                                 \
50*08b48e0bSAndroid Build Coastguard Worker   ".execs_per_sec:%0.02f|g%s\n" METRIC_PREFIX                            \
51*08b48e0bSAndroid Build Coastguard Worker   ".corpus_count:%u|g%s\n" METRIC_PREFIX                                 \
52*08b48e0bSAndroid Build Coastguard Worker   ".corpus_favored:%u|g%s\n" METRIC_PREFIX                               \
53*08b48e0bSAndroid Build Coastguard Worker   ".corpus_found:%u|g%s\n" METRIC_PREFIX                                 \
54*08b48e0bSAndroid Build Coastguard Worker   ".corpus_imported:%u|g%s\n" METRIC_PREFIX                              \
55*08b48e0bSAndroid Build Coastguard Worker   ".max_depth:%u|g%s\n" METRIC_PREFIX ".cur_item:%u|g%s\n" METRIC_PREFIX \
56*08b48e0bSAndroid Build Coastguard Worker   ".pending_favs:%u|g%s\n" METRIC_PREFIX                                 \
57*08b48e0bSAndroid Build Coastguard Worker   ".pending_total:%u|g%s\n" METRIC_PREFIX                                \
58*08b48e0bSAndroid Build Coastguard Worker   ".corpus_variable:%u|g%s\n" METRIC_PREFIX                              \
59*08b48e0bSAndroid Build Coastguard Worker   ".saved_crashes:%llu|g%s\n" METRIC_PREFIX                              \
60*08b48e0bSAndroid Build Coastguard Worker   ".saved_hangs:%llu|g%s\n" METRIC_PREFIX                                \
61*08b48e0bSAndroid Build Coastguard Worker   ".total_crashes:%llu|g%s\n" METRIC_PREFIX                              \
62*08b48e0bSAndroid Build Coastguard Worker   ".slowest_exec_ms:%u|g%s\n" METRIC_PREFIX                              \
63*08b48e0bSAndroid Build Coastguard Worker   ".edges_found:%u|g%s\n" METRIC_PREFIX                                  \
64*08b48e0bSAndroid Build Coastguard Worker   ".var_byte_count:%u|g%s\n" METRIC_PREFIX ".havoc_expansion:%u|g%s\n"
65*08b48e0bSAndroid Build Coastguard Worker 
66*08b48e0bSAndroid Build Coastguard Worker // For Librato, InfluxDB, SignalFX
67*08b48e0bSAndroid Build Coastguard Worker #define STATSD_TAGS_TYPE_MID 2
68*08b48e0bSAndroid Build Coastguard Worker #define STATSD_TAGS_MID_METRICS                                          \
69*08b48e0bSAndroid Build Coastguard Worker   METRIC_PREFIX                                                          \
70*08b48e0bSAndroid Build Coastguard Worker   ".cycle_done%s:%llu|g\n" METRIC_PREFIX                                 \
71*08b48e0bSAndroid Build Coastguard Worker   ".cycles_wo_finds%s:%llu|g\n" METRIC_PREFIX                            \
72*08b48e0bSAndroid Build Coastguard Worker   ".execs_done%s:%llu|g\n" METRIC_PREFIX                                 \
73*08b48e0bSAndroid Build Coastguard Worker   ".execs_per_sec%s:%0.02f|g\n" METRIC_PREFIX                            \
74*08b48e0bSAndroid Build Coastguard Worker   ".corpus_count%s:%u|g\n" METRIC_PREFIX                                 \
75*08b48e0bSAndroid Build Coastguard Worker   ".corpus_favored%s:%u|g\n" METRIC_PREFIX                               \
76*08b48e0bSAndroid Build Coastguard Worker   ".corpus_found%s:%u|g\n" METRIC_PREFIX                                 \
77*08b48e0bSAndroid Build Coastguard Worker   ".corpus_imported%s:%u|g\n" METRIC_PREFIX                              \
78*08b48e0bSAndroid Build Coastguard Worker   ".max_depth%s:%u|g\n" METRIC_PREFIX ".cur_item%s:%u|g\n" METRIC_PREFIX \
79*08b48e0bSAndroid Build Coastguard Worker   ".pending_favs%s:%u|g\n" METRIC_PREFIX                                 \
80*08b48e0bSAndroid Build Coastguard Worker   ".pending_total%s:%u|g\n" METRIC_PREFIX                                \
81*08b48e0bSAndroid Build Coastguard Worker   ".corpus_variable%s:%u|g\n" METRIC_PREFIX                              \
82*08b48e0bSAndroid Build Coastguard Worker   ".saved_crashes%s:%llu|g\n" METRIC_PREFIX                              \
83*08b48e0bSAndroid Build Coastguard Worker   ".saved_hangs%s:%llu|g\n" METRIC_PREFIX                                \
84*08b48e0bSAndroid Build Coastguard Worker   ".total_crashes%s:%llu|g\n" METRIC_PREFIX                              \
85*08b48e0bSAndroid Build Coastguard Worker   ".slowest_exec_ms%s:%u|g\n" METRIC_PREFIX                              \
86*08b48e0bSAndroid Build Coastguard Worker   ".edges_found%s:%u|g\n" METRIC_PREFIX                                  \
87*08b48e0bSAndroid Build Coastguard Worker   ".var_byte_count%s:%u|g\n" METRIC_PREFIX ".havoc_expansion%s:%u|g\n"
88*08b48e0bSAndroid Build Coastguard Worker 
statsd_setup_format(afl_state_t * afl)89*08b48e0bSAndroid Build Coastguard Worker void statsd_setup_format(afl_state_t *afl) {
90*08b48e0bSAndroid Build Coastguard Worker 
91*08b48e0bSAndroid Build Coastguard Worker   if (afl->afl_env.afl_statsd_tags_flavor &&
92*08b48e0bSAndroid Build Coastguard Worker       strcmp(afl->afl_env.afl_statsd_tags_flavor, "dogstatsd") == 0) {
93*08b48e0bSAndroid Build Coastguard Worker 
94*08b48e0bSAndroid Build Coastguard Worker     afl->statsd_tags_format = DOGSTATSD_TAGS_FORMAT;
95*08b48e0bSAndroid Build Coastguard Worker     afl->statsd_metric_format = STATSD_TAGS_SUFFIX_METRICS;
96*08b48e0bSAndroid Build Coastguard Worker     afl->statsd_metric_format_type = STATSD_TAGS_TYPE_SUFFIX;
97*08b48e0bSAndroid Build Coastguard Worker 
98*08b48e0bSAndroid Build Coastguard Worker   } else if (afl->afl_env.afl_statsd_tags_flavor &&
99*08b48e0bSAndroid Build Coastguard Worker 
100*08b48e0bSAndroid Build Coastguard Worker              strcmp(afl->afl_env.afl_statsd_tags_flavor, "librato") == 0) {
101*08b48e0bSAndroid Build Coastguard Worker 
102*08b48e0bSAndroid Build Coastguard Worker     afl->statsd_tags_format = LIBRATO_TAGS_FORMAT;
103*08b48e0bSAndroid Build Coastguard Worker     afl->statsd_metric_format = STATSD_TAGS_MID_METRICS;
104*08b48e0bSAndroid Build Coastguard Worker     afl->statsd_metric_format_type = STATSD_TAGS_TYPE_MID;
105*08b48e0bSAndroid Build Coastguard Worker 
106*08b48e0bSAndroid Build Coastguard Worker   } else if (afl->afl_env.afl_statsd_tags_flavor &&
107*08b48e0bSAndroid Build Coastguard Worker 
108*08b48e0bSAndroid Build Coastguard Worker              strcmp(afl->afl_env.afl_statsd_tags_flavor, "influxdb") == 0) {
109*08b48e0bSAndroid Build Coastguard Worker 
110*08b48e0bSAndroid Build Coastguard Worker     afl->statsd_tags_format = INFLUXDB_TAGS_FORMAT;
111*08b48e0bSAndroid Build Coastguard Worker     afl->statsd_metric_format = STATSD_TAGS_MID_METRICS;
112*08b48e0bSAndroid Build Coastguard Worker     afl->statsd_metric_format_type = STATSD_TAGS_TYPE_MID;
113*08b48e0bSAndroid Build Coastguard Worker 
114*08b48e0bSAndroid Build Coastguard Worker   } else if (afl->afl_env.afl_statsd_tags_flavor &&
115*08b48e0bSAndroid Build Coastguard Worker 
116*08b48e0bSAndroid Build Coastguard Worker              strcmp(afl->afl_env.afl_statsd_tags_flavor, "signalfx") == 0) {
117*08b48e0bSAndroid Build Coastguard Worker 
118*08b48e0bSAndroid Build Coastguard Worker     afl->statsd_tags_format = SIGNALFX_TAGS_FORMAT;
119*08b48e0bSAndroid Build Coastguard Worker     afl->statsd_metric_format = STATSD_TAGS_MID_METRICS;
120*08b48e0bSAndroid Build Coastguard Worker     afl->statsd_metric_format_type = STATSD_TAGS_TYPE_MID;
121*08b48e0bSAndroid Build Coastguard Worker 
122*08b48e0bSAndroid Build Coastguard Worker   } else {
123*08b48e0bSAndroid Build Coastguard Worker 
124*08b48e0bSAndroid Build Coastguard Worker     // No tags at all.
125*08b48e0bSAndroid Build Coastguard Worker     afl->statsd_tags_format = "";
126*08b48e0bSAndroid Build Coastguard Worker     // Still need to pick a format. Doesn't change anything since if will be
127*08b48e0bSAndroid Build Coastguard Worker     // replaced by the empty string anyway.
128*08b48e0bSAndroid Build Coastguard Worker     afl->statsd_metric_format = STATSD_TAGS_MID_METRICS;
129*08b48e0bSAndroid Build Coastguard Worker     afl->statsd_metric_format_type = STATSD_TAGS_TYPE_MID;
130*08b48e0bSAndroid Build Coastguard Worker 
131*08b48e0bSAndroid Build Coastguard Worker   }
132*08b48e0bSAndroid Build Coastguard Worker 
133*08b48e0bSAndroid Build Coastguard Worker }
134*08b48e0bSAndroid Build Coastguard Worker 
statsd_socket_init(afl_state_t * afl)135*08b48e0bSAndroid Build Coastguard Worker int statsd_socket_init(afl_state_t *afl) {
136*08b48e0bSAndroid Build Coastguard Worker 
137*08b48e0bSAndroid Build Coastguard Worker   /* Default port and host.
138*08b48e0bSAndroid Build Coastguard Worker   Will be overwritten by AFL_STATSD_PORT and AFL_STATSD_HOST environment
139*08b48e0bSAndroid Build Coastguard Worker   variable, if they exists.
140*08b48e0bSAndroid Build Coastguard Worker   */
141*08b48e0bSAndroid Build Coastguard Worker   u16   port = STATSD_DEFAULT_PORT;
142*08b48e0bSAndroid Build Coastguard Worker   char *host = STATSD_DEFAULT_HOST;
143*08b48e0bSAndroid Build Coastguard Worker 
144*08b48e0bSAndroid Build Coastguard Worker   if (afl->afl_env.afl_statsd_port) {
145*08b48e0bSAndroid Build Coastguard Worker 
146*08b48e0bSAndroid Build Coastguard Worker     port = atoi(afl->afl_env.afl_statsd_port);
147*08b48e0bSAndroid Build Coastguard Worker 
148*08b48e0bSAndroid Build Coastguard Worker   }
149*08b48e0bSAndroid Build Coastguard Worker 
150*08b48e0bSAndroid Build Coastguard Worker   if (afl->afl_env.afl_statsd_host) { host = afl->afl_env.afl_statsd_host; }
151*08b48e0bSAndroid Build Coastguard Worker 
152*08b48e0bSAndroid Build Coastguard Worker   int sock;
153*08b48e0bSAndroid Build Coastguard Worker   if ((sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1) {
154*08b48e0bSAndroid Build Coastguard Worker 
155*08b48e0bSAndroid Build Coastguard Worker     FATAL("Failed to create socket");
156*08b48e0bSAndroid Build Coastguard Worker 
157*08b48e0bSAndroid Build Coastguard Worker   }
158*08b48e0bSAndroid Build Coastguard Worker 
159*08b48e0bSAndroid Build Coastguard Worker   memset(&afl->statsd_server, 0, sizeof(afl->statsd_server));
160*08b48e0bSAndroid Build Coastguard Worker   afl->statsd_server.sin_family = AF_INET;
161*08b48e0bSAndroid Build Coastguard Worker   afl->statsd_server.sin_port = htons(port);
162*08b48e0bSAndroid Build Coastguard Worker 
163*08b48e0bSAndroid Build Coastguard Worker   struct addrinfo *result;
164*08b48e0bSAndroid Build Coastguard Worker   struct addrinfo  hints;
165*08b48e0bSAndroid Build Coastguard Worker 
166*08b48e0bSAndroid Build Coastguard Worker   memset(&hints, 0, sizeof(struct addrinfo));
167*08b48e0bSAndroid Build Coastguard Worker   hints.ai_family = AF_INET;
168*08b48e0bSAndroid Build Coastguard Worker   hints.ai_socktype = SOCK_DGRAM;
169*08b48e0bSAndroid Build Coastguard Worker 
170*08b48e0bSAndroid Build Coastguard Worker   if ((getaddrinfo(host, NULL, &hints, &result))) {
171*08b48e0bSAndroid Build Coastguard Worker 
172*08b48e0bSAndroid Build Coastguard Worker     FATAL("Fail to getaddrinfo");
173*08b48e0bSAndroid Build Coastguard Worker 
174*08b48e0bSAndroid Build Coastguard Worker   }
175*08b48e0bSAndroid Build Coastguard Worker 
176*08b48e0bSAndroid Build Coastguard Worker   memcpy(&(afl->statsd_server.sin_addr),
177*08b48e0bSAndroid Build Coastguard Worker          &((struct sockaddr_in *)result->ai_addr)->sin_addr,
178*08b48e0bSAndroid Build Coastguard Worker          sizeof(struct in_addr));
179*08b48e0bSAndroid Build Coastguard Worker   freeaddrinfo(result);
180*08b48e0bSAndroid Build Coastguard Worker 
181*08b48e0bSAndroid Build Coastguard Worker   return sock;
182*08b48e0bSAndroid Build Coastguard Worker 
183*08b48e0bSAndroid Build Coastguard Worker }
184*08b48e0bSAndroid Build Coastguard Worker 
statsd_send_metric(afl_state_t * afl)185*08b48e0bSAndroid Build Coastguard Worker int statsd_send_metric(afl_state_t *afl) {
186*08b48e0bSAndroid Build Coastguard Worker 
187*08b48e0bSAndroid Build Coastguard Worker   char buff[MAX_STATSD_PACKET_SIZE] = {0};
188*08b48e0bSAndroid Build Coastguard Worker 
189*08b48e0bSAndroid Build Coastguard Worker   /* afl->statsd_sock is set once in the initialisation of afl-fuzz and reused
190*08b48e0bSAndroid Build Coastguard Worker   each time If the sendto later fail, we reset it to 0 to be able to recreates
191*08b48e0bSAndroid Build Coastguard Worker   it.
192*08b48e0bSAndroid Build Coastguard Worker   */
193*08b48e0bSAndroid Build Coastguard Worker   if (!afl->statsd_sock) {
194*08b48e0bSAndroid Build Coastguard Worker 
195*08b48e0bSAndroid Build Coastguard Worker     afl->statsd_sock = statsd_socket_init(afl);
196*08b48e0bSAndroid Build Coastguard Worker     if (!afl->statsd_sock) {
197*08b48e0bSAndroid Build Coastguard Worker 
198*08b48e0bSAndroid Build Coastguard Worker       WARNF("Cannot create socket");
199*08b48e0bSAndroid Build Coastguard Worker       return -1;
200*08b48e0bSAndroid Build Coastguard Worker 
201*08b48e0bSAndroid Build Coastguard Worker     }
202*08b48e0bSAndroid Build Coastguard Worker 
203*08b48e0bSAndroid Build Coastguard Worker   }
204*08b48e0bSAndroid Build Coastguard Worker 
205*08b48e0bSAndroid Build Coastguard Worker   statsd_format_metric(afl, buff, MAX_STATSD_PACKET_SIZE);
206*08b48e0bSAndroid Build Coastguard Worker   if (sendto(afl->statsd_sock, buff, strlen(buff), 0,
207*08b48e0bSAndroid Build Coastguard Worker              (struct sockaddr *)&afl->statsd_server,
208*08b48e0bSAndroid Build Coastguard Worker              sizeof(afl->statsd_server)) == -1) {
209*08b48e0bSAndroid Build Coastguard Worker 
210*08b48e0bSAndroid Build Coastguard Worker     if (!close(afl->statsd_sock)) { PFATAL("Cannot close socket"); }
211*08b48e0bSAndroid Build Coastguard Worker     afl->statsd_sock = 0;
212*08b48e0bSAndroid Build Coastguard Worker     WARNF("Cannot sendto");
213*08b48e0bSAndroid Build Coastguard Worker     return -1;
214*08b48e0bSAndroid Build Coastguard Worker 
215*08b48e0bSAndroid Build Coastguard Worker   }
216*08b48e0bSAndroid Build Coastguard Worker 
217*08b48e0bSAndroid Build Coastguard Worker   return 0;
218*08b48e0bSAndroid Build Coastguard Worker 
219*08b48e0bSAndroid Build Coastguard Worker }
220*08b48e0bSAndroid Build Coastguard Worker 
statsd_format_metric(afl_state_t * afl,char * buff,size_t bufflen)221*08b48e0bSAndroid Build Coastguard Worker int statsd_format_metric(afl_state_t *afl, char *buff, size_t bufflen) {
222*08b48e0bSAndroid Build Coastguard Worker 
223*08b48e0bSAndroid Build Coastguard Worker   char tags[MAX_TAG_LEN * 2] = {0};
224*08b48e0bSAndroid Build Coastguard Worker   if (afl->statsd_tags_format) {
225*08b48e0bSAndroid Build Coastguard Worker 
226*08b48e0bSAndroid Build Coastguard Worker     snprintf(tags, MAX_TAG_LEN * 2, afl->statsd_tags_format, afl->sync_id,
227*08b48e0bSAndroid Build Coastguard Worker              VERSION);
228*08b48e0bSAndroid Build Coastguard Worker 
229*08b48e0bSAndroid Build Coastguard Worker   }
230*08b48e0bSAndroid Build Coastguard Worker 
231*08b48e0bSAndroid Build Coastguard Worker   /* Sends multiple metrics with one UDP Packet.
232*08b48e0bSAndroid Build Coastguard Worker   bufflen will limit to the max safe size.
233*08b48e0bSAndroid Build Coastguard Worker   */
234*08b48e0bSAndroid Build Coastguard Worker   if (afl->statsd_metric_format_type == STATSD_TAGS_TYPE_SUFFIX) {
235*08b48e0bSAndroid Build Coastguard Worker 
236*08b48e0bSAndroid Build Coastguard Worker     snprintf(
237*08b48e0bSAndroid Build Coastguard Worker         buff, bufflen, afl->statsd_metric_format,
238*08b48e0bSAndroid Build Coastguard Worker         afl->queue_cycle ? (afl->queue_cycle - 1) : 0, tags,
239*08b48e0bSAndroid Build Coastguard Worker         afl->cycles_wo_finds, tags, afl->fsrv.total_execs, tags,
240*08b48e0bSAndroid Build Coastguard Worker         afl->fsrv.total_execs /
241*08b48e0bSAndroid Build Coastguard Worker             ((double)(get_cur_time() + afl->prev_run_time - afl->start_time) /
242*08b48e0bSAndroid Build Coastguard Worker              1000),
243*08b48e0bSAndroid Build Coastguard Worker         tags, afl->queued_items, tags, afl->queued_favored, tags,
244*08b48e0bSAndroid Build Coastguard Worker         afl->queued_discovered, tags, afl->queued_imported, tags,
245*08b48e0bSAndroid Build Coastguard Worker         afl->max_depth, tags, afl->current_entry, tags, afl->pending_favored,
246*08b48e0bSAndroid Build Coastguard Worker         tags, afl->pending_not_fuzzed, tags, afl->queued_variable, tags,
247*08b48e0bSAndroid Build Coastguard Worker         afl->saved_crashes, tags, afl->saved_hangs, tags, afl->total_crashes,
248*08b48e0bSAndroid Build Coastguard Worker         tags, afl->slowest_exec_ms, tags,
249*08b48e0bSAndroid Build Coastguard Worker         count_non_255_bytes(afl, afl->virgin_bits), tags, afl->var_byte_count,
250*08b48e0bSAndroid Build Coastguard Worker         tags, afl->expand_havoc, tags);
251*08b48e0bSAndroid Build Coastguard Worker 
252*08b48e0bSAndroid Build Coastguard Worker   } else if (afl->statsd_metric_format_type == STATSD_TAGS_TYPE_MID) {
253*08b48e0bSAndroid Build Coastguard Worker 
254*08b48e0bSAndroid Build Coastguard Worker     snprintf(
255*08b48e0bSAndroid Build Coastguard Worker         buff, bufflen, afl->statsd_metric_format, tags,
256*08b48e0bSAndroid Build Coastguard Worker         afl->queue_cycle ? (afl->queue_cycle - 1) : 0, tags,
257*08b48e0bSAndroid Build Coastguard Worker         afl->cycles_wo_finds, tags, afl->fsrv.total_execs, tags,
258*08b48e0bSAndroid Build Coastguard Worker         afl->fsrv.total_execs /
259*08b48e0bSAndroid Build Coastguard Worker             ((double)(get_cur_time() + afl->prev_run_time - afl->start_time) /
260*08b48e0bSAndroid Build Coastguard Worker              1000),
261*08b48e0bSAndroid Build Coastguard Worker         tags, afl->queued_items, tags, afl->queued_favored, tags,
262*08b48e0bSAndroid Build Coastguard Worker         afl->queued_discovered, tags, afl->queued_imported, tags,
263*08b48e0bSAndroid Build Coastguard Worker         afl->max_depth, tags, afl->current_entry, tags, afl->pending_favored,
264*08b48e0bSAndroid Build Coastguard Worker         tags, afl->pending_not_fuzzed, tags, afl->queued_variable, tags,
265*08b48e0bSAndroid Build Coastguard Worker         afl->saved_crashes, tags, afl->saved_hangs, tags, afl->total_crashes,
266*08b48e0bSAndroid Build Coastguard Worker         tags, afl->slowest_exec_ms, tags,
267*08b48e0bSAndroid Build Coastguard Worker         count_non_255_bytes(afl, afl->virgin_bits), tags, afl->var_byte_count,
268*08b48e0bSAndroid Build Coastguard Worker         tags, afl->expand_havoc);
269*08b48e0bSAndroid Build Coastguard Worker 
270*08b48e0bSAndroid Build Coastguard Worker   }
271*08b48e0bSAndroid Build Coastguard Worker 
272*08b48e0bSAndroid Build Coastguard Worker   return 0;
273*08b48e0bSAndroid Build Coastguard Worker 
274*08b48e0bSAndroid Build Coastguard Worker }
275*08b48e0bSAndroid Build Coastguard Worker 
276