First fuzz-detected error!

This commit is contained in:
Ian Gulliver
2016-03-04 18:59:38 -08:00
parent 43e73cd959
commit 3dae1a7015

View File

@@ -1,5 +1,6 @@
#include <assert.h> #include <assert.h>
#include <dirent.h> #include <dirent.h>
#include <errno.h>
#include <fcntl.h> #include <fcntl.h>
#include <getopt.h> #include <getopt.h>
#include <netdb.h> #include <netdb.h>
@@ -172,7 +173,7 @@ static struct file *file_next() {
iter = iter->next->next; iter = iter->next->next;
rounds++; rounds++;
if (!(++rounds % 100)) { if (!(++rounds % 100)) {
fprintf(stderr, "\rRounds: %ju", (uintmax_t) rounds); fprintf(stderr, "\rRounds: %ju\r", (uintmax_t) rounds);
} }
} else { } else {
iter = iter->next; iter = iter->next;
@@ -239,10 +240,33 @@ static void conn_send_message(struct conn *conn) {
conn->offset += to_send; conn->offset += to_send;
} }
static void conn_send_messages() { static void conn_check(struct conn *conn) {
int error;
socklen_t len = sizeof(error);
assert(getsockopt(conn->fd, SOL_SOCKET, SO_ERROR, &error, &len) == 0);
if (!error) {
conn->state = CONN_SENDING;
return;
}
if (error == EINPROGRESS) {
return;
}
fprintf(stderr, "\nConnection failed: %s\n", strerror(error));
exit(EXIT_FAILURE);
}
static void conn_cycle() {
struct conn *iter, *next; struct conn *iter, *next;
list_for_each_entry_safe(iter, next, &conn_head, conn_list) { list_for_each_entry_safe(iter, next, &conn_head, conn_list) {
conn_send_message(iter); switch (iter->state) {
case CONN_CONNECTING:
conn_check(iter);
break;
case CONN_SENDING:
conn_send_message(iter);
break;
}
} }
} }
@@ -251,7 +275,7 @@ int main(int argc, char *argv[]) {
if (!parse_opts(argc, argv)) { if (!parse_opts(argc, argv)) {
fprintf(stderr, "Usage: TODO\n"); fprintf(stderr, "Usage: TODO\n");
return 1; exit(EXIT_FAILURE);
} }
file_open(); file_open();
@@ -265,8 +289,8 @@ int main(int argc, char *argv[]) {
}; };
while (true) { while (true) {
conn_cycle();
conn_fill(); conn_fill();
conn_send_messages();
assert(!nanosleep(&ts, NULL)); assert(!nanosleep(&ts, NULL));
} }