Line | Source | Count |
1 | | - |
2 | | - |
3 | | - |
4 | | - |
5 | | - |
6 | | - |
7 | | - |
8 | | - |
9 | | - |
10 | | - |
11 | | - |
12 | | - |
13 | | - |
14 | | - |
15 | | - |
16 | | - |
17 | | - |
18 | | - |
19 | | - |
20 | | - |
21 | | - |
22 | | - |
23 | | - |
24 | | - |
25 | | - |
26 | | - |
27 | | - |
28 | | - |
29 | | - |
30 | | - |
31 | | - |
32 | | - |
33 | #include "includes.h" | - |
34 | | - |
35 | #ifndef HAVE_BINDRESVPORT_SA | - |
36 | #include <sys/types.h> | - |
37 | #include <sys/socket.h> | - |
38 | | - |
39 | #include <netinet/in.h> | - |
40 | #include <arpa/inet.h> | - |
41 | | - |
42 | #include <errno.h> | - |
43 | #include <string.h> | - |
44 | | - |
45 | #define STARTPORT 600 | - |
46 | #define ENDPORT (IPPORT_RESERVED - 1) | - |
47 | #define NPORTS (ENDPORT - STARTPORT + 1) | - |
48 | | - |
49 | | - |
50 | | - |
51 | | - |
52 | int | - |
53 | bindresvport_sa(int sd, struct sockaddr *sa) | - |
54 | { | - |
55 | int error, af; | - |
56 | struct sockaddr_storage myaddr; | - |
57 | struct sockaddr_in *in; | - |
58 | struct sockaddr_in6 *in6; | - |
59 | u_int16_t *portp; | - |
60 | u_int16_t port; | - |
61 | socklen_t salen; | - |
62 | int i; | - |
63 | | - |
64 | if (sa == NULL) {TRUE | never evaluated | FALSE | never evaluated |
| 0 |
65 | memset(&myaddr, 0, sizeof(myaddr)); | - |
66 | sa = (struct sockaddr *)&myaddr; | - |
67 | salen = sizeof(myaddr); | - |
68 | | - |
69 | if (getsockname(sd, sa, &salen) == -1)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
70 | return -1; never executed: return -1; | 0 |
71 | | - |
72 | af = sa->sa_family; | - |
73 | memset(&myaddr, 0, salen); | - |
74 | } else never executed: end of block | 0 |
75 | af = sa->sa_family; never executed: af = sa->sa_family; | 0 |
76 | | - |
77 | if (af == AF_INET) {TRUE | never evaluated | FALSE | never evaluated |
| 0 |
78 | in = (struct sockaddr_in *)sa; | - |
79 | salen = sizeof(struct sockaddr_in); | - |
80 | portp = &in->sin_port; | - |
81 | } else if (af == AF_INET6) { never executed: end of block TRUE | never evaluated | FALSE | never evaluated |
| 0 |
82 | in6 = (struct sockaddr_in6 *)sa; | - |
83 | salen = sizeof(struct sockaddr_in6); | - |
84 | portp = &in6->sin6_port; | - |
85 | } else { never executed: end of block | 0 |
86 | errno = EPFNOSUPPORT; | - |
87 | return (-1); never executed: return (-1); | 0 |
88 | } | - |
89 | sa->sa_family = af; | - |
90 | | - |
91 | port = ntohs(*portp); never executed: __v = ((unsigned short int) ((((__x) >> 8) & 0xff) | (((__x) & 0xff) << 8))); never executed: __asm__ ("rorw $8, %w0" : "=r" (__v) : "0" (__x) : "cc"); TRUE | never evaluated | FALSE | never evaluated |
| 0 |
92 | if (port == 0)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
93 | port = arc4random_uniform(NPORTS) + STARTPORT; never executed: port = arc4random_uniform((( 1024 - 1) - 600 + 1)) + 600; | 0 |
94 | | - |
95 | | - |
96 | error = -1; | - |
97 | | - |
98 | for(i = 0; i < NPORTS; i++) {TRUE | never evaluated | FALSE | never evaluated |
| 0 |
99 | *portp = htons(port); never executed: __v = ((unsigned short int) ((((__x) >> 8) & 0xff) | (((__x) & 0xff) << 8))); never executed: __asm__ ("rorw $8, %w0" : "=r" (__v) : "0" (__x) : "cc"); TRUE | never evaluated | FALSE | never evaluated |
| 0 |
100 | | - |
101 | error = bind(sd, sa, salen); | - |
102 | | - |
103 | | - |
104 | if (error == 0)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
105 | break; never executed: break; | 0 |
106 | | - |
107 | | - |
108 | if ((error < 0) && !((errno == EADDRINUSE) || (errno == EINVAL)))TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
| 0 |
109 | break; never executed: break; | 0 |
110 | | - |
111 | port++; | - |
112 | if (port > ENDPORT)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
113 | port = STARTPORT; never executed: port = 600; | 0 |
114 | } never executed: end of block | 0 |
115 | | - |
116 | return (error); never executed: return (error); | 0 |
117 | } | - |
118 | | - |
119 | #endif /* HAVE_BINDRESVPORT_SA */ | - |
| | |