• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

proftpd / proftpd / 21220316014

21 Jan 2026 06:02PM UTC coverage: 92.638% (-0.4%) from 93.026%
21220316014

push

github

web-flow
Issue #2020: Guard against inadvertently accessing bytes before the allocated memory range when processing FTP control connection characters. 

In certain conditions, we might use a -1 index, thus leading to a single byte read of out-of-bounds memory.

3 of 3 new or added lines in 1 file covered. (100.0%)

898 existing lines in 28 files now uncovered.

47238 of 50992 relevant lines covered (92.64%)

237.04 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

99.61
/tests/api/netaddr.c
1
/*
2
 * ProFTPD - FTP server testsuite
3
 * Copyright (c) 2008-2025 The ProFTPD Project team
4
 *
5
 * This program is free software; you can redistribute it and/or modify
6
 * it under the terms of the GNU General Public License as published by
7
 * the Free Software Foundation; either version 2 of the License, or
8
 * (at your option) any later version.
9
 *
10
 * This program is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 * GNU General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU General Public License
16
 * along with this program; if not, write to the Free Software
17
 * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA.
18
 *
19
 * As a special exemption, The ProFTPD Project team and other respective
20
 * copyright holders give permission to link this program with OpenSSL, and
21
 * distribute the resulting executable, without including the source code for
22
 * OpenSSL in the source distribution.
23
 */
24

25
/* NetAddr API tests */
26

27
#include "tests.h"
28

29
static pool *p = NULL;
30

31
/* Fixtures */
32

33
static void set_up(void) {
34✔
34
  if (p == NULL) {
34✔
35
    p = permanent_pool = make_sub_pool(NULL);
34✔
36
  }
37

38
  init_netaddr();
34✔
39

40
  if (getenv("TEST_VERBOSE") != NULL) {
34✔
41
    pr_trace_set_levels("dns", 1, 20);
34✔
42
  }
43
}
34✔
44

45
static void tear_down(void) {
34✔
46
  if (getenv("TEST_VERBOSE") != NULL) {
34✔
47
    pr_trace_set_levels("dns", 0, 0);
34✔
48
  }
49

50
  if (p) {
34✔
51
    destroy_pool(p);
34✔
52
    p = permanent_pool = NULL;
34✔
53
  }
54
}
34✔
55

56
/* Tests */
57

58
START_TEST (netaddr_alloc_test) {
1✔
59
  pr_netaddr_t *res;
60

61
  res = pr_netaddr_alloc(NULL);
1✔
62
  ck_assert_msg(res == NULL, "Failed to handle null arguments");
1✔
63
  ck_assert_msg(errno == EINVAL, "Failed to set errno to EINVAL");
2✔
64

65
  res = pr_netaddr_alloc(p);
1✔
66
  ck_assert_msg(res != NULL, "Failed to allocate netaddr: %s", strerror(errno));
2✔
67
  ck_assert_msg(res->na_family == 0, "Allocated netaddr is not zeroed");
2✔
68
}
69
END_TEST
1✔
70

71
START_TEST (netaddr_dup_test) {
1✔
72
  pr_netaddr_t *res, *addr;
73
  int port;
74

75
  res = pr_netaddr_dup(NULL, NULL);
1✔
76
  ck_assert_msg(res == NULL, "Failed to handle null arguments");
1✔
77
  ck_assert_msg(errno == EINVAL, "Failed to set errno to EINVAL");
2✔
78

79
  res = pr_netaddr_dup(p, NULL);
1✔
80
  ck_assert_msg(res == NULL, "Failed to handle null addr");
2✔
81
  ck_assert_msg(errno == EINVAL, "Failed to set errno to EINVAL");
2✔
82

83
  addr = pr_netaddr_alloc(p);
1✔
84
  pr_netaddr_set_family(addr, AF_INET);
1✔
85

86
  port = 7654;
1✔
87
  pr_netaddr_set_port2(addr, port);
1✔
88

89
  res = pr_netaddr_dup(NULL, addr);
1✔
90
  ck_assert_msg(res == NULL, "Failed to handle null pool");
2✔
91
  ck_assert_msg(errno == EINVAL, "Failed to set errno to EINVAL");
2✔
92

93
  res = pr_netaddr_dup(p, addr);
1✔
94
  ck_assert_msg(res != NULL, "Failed to dup netaddr: %s", strerror(errno));
2✔
95
  ck_assert_msg(res->na_family == addr->na_family, "Expected family %d, got %d",
2✔
96
    addr->na_family, res->na_family);
97
  ck_assert_msg(ntohs(pr_netaddr_get_port(res)) == port,
1✔
98
    "Expected port %d, got %d", port, ntohs(pr_netaddr_get_port(res)));
99
}
100
END_TEST
1✔
101

102
START_TEST (netaddr_clear_test) {
1✔
103
  pr_netaddr_t *addr;
104

105
  mark_point();
1✔
106
  pr_netaddr_clear(NULL);
1✔
107

108
  addr = pr_netaddr_alloc(p);
1✔
109
  addr->na_family = 1;
1✔
110

111
  pr_netaddr_clear(addr);
1✔
112
  ck_assert_msg(addr->na_family == 0, "Failed to clear addr");
1✔
113
}
114
END_TEST
1✔
115

116
START_TEST (netaddr_get_addr_test) {
1✔
117
  const pr_netaddr_t *res;
118
  const char *name;
119
  array_header *addrs = NULL;
1✔
120

121
  res = pr_netaddr_get_addr(NULL, NULL, NULL);
1✔
122
  ck_assert_msg(res == NULL, "Failed to handle null arguments");
1✔
123
  ck_assert_msg(errno == EINVAL, "Failed to set errno to EINVAL");
2✔
124

125
  res = pr_netaddr_get_addr(p, NULL, NULL);
1✔
126
  ck_assert_msg(res == NULL, "Failed to handle null name");
2✔
127
  ck_assert_msg(errno == EINVAL, "Failed to set errno to EINVAL");
2✔
128

129
  name = "134.289.999.0";
1✔
130

131
  res = pr_netaddr_get_addr(NULL, name, NULL);
1✔
132
  ck_assert_msg(res == NULL, "Failed to handle null pool");
2✔
133
  ck_assert_msg(errno == EINVAL, "Expected EINVAL (%d), got %s (%d)", EINVAL,
2✔
134
    strerror(errno), errno);
135

136
  res = pr_netaddr_get_addr(p, name, NULL);
1✔
137
  ck_assert_msg(res == NULL, "Unexpected got address for '%s'", name);
2✔
138
  ck_assert_msg(errno == ENOENT || errno == EAGAIN,
2✔
139
    "Expected ENOENT (%d) or EAGAIN (%d), got %s (%d)", ENOENT, EAGAIN,
140
    strerror(errno), errno);
141

142
  name = "localhost";
1✔
143

144
  res = pr_netaddr_get_addr(p, name, NULL);
1✔
145
  ck_assert_msg(res != NULL, "Failed to get addr for '%s': %s", name,
2✔
146
    strerror(errno));
147
  ck_assert_msg(res->na_family == AF_INET, "Expected family %d, got %d",
2✔
148
    AF_INET, res->na_family);
149

150
  res = pr_netaddr_get_addr(p, name, &addrs);
1✔
151
  ck_assert_msg(res != NULL, "Failed to get addr for '%s': %s", name,
2✔
152
    strerror(errno));
153
  ck_assert_msg(res->na_family == AF_INET, "Expected family %d, got %d",
2✔
154
    AF_INET, res->na_family);
155

156
#if defined(PR_USE_NETWORK_TESTS)
157
  /* Google: the Dial Tone of the Internet. */
158
  name = "www.google.com";
1✔
159

160
  res = pr_netaddr_get_addr(p, name, &addrs);
1✔
161
  ck_assert_msg(res != NULL, "Failed to get addr for '%s': %s", name,
2✔
162
    strerror(errno));
163
  ck_assert_msg(res->na_family == AF_INET, "Expected family %d, got %d",
2✔
164
    AF_INET, res->na_family);
165
  ck_assert_msg(addrs != NULL, "Expected additional addresses for '%s'", name);
2✔
166

167
  res = pr_netaddr_get_addr(p, name, NULL);
1✔
168
  ck_assert_msg(res != NULL, "Failed to get addr for '%s': %s", name,
2✔
169
    strerror(errno));
170
  ck_assert_msg(res->na_family == AF_INET, "Expected family %d, got %d",
2✔
171
    AF_INET, res->na_family);
172
#endif
173

174
  name = "127.0.0.1";
1✔
175

176
  res = pr_netaddr_get_addr(p, name, NULL);
1✔
177
  ck_assert_msg(res != NULL, "Failed to get addr for '%s': %s", name,
2✔
178
    strerror(errno));
179
  ck_assert_msg(res->na_family == AF_INET, "Expected family %d, got %d",
2✔
180
    AF_INET, res->na_family);
181

182
  res = pr_netaddr_get_addr(p, name, &addrs);
1✔
183
  ck_assert_msg(res != NULL, "Failed to get addr for '%s': %s", name,
2✔
184
    strerror(errno));
185
  ck_assert_msg(res->na_family == AF_INET, "Expected family %d, got %d",
2✔
186
    AF_INET, res->na_family);
187
  ck_assert_msg(addrs == NULL, "Expected no additional addresses for '%s'", name);
2✔
188

189
  /* Deliberately test an unresolvable name (related to Bug#4104). */
190
  name = "foo.bar.castaglia.example.com";
1✔
191

192
  res = pr_netaddr_get_addr(p, name, NULL);
1✔
193
  ck_assert_msg(res == NULL, "Resolved '%s' unexpectedly", name);
2✔
194
  ck_assert_msg(errno == ENOENT || errno == EAGAIN,
2✔
195
    "Expected ENOENT (%d) or EAGAIN (%d), got %s (%d)", ENOENT, EAGAIN,
196
    strerror(errno), errno);
197

198
#if defined(PR_USE_IPV6)
199
  name = "::1";
1✔
200

201
  res = pr_netaddr_get_addr(p, name, NULL);
1✔
202
  ck_assert_msg(res != NULL, "Failed to get addr for '%s': %s", name,
2✔
203
    strerror(errno));
204
  ck_assert_msg(res->na_family == AF_INET6, "Expected family %d, got %d",
2✔
205
    AF_INET6, res->na_family);
206

207
  res = pr_netaddr_get_addr(p, name, &addrs);
1✔
208
  ck_assert_msg(res != NULL, "Failed to get addr for '%s': %s", name,
2✔
209
    strerror(errno));
210
  ck_assert_msg(res->na_family == AF_INET6, "Expected family %d, got %d",
2✔
211
    AF_INET6, res->na_family);
212
  ck_assert_msg(addrs == NULL, "Expected no additional addresses for '%s'", name);
2✔
213
#endif /* PR_USE_IPV6 */
214
}
215
END_TEST
1✔
216

217
START_TEST (netaddr_get_addr2_test) {
1✔
218
  const pr_netaddr_t *res;
219
  const char *name;
220
  int flags;
221

222
  flags = PR_NETADDR_GET_ADDR_FL_INCL_DEVICE;
1✔
223
  name = "foobarbaz";
1✔
224
  res = pr_netaddr_get_addr2(p, name, NULL, flags);
1✔
225
  ck_assert_msg(res == NULL, "Failed to handle unknown device '%s'", name);
1✔
226
  ck_assert_msg(errno == ENOENT, "Expected ENOENT (%d), got %s (%d)", ENOENT,
2✔
227
    strerror(errno), errno);
228

229
  name = "lo0";
1✔
230
  res = pr_netaddr_get_addr2(p, name, NULL, flags);
1✔
231
  if (res == NULL) {
1✔
232
    /* Fallback to using a device name of "lo". */
233
    name = "lo";
1✔
234
    res = pr_netaddr_get_addr2(p, name, NULL, flags);
1✔
235
  }
236

237
  ck_assert_msg(res != NULL,
1✔
238
    "Expected to resolve name '%s' to an address via INCL_DEVICE", name);
239

240
  flags = PR_NETADDR_GET_ADDR_FL_EXCL_DNS;
1✔
241
  name = "localhost";
1✔
242
  res = pr_netaddr_get_addr2(p, name, NULL, flags);
1✔
243
  ck_assert_msg(res == NULL, "Resolved name '%s' to IP address unexpectedly",
2✔
244
    name);
245
  ck_assert_msg(errno == ENOENT, "Expected ENOENT (%d), got %d (%s)", ENOENT,
2✔
246
    errno, strerror(errno));
247

248
  flags = PR_NETADDR_GET_ADDR_FL_EXCL_CACHE;
1✔
249
  name = "127.0.0.1";
1✔
250
  res = pr_netaddr_get_addr2(p, name, NULL, flags);
1✔
251
  ck_assert_msg(res != NULL, "Failed to resolve name '%s' to IP address: %s",
2✔
252
    name, strerror(errno));
253
}
254
END_TEST
1✔
255

256
START_TEST (netaddr_get_family_test) {
1✔
257
  const pr_netaddr_t *addr;
258
  int res;
259

260
  res = pr_netaddr_get_family(NULL);
1✔
261
  ck_assert_msg(res == -1, "Failed to handle null argument");
1✔
262
  ck_assert_msg(errno == EINVAL, "Failed to set errno to EINVAL");
2✔
263

264
  addr = pr_netaddr_get_addr(p, "localhost", NULL);
1✔
265
  ck_assert_msg(addr != NULL, "Failed to get addr for 'localhost': %s",
2✔
266
    strerror(errno));
267

268
  res = pr_netaddr_get_family(addr);
1✔
269
  ck_assert_msg(res == AF_INET, "Expected family %d, got %d", AF_INET,
2✔
270
    res);
271
}
272
END_TEST
1✔
273

274
START_TEST (netaddr_set_family_test) {
1✔
275
  pr_netaddr_t *addr;
276
  int res;
277

278
  res = pr_netaddr_set_family(NULL, 0);
1✔
279
  ck_assert_msg(res == -1, "Failed to handle null arguments");
1✔
280
  ck_assert_msg(errno == EINVAL, "Failed to set errno to EINVAL");
2✔
281

282
  addr = (pr_netaddr_t *) pr_netaddr_get_addr(p, "127.0.0.1", NULL);
1✔
283
  ck_assert_msg(addr != NULL, "Failed to get addr for '127.0.0.1': %s",
2✔
284
    strerror(errno));
285

286
  res = pr_netaddr_set_family(addr, -1);
1✔
287
  ck_assert_msg(res == -1, "Failed to handle bad family");
2✔
288
#if defined(EAFNOSUPPORT)
289
  ck_assert_msg(errno == EAFNOSUPPORT, "Failed to set errno to EAFNOSUPPORT");
2✔
290
#else
291
  ck_assert_msg(errno == EINVAL, "Failed to set errno to EINVAL");
292
#endif /* EAFNOSUPPORT */
293

294
  res = pr_netaddr_set_family(addr, AF_INET);
1✔
295
  ck_assert_msg(res == 0, "Failed to set family to AF_INET: %s", strerror(errno));
2✔
296
}
297
END_TEST
1✔
298

299
START_TEST (netaddr_cmp_test) {
1✔
300
  const pr_netaddr_t *addr;
301
#if defined(PR_USE_IPV6)
302
  const pr_netaddr_t *addr2;
303
#endif /* PR_USE_IPV6 */
304
  int res;
305
  const char *name;
306

307
  res = pr_netaddr_cmp(NULL, NULL);
1✔
308
  ck_assert_msg(res == 0, "Expected 0, got %d", res);
1✔
309

310
  name = "127.0.0.1";
1✔
311
  addr = pr_netaddr_get_addr(p, name, NULL);
1✔
312
  ck_assert_msg(addr != NULL, "Failed to resolve '%s': %s", name,
2✔
313
    strerror(errno));
314

315
  res = pr_netaddr_cmp(addr, NULL);
1✔
316
  ck_assert_msg(res == 1, "Expected 1, got %d", res);
2✔
317

318
  res = pr_netaddr_cmp(NULL, addr);
1✔
319
  ck_assert_msg(res == -1, "Expected -1, got %d", res);
2✔
320

321
#if defined(PR_USE_IPV6)
322
  name = "::1";
1✔
323
  addr2 = pr_netaddr_get_addr(p, name, NULL);
1✔
324
  ck_assert_msg(addr2 != NULL, "Failed to resolve '%s': %s", name,
2✔
325
    strerror(errno));
326

327
  res = pr_netaddr_cmp(addr, addr2);
1✔
328
  ck_assert_msg(res == -1, "Expected -1, got %d", res);
2✔
329

330
  res = pr_netaddr_cmp(addr2, addr);
1✔
331
  ck_assert_msg(res == -1, "Expected -1, got %d", res);
2✔
332

333
  name = "::ffff:127.0.0.1";
1✔
334
  addr2 = pr_netaddr_get_addr(p, name, NULL);
1✔
335
  ck_assert_msg(addr2 != NULL, "Failed to resolve '%s': %s", name,
2✔
336
    strerror(errno));
337

338
  res = pr_netaddr_cmp(addr, addr2);
1✔
339
  ck_assert_msg(res == 0, "Expected 0, got %d", res);
2✔
340

341
  res = pr_netaddr_cmp(addr2, addr);
1✔
342
  ck_assert_msg(res == 0, "Expected 0, got %d", res);
2✔
343
#endif /* PR_USE_IPV6 */
344
}
345
END_TEST
1✔
346

347
START_TEST (netaddr_ncmp_test) {
1✔
348
  const pr_netaddr_t *addr;
349
#if defined(PR_USE_IPV6)
350
  const pr_netaddr_t *addr2;
351
#endif /* PR_USE_IPV6 */
352
  int res;
353
  unsigned int nbits = 0;
1✔
354
  const char *name;
355

356
  res = pr_netaddr_ncmp(NULL, NULL, nbits);
1✔
357
  ck_assert_msg(res == 0, "Expected 0, got %d", res);
1✔
358

359
  name = "127.0.0.1";
1✔
360
  addr = pr_netaddr_get_addr(p, name, NULL);
1✔
361
  ck_assert_msg(addr != NULL, "Failed to resolve '%s': %s", name,
2✔
362
    strerror(errno));
363

364
  res = pr_netaddr_ncmp(addr, NULL, nbits);
1✔
365
  ck_assert_msg(res == 1, "Expected 1, got %d", res);
2✔
366

367
  res = pr_netaddr_ncmp(NULL, addr, nbits);
1✔
368
  ck_assert_msg(res == -1, "Expected -1, got %d", res);
2✔
369

370
  res = pr_netaddr_ncmp(NULL, addr, nbits);
1✔
371
  ck_assert_msg(res == -1, "Expected -1, got %d", res);
2✔
372

373
  nbits = 48;
1✔
374
  res = pr_netaddr_ncmp(addr, addr, nbits);
1✔
375
  ck_assert_msg(res == -1, "Expected -1, got %d", res);
2✔
376
  ck_assert_msg(errno == EINVAL, "Expected EINVAL (%d), got %s (%d)", EINVAL,
2✔
377
    strerror(errno), errno);
378

379
#if defined(PR_USE_IPV6)
380
  name = "::1";
1✔
381
  addr2 = pr_netaddr_get_addr(p, name, NULL);
1✔
382
  ck_assert_msg(addr2 != NULL, "Failed to resolve '%s': %s", name,
2✔
383
    strerror(errno));
384

385
  nbits = 0;
1✔
386
  res = pr_netaddr_ncmp(addr, addr2, nbits);
1✔
387
  ck_assert_msg(res == -1, "Expected -1, got %d", res);
2✔
388

389
  res = pr_netaddr_ncmp(addr2, addr, nbits);
1✔
390
  ck_assert_msg(res == -1, "Expected -1, got %d", res);
2✔
391

392
  name = "::ffff:127.0.0.1";
1✔
393
  addr2 = pr_netaddr_get_addr(p, name, NULL);
1✔
394
  ck_assert_msg(addr2 != NULL, "Failed to resolve '%s': %s", name,
2✔
395
    strerror(errno));
396

397
  res = pr_netaddr_ncmp(addr, addr2, nbits);
1✔
398
  ck_assert_msg(res == 0, "Expected 0, got %d", res);
2✔
399

400
  res = pr_netaddr_ncmp(addr2, addr, nbits);
1✔
401
  ck_assert_msg(res == 0, "Expected 0, got %d", res);
2✔
402

403
  nbits = 24;
1✔
404
  res = pr_netaddr_ncmp(addr2, addr, nbits);
1✔
405
  ck_assert_msg(res == 0, "Expected 0, got %d", res);
2✔
406
#endif /* PR_USE_IPV6 */
407
}
408
END_TEST
1✔
409

410
START_TEST (netaddr_fnmatch_test) {
1✔
411
  const pr_netaddr_t *addr;
412
  int flags, res;
413
  const char *name;
414

415
  res = pr_netaddr_fnmatch(NULL, NULL, 0);
1✔
416
  ck_assert_msg(res < 0, "Failed to handle null address");
1✔
417
  ck_assert_msg(errno == EINVAL, "Expected EINVAL (%d), got %s (%d)", EINVAL,
2✔
418
    strerror(errno), errno);
419

420
  name = "localhost";
1✔
421
  addr = pr_netaddr_get_addr(p, name, NULL);
1✔
422
  ck_assert_msg(addr != NULL, "Failed to resolve '%s': %s", name,
2✔
423
    strerror(errno));
424

425
  res = pr_netaddr_fnmatch(addr, NULL, 0);
1✔
426
  ck_assert_msg(res < 0, "Failed to handle null pattern");
2✔
427
  ck_assert_msg(errno == EINVAL, "Expected EINVAL (%d), got %s (%d)", EINVAL,
2✔
428
    strerror(errno), errno);
429

430
  flags = PR_NETADDR_MATCH_DNS;
1✔
431
  res = pr_netaddr_fnmatch(addr, "foo", flags);
1✔
432
  ck_assert_msg(res == FALSE, "Expected FALSE, got %d", res);
2✔
433

434
  res = pr_netaddr_fnmatch(addr, "LOCAL*", flags);
1✔
435
  if (getenv("CI") == NULL) {
1✔
436
    /* This test is sensitive the environment. */
UNCOV
437
    ck_assert_msg(res == TRUE, "Expected TRUE, got %d", res);
×
438
  }
439

440
  flags = PR_NETADDR_MATCH_IP;
1✔
441
  res = pr_netaddr_fnmatch(addr, "foo", flags);
1✔
442
  ck_assert_msg(res == FALSE, "Expected FALSE, got %d", res);
1✔
443

444
  res = pr_netaddr_fnmatch(addr, "127.0*", flags);
1✔
445
  ck_assert_msg(res == TRUE, "Expected TRUE, got %d", res);
2✔
446

447
#if defined(PR_USE_IPV6)
448
  name = "::ffff:127.0.0.1";
1✔
449
  addr = pr_netaddr_get_addr(p, name, NULL);
1✔
450
  ck_assert_msg(addr != NULL, "Failed to resolve '%s': %s", name,
2✔
451
    strerror(errno));
452

453
  res = pr_netaddr_fnmatch(addr, "foo", flags);
1✔
454
  ck_assert_msg(res == FALSE, "Expected FALSE, got %d", res);
2✔
455

456
  res = pr_netaddr_fnmatch(addr, "127.0.*", flags);
1✔
457
  ck_assert_msg(res == TRUE, "Expected TRUE, got %d", res);
2✔
458
#endif /* PR_USE_IPV6 */
459
}
460
END_TEST
1✔
461

462
START_TEST (netaddr_get_sockaddr_test) {
1✔
463
  pr_netaddr_t *addr;
464
  struct sockaddr *sockaddr;
465
  const char *name;
466
#if defined(PR_USE_IPV6)
467
  int family;
468
#endif /* PR_USE_IPV6 */
469

470
  sockaddr = pr_netaddr_get_sockaddr(NULL);
1✔
471
  ck_assert_msg(sockaddr == NULL, "Failed to handle null argument");
1✔
472
  ck_assert_msg(errno == EINVAL, "Expected EINVAL (%d), got %s (%d)", EINVAL,
2✔
473
    strerror(errno), errno);
474

475
  name = "127.0.0.1";
1✔
476
  addr = (pr_netaddr_t *) pr_netaddr_get_addr(p, name, NULL);
1✔
477
  ck_assert_msg(addr != NULL, "Failed to resolve '%s': %s", name,
2✔
478
    strerror(errno));
479

480
  sockaddr = pr_netaddr_get_sockaddr(addr);
1✔
481
  ck_assert_msg(sockaddr != NULL, "Failed to get sock addr: %s", strerror(errno));
2✔
482

483
#if defined(PR_USE_IPV6)
484
  name = "::1";
1✔
485
  addr = (pr_netaddr_t *) pr_netaddr_get_addr(p, name, NULL);
1✔
486
  ck_assert_msg(addr != NULL, "Failed to resolve '%s': %s", name,
2✔
487
    strerror(errno));
488

489
  sockaddr = pr_netaddr_get_sockaddr(addr);
1✔
490
  ck_assert_msg(sockaddr != NULL, "Failed to get sock addr: %s", strerror(errno));
2✔
491

492
  pr_netaddr_disable_ipv6();
1✔
493
  sockaddr = pr_netaddr_get_sockaddr(addr);
1✔
494
  ck_assert_msg(sockaddr == NULL, "Got sock addr for IPv6 addr: %s", strerror(errno));
2✔
495
  ck_assert_msg(errno == EPERM, "Expected EPERM (%d), got %s (%d)", EPERM,
2✔
496
    strerror(errno), errno);
497

498
  pr_netaddr_enable_ipv6();
1✔
499
  family = addr->na_family;
1✔
500
  addr->na_family = 777;
1✔
501
  sockaddr = pr_netaddr_get_sockaddr(addr);
1✔
502
  ck_assert_msg(sockaddr == NULL, "Got sock addr for IPv6 addr: %s", strerror(errno));
2✔
503
  ck_assert_msg(errno == EPERM, "Expected EPERM (%d), got %s (%d)", EPERM,
2✔
504
    strerror(errno), errno);
505
  addr->na_family = family;
1✔
506
#endif /* PR_USE_IPV6 */
507
}
508
END_TEST
1✔
509

510
START_TEST (netaddr_get_sockaddr_len_test) {
1✔
511
  pr_netaddr_t *addr;
512
  size_t res;
513
  const char *name;
514
#if defined(PR_USE_IPV6)
515
  int family;
516
#endif /* PR_USE_IPV6 */
517

518
  res = pr_netaddr_get_sockaddr_len(NULL);
1✔
519
  ck_assert_msg(res == (size_t) -1, "Failed to handle null arguments");
1✔
520
  ck_assert_msg(errno == EINVAL, "Expected EINVAL (%d), got %s (%d)", EINVAL,
2✔
521
    strerror(errno), errno);
522

523
  name = "127.0.0.1";
1✔
524
  addr = (pr_netaddr_t *) pr_netaddr_get_addr(p, name, NULL);
1✔
525
  ck_assert_msg(addr != NULL, "Failed to resolve '%s': %s", name,
2✔
526
    strerror(errno));
527

528
  res = pr_netaddr_get_sockaddr_len(addr);
1✔
529
  ck_assert_msg(res > 0, "Failed to get sockaddr len: %s", strerror(errno));
2✔
530

531
#if defined(PR_USE_IPV6)
532
  name = "::1";
1✔
533
  addr = (pr_netaddr_t *) pr_netaddr_get_addr(p, name, NULL);
1✔
534
  ck_assert_msg(addr != NULL, "Failed to resolve '%s': %s", name,
2✔
535
    strerror(errno));
536

537
  res = pr_netaddr_get_sockaddr_len(addr);
1✔
538
  ck_assert_msg(res > 0, "Failed to get sockaddr len: %s", strerror(errno));
2✔
539

540
  pr_netaddr_disable_ipv6();
1✔
541
  res = pr_netaddr_get_sockaddr_len(addr);
1✔
542
  ck_assert_msg(res == (size_t) -1, "Got sockaddr len unexpectedly");
2✔
543
  ck_assert_msg(errno == EPERM, "Expected EPERM (%d), got %s (%d)", EPERM,
2✔
544
    strerror(errno), errno);
545

546
  pr_netaddr_enable_ipv6();
1✔
547

548
  family = addr->na_family;
1✔
549
  addr->na_family = 777;
1✔
550
  res = pr_netaddr_get_sockaddr_len(addr);
1✔
551
  addr->na_family = family;
1✔
552

553
  ck_assert_msg(res == (size_t) -1, "Got sockaddr len unexpectedly");
2✔
554
  ck_assert_msg(errno == EPERM, "Expected EPERM (%d), got %s (%d)", EPERM,
2✔
555
    strerror(errno), errno);
556
#endif /* PR_USE_IPV6 */
557
}
558
END_TEST
1✔
559

560
START_TEST (netaddr_set_sockaddr_test) {
1✔
561
  pr_netaddr_t *addr;
562
  int res;
563
  struct sockaddr sa;
564
  const char *name;
565
#if defined(PR_USE_IPV6)
566
  int family;
567
# if defined(HAVE_GETADDRINFO)
568
  struct addrinfo hints, *info = NULL;
1✔
569
# endif /* HAVE_GETADDRINFO */
570
#endif /* PR_USE_IPV6 */
571

572
  res = pr_netaddr_set_sockaddr(NULL, NULL);
1✔
573
  ck_assert_msg(res < 0, "Failed to handle null arguments");
1✔
574
  ck_assert_msg(errno == EINVAL, "Expected EINVAL (%d), got %s (%d)", EINVAL,
2✔
575
    strerror(errno), errno);
576

577
  name = "127.0.0.1";
1✔
578
  addr = (pr_netaddr_t *) pr_netaddr_get_addr(p, name, NULL);
1✔
579
  ck_assert_msg(addr != NULL, "Failed to resolve '%s': %s", name,
2✔
580
    strerror(errno));
581

582
  res = pr_netaddr_set_sockaddr(addr, NULL);
1✔
583
  ck_assert_msg(res < 0, "Failed to handle null sockaddr");
2✔
584
  ck_assert_msg(errno == EINVAL, "Expected EINVAL (%d), got %s (%d)", EINVAL,
2✔
585
    strerror(errno), errno);
586

587
  memset(&sa, 0, sizeof(sa));
1✔
588

589
  res = pr_netaddr_set_sockaddr(addr, &sa);
1✔
590
  ck_assert_msg(res == 0, "Failed to set sockaddr: %s", strerror(errno));
2✔
591

592
#if defined(PR_USE_IPV6)
593
  name = "::1";
1✔
594
  addr = (pr_netaddr_t *) pr_netaddr_get_addr(p, name, NULL);
1✔
595
  ck_assert_msg(addr != NULL, "Failed to resolve '%s': %s", name,
2✔
596
    strerror(errno));
597

598
# if defined(HAVE_GETADDRINFO)
599
  memset(&hints, 0, sizeof(hints));
1✔
600
  hints.ai_family = AF_INET6;
1✔
601
  hints.ai_socktype = SOCK_STREAM;
1✔
602
  hints.ai_flags = AI_NUMERICHOST;
603
#  if defined(AI_V4MAPPED)
604
  hints.ai_flags |= AI_V4MAPPED;
1✔
605
#  endif /* AI_V4MAPPED */
606
  res = getaddrinfo("::1", NULL, &hints, &info);
1✔
607
  ck_assert_msg(res == 0, "getaddrinfo('::1') failed: %s", gai_strerror(res));
2✔
608

609
  res = pr_netaddr_set_sockaddr(addr, info->ai_addr);
1✔
610
  ck_assert_msg(res == 0, "Failed to set sockaddr: %s", strerror(errno));
2✔
611

612
  pr_netaddr_disable_ipv6();
1✔
613
  res = pr_netaddr_set_sockaddr(addr, info->ai_addr);
1✔
614
  ck_assert_msg(res < 0, "Set sockaddr unexpectedly");
2✔
615
  ck_assert_msg(errno == EPERM, "Expected EPERM (%d), got %s (%d)", EPERM,
2✔
616
    strerror(errno), errno);
617

618
  freeaddrinfo(info);
1✔
619
  pr_netaddr_enable_ipv6();
1✔
620
# endif /* HAVE_GETADDRINFO */
621

622
  family = addr->na_family;
1✔
623
  addr->na_family = 777;
1✔
624
  res = pr_netaddr_set_sockaddr(addr, &sa);
1✔
625
  addr->na_family = family;
1✔
626

627
  ck_assert_msg(res < 0, "Set sockaddr unexpectedly");
2✔
628
  ck_assert_msg(errno == EPERM, "Expected EPERM (%d), got %s (%d)", EPERM,
2✔
629
    strerror(errno), errno);
630
#endif /* PR_USE_IPV6 */
631
}
632
END_TEST
1✔
633

634
START_TEST (netaddr_set_sockaddr_any_test) {
1✔
635
  pr_netaddr_t *addr;
636
  int res;
637
  const char *name;
638
#if defined(PR_USE_IPV6)
639
  int family;
640
#endif /* PR_USE_IPV6 */
641

642
  res = pr_netaddr_set_sockaddr_any(NULL);
1✔
643
  ck_assert_msg(res < 0, "Failed to handle null arguments");
1✔
644
  ck_assert_msg(errno == EINVAL, "Expected EINVAL (%d), got %s (%d)", EINVAL,
2✔
645
    strerror(errno), errno);
646

647
  name = "127.0.0.1";
1✔
648
  addr = (pr_netaddr_t *) pr_netaddr_get_addr(p, name, NULL);
1✔
649
  ck_assert_msg(addr != NULL, "Failed to resolve '%s': %s", name,
2✔
650
    strerror(errno));
651

652
  res = pr_netaddr_set_sockaddr_any(addr);
1✔
653
  ck_assert_msg(res == 0, "Failed to set sockaddr any: %s", strerror(errno));
2✔
654

655
#if defined(PR_USE_IPV6)
656
  name = "::1";
1✔
657
  addr = (pr_netaddr_t *) pr_netaddr_get_addr(p, name, NULL);
1✔
658
  ck_assert_msg(addr != NULL, "Failed to resolve '%s': %s", name,
2✔
659
    strerror(errno));
660

661
  res = pr_netaddr_set_sockaddr_any(addr);
1✔
662
  ck_assert_msg(res == 0, "Failed to set sockaddr any: %s", strerror(errno));
2✔
663

664
  pr_netaddr_disable_ipv6();
1✔
665
  res = pr_netaddr_set_sockaddr_any(addr);
1✔
666
  ck_assert_msg(res < 0, "Set sockaddr any unexpectedly");
2✔
667
  ck_assert_msg(errno == EPERM, "Expected EPERM (%d), got %s (%d)", EPERM,
2✔
668
    strerror(errno), errno);
669

670
  pr_netaddr_enable_ipv6();
1✔
671

672
  family = addr->na_family;
1✔
673
  addr->na_family = 777;
1✔
674
  res = pr_netaddr_set_sockaddr_any(addr);
1✔
675
  addr->na_family = family;
1✔
676

677
  ck_assert_msg(res < 0, "Set sockaddr any unexpectedly");
2✔
678
  ck_assert_msg(errno == EPERM, "Expected EPERM (%d), got %s (%d)", EPERM,
2✔
679
    strerror(errno), errno);
680
#endif /* PR_USE_IPV6 */
681
}
682
END_TEST
1✔
683

684
START_TEST (netaddr_get_inaddr_test) {
1✔
685
  pr_netaddr_t *addr;
686
  void *inaddr;
687
  const char *name;
688
#if defined(PR_USE_IPV6)
689
  int family;
690
#endif /* PR_USE_IPV6 */
691

692
  inaddr = pr_netaddr_get_inaddr(NULL);
1✔
693
  ck_assert_msg(inaddr == NULL, "Failed to handle null arguments");
1✔
694
  ck_assert_msg(errno == EINVAL, "Expected EINVAL (%d), got %s (%d)", EINVAL,
2✔
695
    strerror(errno), errno);
696

697
  name = "127.0.0.1";
1✔
698
  addr = (pr_netaddr_t *) pr_netaddr_get_addr(p, name, NULL);
1✔
699
  ck_assert_msg(addr != NULL, "Failed to resolve '%s': %s", name,
2✔
700
    strerror(errno));
701

702
  inaddr = pr_netaddr_get_inaddr(addr);
1✔
703
  ck_assert_msg(inaddr != NULL, "Failed to get inaddr: %s", strerror(errno));
2✔
704

705
#if defined(PR_USE_IPV6)
706
  family = AF_INET6;
1✔
707
  name = "::1";
1✔
708
  addr = (pr_netaddr_t *) pr_netaddr_get_addr(p, name, NULL);
1✔
709
  ck_assert_msg(addr != NULL, "Failed to resolve '%s': %s", name,
2✔
710
    strerror(errno));
711

712
  inaddr = pr_netaddr_get_inaddr(addr);
1✔
713
  ck_assert_msg(inaddr != NULL, "Failed to get inaddr: %s", strerror(errno));
2✔
714

715
  pr_netaddr_disable_ipv6();
1✔
716
  inaddr = pr_netaddr_get_inaddr(addr);
1✔
717
  ck_assert_msg(inaddr == NULL, "Got inaddr unexpectedly");
2✔
718
  ck_assert_msg(errno == EPERM, "Expected EPERM (%d), got %s (%d)", EPERM,
2✔
719
    strerror(errno), errno);
720

721
  pr_netaddr_enable_ipv6();
1✔
722

723
  family = addr->na_family;
1✔
724
  addr->na_family = 777;
1✔
725
  inaddr = pr_netaddr_get_inaddr(addr);
1✔
726
  addr->na_family = family;
1✔
727

728
  ck_assert_msg(inaddr == NULL, "Got inaddr unexpectedly");
2✔
729
  ck_assert_msg(errno == EPERM, "Expected EPERM (%d), got %s (%d)", EPERM,
2✔
730
    strerror(errno), errno);
731
#endif /* PR_USE_IPV6 */
732
}
733
END_TEST
1✔
734

735
START_TEST (netaddr_get_inaddr_len_test) {
1✔
736
  pr_netaddr_t *addr;
737
  size_t res;
738
  const char *name;
739
#if defined(PR_USE_IPV6)
740
  int family;
741
#endif /* PR_USE_IPV6 */
742

743
  res = pr_netaddr_get_inaddr_len(NULL);
1✔
744
  ck_assert_msg(res == (size_t) -1, "Failed to handle null arguments");
1✔
745
  ck_assert_msg(errno == EINVAL, "Expected EINVAL (%d), got %s (%d)", EINVAL,
2✔
746
    strerror(errno), errno);
747

748
  name = "127.0.0.1";
1✔
749
  addr = (pr_netaddr_t *) pr_netaddr_get_addr(p, name, NULL);
1✔
750
  ck_assert_msg(addr != NULL, "Failed to resolve '%s': %s", name,
2✔
751
    strerror(errno));
752

753
  res = pr_netaddr_get_inaddr_len(addr);
1✔
754
  ck_assert_msg(res > 0, "Failed to get inaddr len: %s", strerror(errno));
2✔
755

756
#if defined(PR_USE_IPV6)
757
  name = "::1";
1✔
758
  addr = (pr_netaddr_t *) pr_netaddr_get_addr(p, name, NULL);
1✔
759
  ck_assert_msg(addr != NULL, "Failed to resolve '%s': %s", name,
2✔
760
    strerror(errno));
761

762
  res = pr_netaddr_get_inaddr_len(addr);
1✔
763
  ck_assert_msg(res > 0, "Failed to get inaddr len: %s", strerror(errno));
2✔
764

765
  family = addr->na_family;
1✔
766
  addr->na_family = 777;
1✔
767
  res = pr_netaddr_get_inaddr_len(addr);
1✔
768
  addr->na_family = family;
1✔
769

770
  ck_assert_msg(res == (size_t) -1, "Got inaddr len unexpectedly");
2✔
771
  ck_assert_msg(errno == EPERM, "Expected EPERM (%d), got %s (%d)", EPERM,
2✔
772
    strerror(errno), errno);
773
#endif /* PR_USE_IPV6 */
774
}
775
END_TEST
1✔
776

777
START_TEST (netaddr_get_port_test) {
1✔
778
  pr_netaddr_t *addr;
779
  unsigned int res;
780

781
  res = pr_netaddr_get_port(NULL);
1✔
782
  ck_assert_msg(res == 0, "Failed to handle null addr");
1✔
783
  ck_assert_msg(errno == EINVAL, "Failed to set errno to EINVAL");
2✔
784

785
  addr = (pr_netaddr_t *) pr_netaddr_get_addr(p, "127.0.0.1", NULL);
1✔
786
  ck_assert_msg(addr != NULL, "Failed to get addr for '127.0.0.1': %s",
2✔
787
    strerror(errno));
788

789
  res = pr_netaddr_get_port(addr);
1✔
790
  ck_assert_msg(res == 0, "Expected port %u, got %u", 0, res);
2✔
791

792
  addr->na_family = -1;
1✔
793
  res = pr_netaddr_get_port(addr);
1✔
794
  ck_assert_msg(res == 0, "Expected port %u, got %u", 0, res);
2✔
795
  ck_assert_msg(errno == EPERM, "Failed to set errno to EPERM");
2✔
796
}
797
END_TEST
1✔
798

799
START_TEST (netaddr_set_port_test) {
1✔
800
  pr_netaddr_t *addr;
801
  unsigned int port;
802
  int res;
803

804
  res = pr_netaddr_set_port(NULL, 0);
1✔
805
  ck_assert_msg(res == -1, "Failed to handle null addr");
1✔
806
  ck_assert_msg(errno == EINVAL, "Failed to set errno to EINVAL");
2✔
807

808
  addr = (pr_netaddr_t *) pr_netaddr_get_addr(p, "127.0.0.1", NULL);
1✔
809
  ck_assert_msg(addr != NULL, "Failed to get addr for '127.0.0.1': %s",
2✔
810
    strerror(errno));
811

812
  addr->na_family = -1;
1✔
813
  res = pr_netaddr_set_port(addr, 1);
1✔
814
  ck_assert_msg(res == -1, "Failed to handle bad family");
2✔
815
  ck_assert_msg(errno == EPERM, "Failed to set errno to EPERM");
2✔
816

817
  addr->na_family = AF_INET;
1✔
818
  res = pr_netaddr_set_port(addr, 1);
1✔
819
  ck_assert_msg(res == 0, "Failed to set port: %s", strerror(errno));
2✔
820

821
  port = pr_netaddr_get_port(addr);
1✔
822
  ck_assert_msg(port == 1, "Expected port %u, got %u", 1, port);
2✔
823
}
824
END_TEST
1✔
825

826
START_TEST (netaddr_set_reverse_dns_test) {
1✔
827
  int res;
828

829
  res = pr_netaddr_set_reverse_dns(FALSE);
1✔
830
  ck_assert_msg(res == 1, "Expected reverse %d, got %d", 1, res);
1✔
831

832
  res = pr_netaddr_set_reverse_dns(TRUE);
1✔
833
  ck_assert_msg(res == 0, "Expected reverse %d, got %d", 0, res);
2✔
834
}
835
END_TEST
1✔
836

837
START_TEST (netaddr_get_dnsstr_test) {
1✔
838
  const pr_netaddr_t *addr;
839
  const char *ip, *res;
840

841
  ip = "127.0.0.1";
1✔
842

843
  res = pr_netaddr_get_dnsstr(NULL);
1✔
844
  ck_assert_msg(res == NULL, "Failed to handle null argument");
1✔
845
  ck_assert_msg(errno == EINVAL, "Failed to set errno to EINVAL");
2✔
846

847
  addr = pr_netaddr_get_addr(p, ip, NULL);
1✔
848
  ck_assert_msg(addr != NULL, "Failed to get addr for '%s': %s", ip,
2✔
849
    strerror(errno));
850

851
  pr_netaddr_set_reverse_dns(FALSE);
1✔
852

853
  res = pr_netaddr_get_dnsstr(addr);
1✔
854
  ck_assert_msg(res != NULL, "Failed to get DNS str for addr: %s",
2✔
855
    strerror(errno));
856
  ck_assert_msg(strcmp(res, ip) == 0, "Expected '%s', got '%s'", ip, res);
2✔
857

858
  pr_netaddr_set_reverse_dns(TRUE);
1✔
859

860
  /* Even though we should expect a DNS name, not an IP address, the
861
   * previous call to pr_netaddr_get_dnsstr() cached the IP address.
862
   */
863
  res = pr_netaddr_get_dnsstr(addr);
1✔
864
  ck_assert_msg(res != NULL, "Failed to get DNS str for addr: %s",
2✔
865
    strerror(errno));
866
  ck_assert_msg(strcmp(res, ip) == 0, "Expected '%s', got '%s'", ip, res);
2✔
867

868
  pr_netaddr_clear((pr_netaddr_t *) addr);
1✔
869

870
  /* Clearing the address doesn't work, since that removes even the address
871
   * info, in addition to the cached strings.
872
   */
873
  res = pr_netaddr_get_dnsstr(addr);
1✔
874
  ck_assert_msg(res != NULL, "Failed to get DNS str for addr: %s",
2✔
875
    strerror(errno));
876
  ck_assert_msg(strcmp(res, "") == 0, "Expected '%s', got '%s'", "", res);
2✔
877

878
  /* We need to clear the netaddr internal cache as well. */
879
  pr_netaddr_clear_ipcache(ip);
1✔
880
  addr = pr_netaddr_get_addr(p, ip, NULL);
1✔
881
  ck_assert_msg(addr != NULL, "Failed to get addr for '%s': %s", ip,
2✔
882
    strerror(errno));
883

884
  mark_point();
1✔
885
  ck_assert_msg(addr->na_have_dnsstr == 0, "addr already has cached DNS str");
2✔
886

887
  mark_point();
1✔
888
  res = pr_netaddr_get_dnsstr(addr);
1✔
889
  ck_assert_msg(res != NULL, "Failed to get DNS str for addr: %s",
2✔
890
    strerror(errno));
891

892
  mark_point();
1✔
893

894
  /* Depending on the contents of /etc/hosts, resolving 127.0.0.1 could
895
   * return either "localhost" or "localhost.localdomain".  Perhaps even
896
   * other variations, although these should be the most common.
897
   */
898
  if (getenv("CI") == NULL) {
1✔
899
    /* This test is sensitive the environment. */
UNCOV
900
    ck_assert_msg(strcmp(res, "localhost") == 0 ||
×
901
                strcmp(res, "localhost.localdomain") == 0,
902
      "Expected '%s', got '%s'", "localhost or localhost.localdomain", res);
903
  }
904
}
905
END_TEST
1✔
906

907
START_TEST (netaddr_get_dnsstr_list_test) {
1✔
908
  array_header *res, *addrs = NULL;
1✔
909
  const pr_netaddr_t *addr;
910
  int reverse_dns;
911
  const char *dnsstr;
912

913
  res = pr_netaddr_get_dnsstr_list(NULL, NULL);
1✔
914
  ck_assert_msg(res == NULL, "Failed to handle null pool");
1✔
915
  ck_assert_msg(errno == EINVAL, "Expected EINVAL (%d), got %s (%d)", EINVAL,
2✔
916
    strerror(errno), errno);
917

918
  res = pr_netaddr_get_dnsstr_list(p, NULL);
1✔
919
  ck_assert_msg(res == NULL, "Failed to handle null address");
2✔
920
  ck_assert_msg(errno == EINVAL, "Expected EINVAL (%d), got %s (%d)", EINVAL,
2✔
921
    strerror(errno), errno);
922

923
  addr = pr_netaddr_get_addr(p, "localhost", NULL);
1✔
924
  ck_assert_msg(addr != NULL, "Failed to resolve 'localhost': %s",
2✔
925
    strerror(errno));
926

927
  res = pr_netaddr_get_dnsstr_list(p, addr);
1✔
928
  ck_assert_msg(res != NULL, "Failed to get DNS list: %s", strerror(errno));
2✔
929

930
  reverse_dns = pr_netaddr_set_reverse_dns(TRUE);
1✔
931

932
  pr_netaddr_clear_cache();
1✔
933

934
#if defined(PR_USE_NETWORK_TESTS)
935
  addr = pr_netaddr_get_addr(p, "www.google.com", &addrs);
1✔
936
  ck_assert_msg(addr != NULL, "Failed to resolve 'www.google.com': %s",
2✔
937
    strerror(errno));
938

939
  dnsstr = pr_netaddr_get_dnsstr(addr);
1✔
940
  ck_assert_msg(dnsstr != NULL, "Failed to get DNS string for '%s': %s",
2✔
941
    pr_netaddr_get_ipstr(addr), strerror(errno));
942

943
  /* We may get a DNS name, but there is no guarantee that the reverse
944
   * DNS lookup will return the original "www.google.com" we requested.
945
   */
946

947
  res = pr_netaddr_get_dnsstr_list(p, addr);
1✔
948
  ck_assert_msg(res != NULL, "Failed to get DNS list: %s", strerror(errno));
2✔
949

950
  /* Ideally we would check that res->nelts > 0, BUT this turns out to
951
   * a fragile test condition, dependent on DNS vagaries.
952
   */
953
#endif /* PR_USE_NETWORK_TESTS */
954

955
  pr_netaddr_set_reverse_dns(reverse_dns);
1✔
956
}
957
END_TEST
1✔
958

959
#if defined(PR_USE_IPV6)
960
START_TEST (netaddr_get_dnsstr_ipv6_test) {
1✔
961
  const pr_netaddr_t *addr;
962
  const char *ip, *res;
963

964
  ip = "::1";
1✔
965

966
  res = pr_netaddr_get_dnsstr(NULL);
1✔
967
  ck_assert_msg(res == NULL, "Failed to handle null argument");
1✔
968
  ck_assert_msg(errno == EINVAL, "Failed to set errno to EINVAL");
2✔
969

970
  addr = pr_netaddr_get_addr(p, ip, NULL);
1✔
971
  ck_assert_msg(addr != NULL, "Failed to get addr for '%s': %s", ip,
2✔
972
    strerror(errno));
973

974
  pr_netaddr_set_reverse_dns(FALSE);
1✔
975

976
  res = pr_netaddr_get_dnsstr(addr);
1✔
977
  ck_assert_msg(res != NULL, "Failed to get DNS str for addr: %s",
2✔
978
    strerror(errno));
979
  ck_assert_msg(strcmp(res, ip) == 0, "Expected '%s', got '%s'", ip, res);
2✔
980

981
  pr_netaddr_set_reverse_dns(TRUE);
1✔
982

983
  /* Even though we should expect a DNS name, not an IP address, the
984
   * previous call to pr_netaddr_get_dnsstr() cached the IP address.
985
   */
986
  res = pr_netaddr_get_dnsstr(addr);
1✔
987
  ck_assert_msg(res != NULL, "Failed to get DNS str for addr: %s",
2✔
988
    strerror(errno));
989
  ck_assert_msg(strcmp(res, ip) == 0, "Expected '%s', got '%s'", ip, res);
2✔
990

991
  pr_netaddr_clear((pr_netaddr_t *) addr);
1✔
992

993
  /* Clearing the address doesn't work, since that removes even the address
994
   * info, in addition to the cached strings.
995
   */
996
  res = pr_netaddr_get_dnsstr(addr);
1✔
997
  ck_assert_msg(res != NULL, "Failed to get DNS str for addr: %s",
2✔
998
    strerror(errno));
999
  ck_assert_msg(strcmp(res, "") == 0, "Expected '%s', got '%s'", "", res);
2✔
1000

1001
  /* We need to clear the netaddr internal cache as well. */
1002
  pr_netaddr_clear_ipcache(ip);
1✔
1003
  addr = pr_netaddr_get_addr(p, ip, NULL);
1✔
1004
  ck_assert_msg(addr != NULL, "Failed to get addr for '%s': %s", ip,
2✔
1005
    strerror(errno));
1006

1007
  mark_point();
1✔
1008
  ck_assert_msg(addr->na_have_dnsstr == 0, "addr already has cached DNS str");
2✔
1009

1010
  mark_point();
1✔
1011
  res = pr_netaddr_get_dnsstr(addr);
1✔
1012
  ck_assert_msg(res != NULL, "Failed to get DNS str for addr: %s",
2✔
1013
    strerror(errno));
1014

1015
  mark_point();
1✔
1016

1017
  /* Depending on the contents of /etc/hosts, resolving ::1 could
1018
   * return either "localhost" or "localhost.localdomain".  Perhaps even
1019
   * other variations, although these should be the most common.
1020
   */
1021
  if (getenv("CI") == NULL) {
1✔
UNCOV
1022
    ck_assert_msg(strcmp(res, "localhost") == 0 ||
×
1023
                  strcmp(res, "localhost.localdomain") == 0 ||
1024
                  strcmp(res, "localhost6") == 0 ||
1025
                  strcmp(res, "localhost6.localdomain") == 0 ||
1026
                  strcmp(res, "ip6-localhost") == 0 ||
1027
                  strcmp(res, "ip6-loopback") == 0 ||
1028
                  strcmp(res, ip) == 0,
1029
      "Expected '%s', got '%s'", "localhost, localhost.localdomain et al", res);
1030
  }
1031
}
1032
END_TEST
1✔
1033
#endif /* PR_USE_IPV6 */
1034

1035
START_TEST (netaddr_get_ipstr_test) {
1✔
1036
  const pr_netaddr_t *addr;
1037
  const char *res;
1038

1039
  res = pr_netaddr_get_ipstr(NULL);
1✔
1040
  ck_assert_msg(res == NULL, "Failed to handle null argument");
1✔
1041
  ck_assert_msg(errno == EINVAL, "Failed to set errno to EINVAL");
2✔
1042

1043
  addr = pr_netaddr_get_addr(p, "localhost", NULL);
1✔
1044
  ck_assert_msg(addr != NULL, "Failed to get addr for 'localhost': %s",
2✔
1045
    strerror(errno));
1046

1047
  res = pr_netaddr_get_ipstr(addr);
1✔
1048
  ck_assert_msg(res != NULL, "Failed to get IP str for addr: %s",
2✔
1049
    strerror(errno));
1050
  ck_assert_msg(strcmp(res, "127.0.0.1") == 0, "Expected '%s', got '%s'",
2✔
1051
    "127.0.0.1", res);
1052
  ck_assert_msg(addr->na_have_ipstr == 1, "addr should have cached IP str");
2✔
1053

1054
  pr_netaddr_clear((pr_netaddr_t *) addr);
1✔
1055
  res = pr_netaddr_get_ipstr(addr);
1✔
1056
  ck_assert_msg(res == NULL, "Expected null, got '%s'", res);
2✔
1057
}
1058
END_TEST
1✔
1059

1060
START_TEST (netaddr_validate_dns_str_test) {
1✔
1061
  char *res, *str;
1062

1063
  res = pr_netaddr_validate_dns_str(NULL);
1✔
1064
  ck_assert_msg(res == NULL, "Failed to handle null argument");
1✔
1065
  ck_assert_msg(errno == EINVAL, "Failed to set errno to EINVAL");
2✔
1066

1067
  str = pstrdup(p, "foo");
1✔
1068
  res = pr_netaddr_validate_dns_str(str);
1✔
1069
  ck_assert_msg(strcmp(res, str) == 0, "Expected '%s', got '%s'", str, res);
2✔
1070

1071
  str = pstrdup(p, "[foo]");
1✔
1072
  res = pr_netaddr_validate_dns_str(str);
1✔
1073
  ck_assert_msg(strcmp(res, "_foo_") == 0, "Expected '%s', got '%s'",
2✔
1074
    "_foo_", res);
1075

1076
  str = pstrdup(p, "foo.");
1✔
1077
  res = pr_netaddr_validate_dns_str(str);
1✔
1078
  ck_assert_msg(strcmp(res, str) == 0, "Expected '%s', got '%s'",
2✔
1079
    str, res);
1080

1081
  str = pstrdup(p, "foo:");
1✔
1082
  res = pr_netaddr_validate_dns_str(str);
1✔
1083
#if defined(PR_USE_IPV6)
1084
  ck_assert_msg(strcmp(res, str) == 0, "Expected '%s', got '%s'",
2✔
1085
    str, res);
1086
#else
1087
  ck_assert_msg(strcmp(res, "foo_") == 0, "Expected '%s', got '%s'",
1088
    "foo_", res);
1089
#endif /* PR_USE_IPV6 */
1090
}
1091
END_TEST
1✔
1092

1093
START_TEST (netaddr_get_localaddr_str_test) {
1✔
1094
  const char *res;
1095

1096
  res = pr_netaddr_get_localaddr_str(NULL);
1✔
1097
  ck_assert_msg(res == NULL, "Failed to handle null argument");
1✔
1098
  ck_assert_msg(errno == EINVAL, "Failed to set errno to EINVAL");
2✔
1099

1100
  res = pr_netaddr_get_localaddr_str(p);
1✔
1101
  ck_assert_msg(res != NULL, "Failed to get local addr: %s", strerror(errno));
2✔
1102
}
1103
END_TEST
1✔
1104

1105
START_TEST (netaddr_is_loopback_test) {
1✔
1106
  const pr_netaddr_t *addr;
1107
  int res;
1108
  const char *name;
1109

1110
  res = pr_netaddr_is_loopback(NULL);
1✔
1111
  ck_assert_msg(res < 0, "Failed to handle null arguments");
1✔
1112
  ck_assert_msg(errno == EINVAL, "Expected EINVAL (%d), got %s (%d)", EINVAL,
2✔
1113
    strerror(errno), errno);
1114

1115
#if defined(PR_USE_NETWORK_TESTS)
1116
  name = "www.google.com";
1✔
1117
  addr = pr_netaddr_get_addr(p, name, NULL);
1✔
1118
  ck_assert_msg(addr != NULL, "Failed to resolve '%s': %s", name,
2✔
1119
    strerror(errno));
1120

1121
  res = pr_netaddr_is_loopback(addr);
1✔
1122
  ck_assert_msg(res == FALSE, "Expected FALSE, got %d", res);
2✔
1123
#endif /* PR_USE_NETWORK_TESTS */
1124

1125
  name = "127.0.0.1";
1✔
1126
  addr = pr_netaddr_get_addr(p, name, NULL);
1✔
1127
  ck_assert_msg(addr != NULL, "Failed to resolve '%s': %s", name,
2✔
1128
    strerror(errno));
1129

1130
  res = pr_netaddr_is_loopback(addr);
1✔
1131
  ck_assert_msg(res == TRUE, "Expected TRUE, got %d", res);
2✔
1132

1133
#if defined(PR_USE_IPV6)
1134
  name = "::1";
1✔
1135
  addr = pr_netaddr_get_addr(p, name, NULL);
1✔
1136
  ck_assert_msg(addr != NULL, "Failed to resolve '%s': %s", name,
2✔
1137
    strerror(errno));
1138

1139
  res = pr_netaddr_is_loopback(addr);
1✔
1140
  ck_assert_msg(res == TRUE, "Expected TRUE, got %d", res);
2✔
1141

1142
  name = "::ffff:127.0.0.1";
1✔
1143
  addr = pr_netaddr_get_addr(p, name, NULL);
1✔
1144
  ck_assert_msg(addr != NULL, "Failed to resolve '%s': %s", name,
2✔
1145
    strerror(errno));
1146

1147
  res = pr_netaddr_is_loopback(addr);
1✔
1148
  ck_assert_msg(res == TRUE, "Expected TRUE, got %d", res);
2✔
1149
#endif /* PR_USE_IPV6 */
1150
}
1151
END_TEST
1✔
1152

1153
START_TEST (netaddr_is_v4_test) {
1✔
1154
  int res;
1155
  const char *name;
1156

1157
  res = pr_netaddr_is_v4(NULL);
1✔
1158
  ck_assert_msg(res == -1, "Failed to handle null arguments");
1✔
1159
  ck_assert_msg(errno == EINVAL, "Failed to set errno to EINVAL");
2✔
1160

1161
  name = "::1";
1✔
1162
  res = pr_netaddr_is_v4(name);
1✔
1163
  ck_assert_msg(res == FALSE, "Expected 'false' for IPv6 address '%s', got %d",
2✔
1164
    name, res);
1165

1166
  name = "localhost";
1✔
1167
  res = pr_netaddr_is_v4(name);
1✔
1168
  ck_assert_msg(res == FALSE, "Expected 'false' for DNS name '%s', got %d",
2✔
1169
    name, res);
1170

1171
  name = "127.0.0.1";
1✔
1172
  res = pr_netaddr_is_v4(name);
1✔
1173
  ck_assert_msg(res == TRUE, "Expected 'true' for IPv4 address '%s', got %d",
2✔
1174
    name, res);
1175
}
1176
END_TEST
1✔
1177

1178
START_TEST (netaddr_is_v6_test) {
1✔
1179
  int res;
1180
  const char *name;
1181

1182
  res = pr_netaddr_is_v6(NULL);
1✔
1183
  ck_assert_msg(res == -1, "Failed to handle null arguments");
1✔
1184
  ck_assert_msg(errno == EINVAL, "Failed to set errno to EINVAL");
2✔
1185

1186
  name = "127.0.0.1";
1✔
1187
  res = pr_netaddr_is_v6(name);
1✔
1188
  ck_assert_msg(res == FALSE, "Expected 'false' for IPv4 address '%s', got %d",
2✔
1189
    name, res);
1190

1191
  name = "localhost";
1✔
1192
  res = pr_netaddr_is_v6(name);
1✔
1193
  ck_assert_msg(res == FALSE, "Expected 'false' for DNS name '%s', got %d",
2✔
1194
    name, res);
1195

1196
  pr_netaddr_enable_ipv6();
1✔
1197

1198
  if (pr_netaddr_use_ipv6() == TRUE) {
1✔
1199
    name = "::1";
1✔
1200
    res = pr_netaddr_is_v6(name);
1✔
1201
    ck_assert_msg(res == TRUE, "Expected 'true' for IPv6 address '%s', got %d",
1✔
1202
      name, res);
1203
  }
1204
}
1205
END_TEST
1✔
1206

1207
START_TEST (netaddr_is_v4mappedv6_test) {
1✔
1208
  int res;
1209
  const char *name;
1210
  const pr_netaddr_t *addr;
1211

1212
  res = pr_netaddr_is_v4mappedv6(NULL);
1✔
1213
  ck_assert_msg(res == -1, "Failed to handle null arguments");
1✔
1214
  ck_assert_msg(errno == EINVAL, "Failed to set errno to EINVAL");
2✔
1215

1216
  name = "127.0.0.1";
1✔
1217
  addr = pr_netaddr_get_addr(p, name, NULL);
1✔
1218
  ck_assert_msg(addr != NULL, "Failed to get addr for '%s': %s", name,
2✔
1219
    strerror(errno));
1220
  res = pr_netaddr_is_v4mappedv6(addr);
1✔
1221
  ck_assert_msg(res == -1, "Expected -1 for IPv4 address '%s', got %d",
2✔
1222
    name, res);
1223
  ck_assert_msg(errno == EINVAL, "Failed to set errno to EINVAL; got %d [%s]",
2✔
1224
    errno, strerror(errno));
1225

1226
  name = "::1";
1✔
1227
  addr = pr_netaddr_get_addr(p, name, NULL);
1✔
1228
#if defined(PR_USE_IPV6)
1229
  ck_assert_msg(addr != NULL, "Failed to get addr for '%s': %s", name,
2✔
1230
    strerror(errno));
1231
  res = pr_netaddr_is_v4mappedv6(addr);
1✔
1232
  ck_assert_msg(res == FALSE, "Expected 'false' for IPv6 address '%s', got %d",
2✔
1233
    name, res);
1234
  ck_assert_msg(errno == EINVAL, "Failed to set errno to EINVAL; got %d [%s]",
2✔
1235
    errno, strerror(errno));
1236
#else
1237
  ck_assert_msg(addr == NULL,
1238
    "IPv6 support disabled, should not be able to get addr for '%s'", name);
1239
#endif /* PR_USE_IPV6 */
1240

1241
  name = "::ffff:127.0.0.1";
1✔
1242
  addr = pr_netaddr_get_addr(p, name, NULL);
1✔
1243
#if defined(PR_USE_IPV6)
1244
  ck_assert_msg(addr != NULL, "Failed to get addr for '%s': %s", name,
2✔
1245
    strerror(errno));
1246
  res = pr_netaddr_is_v4mappedv6(addr);
1✔
1247
  ck_assert_msg(res == TRUE,
2✔
1248
    "Expected 'true' for IPv4-mapped IPv6 address '%s', got %d", name, res);
1249
#else
1250
  if (addr != NULL) {
1251
    ck_assert_msg(res == -1,
1252
      "Expected -1 for IPv4-mapped IPv6 address '%s' (--disable-ipv6 used)",
1253
      name);
1254
    ck_assert_msg(errno == EINVAL, "Failed to set errno to EINVAL; got %d [%s]",
1255
      errno, strerror(errno));
1256
  }
1257
#endif /* PR_USE_IPV6 */
1258
}
1259
END_TEST
1✔
1260

1261
START_TEST (netaddr_is_rfc1918_test) {
1✔
1262
  int res;
1263
  const char *name;
1264
  const pr_netaddr_t *addr;
1265

1266
  res = pr_netaddr_is_rfc1918(NULL);
1✔
1267
  ck_assert_msg(res == -1, "Failed to handle null arguments");
1✔
1268
  ck_assert_msg(errno == EINVAL, "Failed to set errno to EINVAL");
2✔
1269

1270
  name = "127.0.0.1";
1✔
1271
  addr = pr_netaddr_get_addr(p, name, NULL);
1✔
1272
  ck_assert_msg(addr != NULL, "Failed to get addr for '%s': %s", name,
2✔
1273
    strerror(errno));
1274
  res = pr_netaddr_is_rfc1918(addr);
1✔
1275
  ck_assert_msg(res == FALSE, "Failed to handle non-RFC1918 IPv4 address");
2✔
1276
  ck_assert_msg(errno == EINVAL, "Failed to set errno to EINVAL, got %s (%d)",
2✔
1277
    strerror(errno), errno);
1278

1279
  name = "::1";
1✔
1280
  addr = pr_netaddr_get_addr(p, name, NULL);
1✔
1281
#if defined(PR_USE_IPV6)
1282
  ck_assert_msg(addr != NULL, "Failed to get addr for '%s': %s", name,
2✔
1283
    strerror(errno));
1284
  res = pr_netaddr_is_rfc1918(addr);
1✔
1285
  ck_assert_msg(res == FALSE, "Failed to handle IPv6 address");
2✔
1286
  ck_assert_msg(errno == EINVAL, "Failed to set errno to EINVAL");
2✔
1287
#else
1288
  ck_assert_msg(addr == NULL,
1289
    "IPv6 support disabled, should not be able to get addr for '%s'", name);
1290
#endif /* PR_USE_IPV6 */
1291

1292
  name = "10.0.0.1";
1✔
1293
  addr = pr_netaddr_get_addr(p, name, NULL);
1✔
1294
  ck_assert_msg(addr != NULL, "Failed to get addr for '%s': %s", name,
2✔
1295
    strerror(errno));
1296
  res = pr_netaddr_is_rfc1918(addr);
1✔
1297
  ck_assert_msg(res == TRUE, "Expected 'true' for address '%s'", name);
2✔
1298

1299
  name = "192.168.0.1";
1✔
1300
  addr = pr_netaddr_get_addr(p, name, NULL);
1✔
1301
  ck_assert_msg(addr != NULL, "Failed to get addr for '%s': %s", name,
2✔
1302
    strerror(errno));
1303
  res = pr_netaddr_is_rfc1918(addr);
1✔
1304
  ck_assert_msg(res == TRUE, "Expected 'true' for address '%s'", name);
2✔
1305

1306
  name = "172.31.200.55";
1✔
1307
  addr = pr_netaddr_get_addr(p, name, NULL);
1✔
1308
  ck_assert_msg(addr != NULL, "Failed to get addr for '%s': %s", name,
2✔
1309
    strerror(errno));
1310
  res = pr_netaddr_is_rfc1918(addr);
1✔
1311
  ck_assert_msg(res == TRUE, "Expected 'true' for address '%s'", name);
2✔
1312
}
1313
END_TEST
1✔
1314

1315
START_TEST (netaddr_v6tov4_test) {
1✔
1316
  const pr_netaddr_t *addr, *addr2;
1317
  const char *name;
1318
#if defined(PR_USE_IPV6)
1319
  const char *ipstr;
1320
#endif /* PR_USE_IPV6 */
1321

1322
  addr = pr_netaddr_v6tov4(NULL, NULL);
1✔
1323
  ck_assert_msg(addr == NULL, "Failed to handle null arguments");
1✔
1324
  ck_assert_msg(errno == EINVAL, "Expected EINVAL (%d), got %s (%d)", EINVAL,
2✔
1325
    strerror(errno), errno);
1326

1327
  addr = pr_netaddr_v6tov4(p, NULL);
1✔
1328
  ck_assert_msg(addr == NULL, "Failed to handle null address");
2✔
1329
  ck_assert_msg(errno == EINVAL, "Expected EINVAL (%d), got %s (%d)", EINVAL,
2✔
1330
    strerror(errno), errno);
1331

1332
  name = "127.0.0.1";
1✔
1333
  addr2 = pr_netaddr_get_addr(p, name, NULL);
1✔
1334
  ck_assert_msg(addr2 != NULL, "Failed to resolve '%s': %s", name,
2✔
1335
    strerror(errno));
1336

1337
  addr = pr_netaddr_v6tov4(p, addr2);
1✔
1338
  ck_assert_msg(addr == NULL, "Converted '%s' to IPv4 address unexpectedly",
2✔
1339
    name);
1340
  ck_assert_msg(errno == EPERM, "Expected EPERM (%d), got %s (%d)", EPERM,
2✔
1341
    strerror(errno), errno);
1342

1343
#if defined(PR_USE_IPV6)
1344
  name = "::ffff:127.0.0.1";
1✔
1345
  addr2 = pr_netaddr_get_addr(p, name, NULL);
1✔
1346
  ck_assert_msg(addr2 != NULL, "Failed to resolve '%s': %s", name,
2✔
1347
    strerror(errno));
1348

1349
  addr = pr_netaddr_v6tov4(p, addr2);
1✔
1350
  ck_assert_msg(addr != NULL, "Failed to convert '%s' to IPv4 address: %s",
2✔
1351
    name, strerror(errno));
1352
  ck_assert_msg(pr_netaddr_get_family(addr) == AF_INET,
2✔
1353
    "Expected %d, got %d", AF_INET, pr_netaddr_get_family(addr));
1354

1355
  ipstr = pr_netaddr_get_ipstr(addr);
1✔
1356
  ck_assert_msg(strcmp(ipstr, "127.0.0.1") == 0,
2✔
1357
    "Expected '127.0.0.1', got '%s'", ipstr);
1358
#endif /* PR_USE_IPV6 */
1359
}
1360
END_TEST
1✔
1361

1362
#if defined(PR_USE_IPV6)
1363
START_TEST (netaddr_v4tov6_test) {
1✔
1364
  const pr_netaddr_t *addr, *addr2;
1365
  const char *name, *ipstr;
1366

1367
  addr = pr_netaddr_v4tov6(NULL, NULL);
1✔
1368
  ck_assert_msg(addr == NULL, "Failed to handle null arguments");
1✔
1369
  ck_assert_msg(errno == EINVAL, "Expected EINVAL (%d), got %s (%d)", EINVAL,
2✔
1370
    strerror(errno), errno);
1371

1372
  addr = pr_netaddr_v4tov6(p, NULL);
1✔
1373
  ck_assert_msg(addr == NULL, "Failed to handle null address");
2✔
1374
  ck_assert_msg(errno == EINVAL, "Expected EINVAL (%d), got %s (%d)", EINVAL,
2✔
1375
    strerror(errno), errno);
1376

1377
  name = "::ffff:127.0.0.1";
1✔
1378
  addr2 = pr_netaddr_get_addr(p, name, NULL);
1✔
1379
  ck_assert_msg(addr2 != NULL, "Failed to resolve '%s': %s", name,
2✔
1380
    strerror(errno));
1381

1382
  addr = pr_netaddr_v4tov6(p, addr2);
1✔
1383
  ck_assert_msg(addr == NULL, "Converted '%s' to IPv6 address unexpectedly",
2✔
1384
    name);
1385
  ck_assert_msg(errno == EPERM, "Expected EPERM (%d), got %s (%d)", EPERM,
2✔
1386
    strerror(errno), errno);
1387

1388
  name = "127.0.0.1";
1✔
1389
  addr2 = pr_netaddr_get_addr(p, name, NULL);
1✔
1390
  ck_assert_msg(addr2 != NULL, "Failed to resolve '%s': %s", name,
2✔
1391
    strerror(errno));
1392

1393
  addr = pr_netaddr_v4tov6(p, addr2);
1✔
1394
  ck_assert_msg(addr != NULL, "Failed to convert '%s' to IPv6 address: %s",
2✔
1395
    name, strerror(errno));
1396
  ck_assert_msg(pr_netaddr_get_family(addr) == AF_INET6,
2✔
1397
    "Expected %d, got %d", AF_INET6, pr_netaddr_get_family(addr));
1398

1399
  ipstr = pr_netaddr_get_ipstr(addr);
1✔
1400
  ck_assert_msg(strcmp(ipstr, "::ffff:127.0.0.1") == 0,
2✔
1401
    "Expected '::ffff:127.0.0.1', got '%s'", ipstr);
1402
}
1403
END_TEST
1✔
1404
#endif /* PR_USE_IPV6 */
1405

1406
START_TEST (netaddr_disable_ipv6_test) {
1✔
1407
  unsigned char use_ipv6;
1408

1409
  use_ipv6 = pr_netaddr_use_ipv6();
1✔
1410

1411
#if defined(PR_USE_IPV6)
1412
  ck_assert_msg(use_ipv6 == TRUE, "Expected %d, got %d", TRUE, use_ipv6);
1✔
1413
#else
1414
  ck_assert_msg(use_ipv6 == FALSE, "Expected %d, got %d", FALSE, use_ipv6);
1415
#endif /* PR_USE_IPV6 */
1416

1417
  pr_netaddr_disable_ipv6();
1✔
1418

1419
  use_ipv6 = pr_netaddr_use_ipv6();
1✔
1420
  ck_assert_msg(use_ipv6 == FALSE, "Expected %d, got %d", FALSE, use_ipv6);
2✔
1421
}
1422
END_TEST
1✔
1423

1424
START_TEST (netaddr_enable_ipv6_test) {
1✔
1425
  unsigned char use_ipv6;
1426

1427
  pr_netaddr_enable_ipv6();
1✔
1428

1429
  use_ipv6 = pr_netaddr_use_ipv6();
1✔
1430
#if defined(PR_USE_IPV6)
1431
  ck_assert_msg(use_ipv6 == TRUE, "Expected %d, got %d", TRUE, use_ipv6);
1✔
1432
#else
1433
  ck_assert_msg(use_ipv6 == FALSE, "Expected %d, got %d", FALSE, use_ipv6);
1434
#endif /* PR_USE_IPV6 */
1435
}
1436
END_TEST
1✔
1437

1438
Suite *tests_get_netaddr_suite(void) {
891✔
1439
  Suite *suite;
1440
  TCase *testcase;
1441

1442
  suite = suite_create("netaddr");
891✔
1443

1444
  testcase = tcase_create("base");
891✔
1445
  tcase_add_checked_fixture(testcase, set_up, tear_down);
891✔
1446

1447
  tcase_add_test(testcase, netaddr_alloc_test);
891✔
1448
  tcase_add_test(testcase, netaddr_dup_test);
891✔
1449
  tcase_add_test(testcase, netaddr_clear_test);
891✔
1450
  tcase_add_test(testcase, netaddr_get_addr_test);
891✔
1451
  tcase_add_test(testcase, netaddr_get_addr2_test);
891✔
1452
  tcase_add_test(testcase, netaddr_get_family_test);
891✔
1453
  tcase_add_test(testcase, netaddr_set_family_test);
891✔
1454
  tcase_add_test(testcase, netaddr_cmp_test);
891✔
1455
  tcase_add_test(testcase, netaddr_ncmp_test);
891✔
1456
  tcase_add_test(testcase, netaddr_fnmatch_test);
891✔
1457
  tcase_add_test(testcase, netaddr_get_sockaddr_test);
891✔
1458
  tcase_add_test(testcase, netaddr_get_sockaddr_len_test);
891✔
1459
  tcase_add_test(testcase, netaddr_set_sockaddr_test);
891✔
1460
  tcase_add_test(testcase, netaddr_set_sockaddr_any_test);
891✔
1461
  tcase_add_test(testcase, netaddr_get_inaddr_test);
891✔
1462
  tcase_add_test(testcase, netaddr_get_inaddr_len_test);
891✔
1463
  tcase_add_test(testcase, netaddr_get_port_test);
891✔
1464
  tcase_add_test(testcase, netaddr_set_port_test);
891✔
1465
  tcase_add_test(testcase, netaddr_set_reverse_dns_test);
891✔
1466
  tcase_add_test(testcase, netaddr_get_dnsstr_test);
891✔
1467
  tcase_add_test(testcase, netaddr_get_dnsstr_list_test);
891✔
1468
#if defined(PR_USE_IPV6)
1469
  tcase_add_test(testcase, netaddr_get_dnsstr_ipv6_test);
891✔
1470
#endif /* PR_USE_IPV6 */
1471
  tcase_add_test(testcase, netaddr_get_ipstr_test);
891✔
1472
  tcase_add_test(testcase, netaddr_validate_dns_str_test);
891✔
1473
  tcase_add_test(testcase, netaddr_get_localaddr_str_test);
891✔
1474
  tcase_add_test(testcase, netaddr_is_loopback_test);
891✔
1475
  tcase_add_test(testcase, netaddr_is_v4_test);
891✔
1476
  tcase_add_test(testcase, netaddr_is_v6_test);
891✔
1477
  tcase_add_test(testcase, netaddr_is_v4mappedv6_test);
891✔
1478
  tcase_add_test(testcase, netaddr_is_rfc1918_test);
891✔
1479
  tcase_add_test(testcase, netaddr_v6tov4_test);
891✔
1480
#if defined(PR_USE_IPV6)
1481
  tcase_add_test(testcase, netaddr_v4tov6_test);
891✔
1482
#endif /* PR_USE_IPV6 */
1483
  tcase_add_test(testcase, netaddr_disable_ipv6_test);
891✔
1484
  tcase_add_test(testcase, netaddr_enable_ipv6_test);
891✔
1485

1486
  /* Some of the DNS-related tests may take a little longer. */
1487
  tcase_set_timeout(testcase, 30);
891✔
1488

1489
  suite_add_tcase(suite, testcase);
891✔
1490
  return suite;
891✔
1491
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc