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

c-ares / c-ares / #1112

23 Jun 2024 03:37PM UTC coverage: 82.501% (+0.02%) from 82.477%
#1112

push

travis-ci

bradh352
ares_timeout: missing thread-safety lock

7 of 8 new or added lines in 1 file covered. (87.5%)

7666 of 9292 relevant lines covered (82.5%)

1970.59 hits per line

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

93.94
/src/lib/ares_timeout.c
1
/* MIT License
2
 *
3
 * Copyright (c) 1998 Massachusetts Institute of Technology
4
 * Copyright (c) The c-ares project and its contributors
5
 *
6
 * Permission is hereby granted, free of charge, to any person obtaining a copy
7
 * of this software and associated documentation files (the "Software"), to deal
8
 * in the Software without restriction, including without limitation the rights
9
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
 * copies of the Software, and to permit persons to whom the Software is
11
 * furnished to do so, subject to the following conditions:
12
 *
13
 * The above copyright notice and this permission notice (including the next
14
 * paragraph) shall be included in all copies or substantial portions of the
15
 * Software.
16
 *
17
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23
 * SOFTWARE.
24
 *
25
 * SPDX-License-Identifier: MIT
26
 */
27

28
#include "ares_setup.h"
29

30
#ifdef HAVE_LIMITS_H
31
#  include <limits.h>
32
#endif
33

34
#include "ares.h"
35
#include "ares_private.h"
36

37
void ares__timeval_remaining(struct timeval *remaining,
843✔
38
                             const struct timeval *now,
39
                             const struct timeval *tout)
40
{
41
  memset(remaining, 0, sizeof(*remaining));
843✔
42

43
  /* Expired! */
44
  if (tout->tv_sec < now->tv_sec ||
843✔
45
      (tout->tv_sec == now->tv_sec && tout->tv_usec < now->tv_usec)) {
843✔
46
    return;
4✔
47
  }
48

49
  remaining->tv_sec = tout->tv_sec - now->tv_sec;
839✔
50
  if (tout->tv_usec < now->tv_usec) {
839✔
51
    remaining->tv_sec  -= 1;
230✔
52
    remaining->tv_usec  = (tout->tv_usec + 1000000) - now->tv_usec;
230✔
53
  } else {
54
    remaining->tv_usec = tout->tv_usec - now->tv_usec;
609✔
55
  }
56
}
57

58
static struct timeval *ares_timeout_int(ares_channel_t *channel,
827✔
59
                                        struct timeval *maxtv,
60
                                        struct timeval *tvbuf)
61
{
62
  const struct query *query;
63
  ares__slist_node_t *node;
64
  struct timeval      now;
65

66
  /* The minimum timeout of all queries is always the first entry in
67
   * channel->queries_by_timeout */
68
  node = ares__slist_node_first(channel->queries_by_timeout);
827✔
69
  /* no queries/timeout */
70
  if (node == NULL) {
827✔
71
    return maxtv; /* <-- maxtv can be null though, hrm */
2✔
72
  }
73

74
  query = ares__slist_node_val(node);
825✔
75

76
  now = ares__tvnow();
825✔
77

78
  ares__timeval_remaining(tvbuf, &now, &query->timeout);
825✔
79

80
  if (maxtv == NULL) {
825✔
81
    return tvbuf;
809✔
82
  }
83

84
  /* Return the minimum time between maxtv and tvbuf */
85

86
  if (tvbuf->tv_sec > maxtv->tv_sec) {
16✔
87
    return maxtv;
1✔
88
  }
89
  if (tvbuf->tv_sec < maxtv->tv_sec) {
15✔
90
    return tvbuf;
1✔
91
  }
92

93
  if (tvbuf->tv_usec > maxtv->tv_usec) {
14✔
94
    return maxtv;
14✔
95
  }
96

97
  return tvbuf;
×
98
}
99

100
struct timeval *ares_timeout(ares_channel_t *channel,
827✔
101
                             struct timeval *maxtv, struct timeval *tvbuf)
102
{
103
  struct timeval *rv;
104

105
  if (channel == NULL || tvbuf == NULL)
827✔
NEW
106
    return NULL;
×
107

108
  ares__channel_lock(channel);
827✔
109

110
  rv = ares_timeout_int(channel, maxtv, tvbuf);
827✔
111

112
  ares__channel_unlock(channel);
827✔
113

114
  return rv;
827✔
115
}
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

© 2025 Coveralls, Inc