39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
|
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
|
#include <stdarg.h>
#include <fcntl.h>
#include <stdio.h>
#include <errno.h>
#include <time.h>
#include <pwd.h>
/*
* Determine if the C compiler supports C11 atomics
*/
#if __STDC_VERSION__ >= 201112L
# ifndef __STDC_NO_ATOMICS__
# define FILED_FEATURE_C11_ATOMICS 1
# endif
#endif
/*
* If the C compiler does not support C11 atomics, disable TIMEOUT support
* since it relies upon it
*/
#ifndef FILED_FEATURE_C11_ATOMICS
# define FILED_DONT_TIMEOUT 1
#endif
/*
* These headers are only required for TIMEOUT support
*/
#ifndef FILED_DONT_TIMEOUT
#include <stdatomic.h>
#include <stdbool.h>
#endif
/* Compile time constants */
#define FILED_VERSION "1.21"
#define FILED_SENDFILE_MAX 16777215
#define FILED_MAX_FAILURE_COUNT 30
#define FILED_DEFAULT_TYPE "application/octet-stream"
#define FILED_PATH_BUFFER_SIZE 1010
/* Default values */
#define PORT 80
#define THREAD_COUNT 5
#define BIND_ADDR "::"
#define CACHE_SIZE 8209
#define LOG_FILE "-"
/* Fuzzing Test Code */
#ifdef FILED_TEST_AFL
#define FILED_DONT_LOG 1
#define FILED_DONT_TIMEOUT 1
#define pthread_create(a, x, y, z) afl_pthread_create(a, x, y, z)
#define bind(x, y, z) afl_bind(x, y, z)
#define socket(x, y, z) 8193
#define listen(x, y) 0
#define accept(x, y, z) afl_accept(x, y, z)
#define close(x) { if (strcmp(#x, "random_fd") == 0) { close(x); } else { exit(0); } }
#define fclose(x) exit(0)
|
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
|
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
|
-
+
-
-
-
-
+
+
+
+
|
#define filed_sockettimeout_thread_init() 0
#define filed_sockettimeout_init() 0
#define filed_sockettimeout_accept(x) /**/
#define filed_sockettimeout_processing_start(x) /**/
#define filed_sockettimeout_processing_end(x) /**/
#define filed_sockettimeout_close(x) /**/
#else
_Atomic time_t filed_sockettimeout_time;
time_t filed_sockettimeout_time;
struct {
_Atomic time_t expiration_time;
_Atomic pthread_t thread_id;
bool valid;
}* filed_sockettimeout_sockstatus;
time_t expiration_time;
pthread_t thread_id;
int valid;
} *filed_sockettimeout_sockstatus;
long filed_sockettimeout_sockstatus_length;
int filed_sockettimeout_devnull_fd;
static int filed_sockettimeout_sockfd_in_range(int sockfd) {
if (sockfd < 3) {
return(0);
}
|
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
|
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
|
-
+
|
static void *filed_sockettimeout_thread(void *arg) {
struct timespec sleep_time;
time_t now, expiration_time;
pthread_t thread_id;
long idx;
int count;
bool valid;
int valid;
while (1) {
for (count = 0; count < 10; count++) {
sleep_time.tv_sec = 30;
sleep_time.tv_nsec = 0;
nanosleep(&sleep_time, NULL);
|
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
|
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
|
+
-
+
-
|
long maxfd, idx;
maxfd = sysconf(_SC_OPEN_MAX);
if (maxfd <= 0) {
maxfd = 4096;
}
filed_sockettimeout_sockstatus_length = maxfd;
filed_sockettimeout_sockstatus = malloc(sizeof(*filed_sockettimeout_sockstatus) * maxfd);
filed_sockettimeout_sockstatus = malloc(sizeof(*filed_sockettimeout_sockstatus) * filed_sockettimeout_sockstatus_length);
if (filed_sockettimeout_sockstatus == NULL) {
return(-1);
}
for (idx = 0; idx < maxfd; idx++) {
filed_sockettimeout_sockstatus[idx].valid = false;
}
filed_sockettimeout_sockstatus_length = maxfd;
filed_sockettimeout_devnull_fd = open("/dev/null", O_RDWR);
if (filed_sockettimeout_devnull_fd < 0) {
return(-1);
}
return(0);
}
|