diff --git a/src/civetweb.c b/src/civetweb.c index fddb4b0d..9b7408df 100755 --- a/src/civetweb.c +++ b/src/civetweb.c @@ -5431,7 +5431,6 @@ static void send_file_data(struct mg_connection *conn, { char buf[MG_BUF_LEN]; int to_read, num_read, num_written; - int loop_cnt = 0; int64_t size; if (!filep || !conn) { @@ -5456,10 +5455,11 @@ static void send_file_data(struct mg_connection *conn, off_t sf_offs = (off_t)offset; ssize_t sf_sent; int sf_file = fileno(filep->fp); + int loop_cnt = 0; do { - /* 2147479552 (0x7FFFF000) is a limit found by experiment on 64 - * bit Linux (2^31 minus one memory page of 4k?). */ + /* 2147479552 (0x7FFFF000) is a limit found by experiment on + * 64 bit Linux (2^31 minus one memory page of 4k?). */ size_t sf_tosend = (size_t)((len < 0x7FFFF000) ? len : 0x7FFFF000); sf_sent = @@ -5474,9 +5474,14 @@ static void send_file_data(struct mg_connection *conn, * /sys/ and /proc/ file system. * Use the regular user mode copy code instead. */ break; + } else if (sf_sent == 0) { + /* No error, but 0 bytes sent. May be EOF? */ + mg_sleep(1); + loop_cnt = -1; + /* TODO(high): Maybe just return here. --> Test required */ } - loop_cnt++; + } while ((len > 0) && (sf_sent >= 0)); if (sf_sent > 0) {