Macros | Functions | Variables
versions.c File Reference
#include "core/or/or.h"
#include "core/or/protover.h"
#include "core/or/versions.h"
#include "lib/crypt_ops/crypto_util.h"
#include "core/or/tor_version_st.h"

Go to the source code of this file.


#define NUMBER(m)
#define DOT()
#define CMP(field)


time_t tor_get_approx_release_date (void)
version_status_t tor_version_is_obsolete (const char *myversion, const char *versionlist)
int tor_version_parse_platform (const char *platform, tor_version_t *router_version, int strict)
int tor_version_as_new_as (const char *platform, const char *cutoff)
int tor_version_parse (const char *s, tor_version_t *out)
int tor_version_compare (tor_version_t *a, tor_version_t *b)
int tor_version_same_series (tor_version_t *a, tor_version_t *b)
static int compare_tor_version_str_ptr_ (const void **_a, const void **_b)
void sort_version_list (smartlist_t *versions, int remove_duplicates)
static void memoize_protover_summary (protover_summary_flags_t *out, const char *protocols)
void summarize_protover_flags (protover_summary_flags_t *out, const char *protocols, const char *version)
void protover_summary_cache_free_all (void)


static const int MAX_PROTOVER_SUMMARY_MAP_LEN = 1024
static strmap_t * protover_summary_map = NULL

Detailed Description

Code to manipulate, parse, and compare Tor versions.

Definition in file versions.c.

Macro Definition Documentation


#define CMP (   field)
do { \
unsigned aval = (unsigned) a->field; \
unsigned bval = (unsigned) b->field; \
int result = (int) (aval - bval); \
if (result < 0) \
return -1; \
else if (result > 0) \
return 1; \
} while (0)


#define DOT ( )
do { \
if (*cp != '.') \
return -1; \
++cp; \
} while (0)


#define NUMBER (   m)
do { \
if (!cp || *cp < '0' || *cp > '9') \
return -1; \
out->m = (int)tor_parse_uint64(cp, 10, 0, INT32_MAX, &ok, &eos); \
if (!ok) \
return -1; \
if (!eos || eos == cp) \
return -1; \
cp = eos; \
} while (0)
uint64_t tor_parse_uint64(const char *s, int base, uint64_t min, uint64_t max, int *ok, char **next)
Definition: parse_int.c:107

Function Documentation

◆ compare_tor_version_str_ptr_()

static int compare_tor_version_str_ptr_ ( const void **  _a,
const void **  _b 

Helper: Given pointers to two strings describing tor versions, return -1 if _a precedes _b, 1 if _b precedes _a, and 0 if they are equivalent. Used to sort a list of versions.

Definition at line 369 of file versions.c.

References tor_version_compare(), and tor_version_parse().

Referenced by sort_version_list().

◆ memoize_protover_summary()

static void memoize_protover_summary ( protover_summary_flags_t out,
const char *  protocols 

Helper. Given a non-NULL protover string protocols, set out to its summary, and memoize the result in protover_summary_map.

Definition at line 413 of file versions.c.

References MAX_PROTOVER_SUMMARY_MAP_LEN, protocol_list_supports_protocol(), protover_summary_flags_t::protocols_known, protover_summary_cache_free_all(), protover_summary_map, protover_summary_flags_t::supports_extend2_cells, and tor_assert().

Referenced by summarize_protover_flags().

◆ protover_summary_cache_free_all()

void protover_summary_cache_free_all ( void  )

Free all space held in the protover_summary_map.

Definition at line 496 of file versions.c.

Referenced by memoize_protover_summary().

◆ sort_version_list()

void sort_version_list ( smartlist_t versions,
int  remove_duplicates 

Sort a list of string-representations of versions in ascending order.

Definition at line 391 of file versions.c.

References compare_tor_version_str_ptr_(), smartlist_sort(), smartlist_uniq(), and tor_free_().

◆ summarize_protover_flags()

void summarize_protover_flags ( protover_summary_flags_t out,
const char *  protocols,
const char *  version 

Summarize the protocols listed in protocols into out, falling back or correcting them based on version as appropriate.

Definition at line 466 of file versions.c.

References memoize_protover_summary(), protover_summary_flags_t::protocols_known, strcmpstart(), protover_summary_flags_t::supports_extend2_cells, protover_summary_flags_t::supports_v3_hsdir, tor_assert(), and tor_version_as_new_as().

◆ tor_get_approx_release_date()

time_t tor_get_approx_release_date ( void  )

Return the approximate date when this release came out, or was scheduled to come out, according to the APPROX_RELEASE_DATE set in

Definition at line 25 of file versions.c.

Referenced by networkstatus_check_required_protocols().

◆ tor_version_as_new_as()

int tor_version_as_new_as ( const char *  platform,
const char *  cutoff 

Parse the Tor version of the platform string platform, and compare it to the version in cutoff. Return 1 if the router is at least as new as the cutoff, else return 0.

Definition at line 171 of file versions.c.

References tor_assert(), and tor_version_parse().

Referenced by protover_compute_for_old_tor(), and summarize_protover_flags().

◆ tor_version_compare()

int tor_version_compare ( tor_version_t a,
tor_version_t b 

Compare two tor versions; Return <0 if a < b; 0 if a ==b, >0 if a > b.

Definition at line 315 of file versions.c.

References tor_assert().

Referenced by compare_tor_version_str_ptr_().

◆ tor_version_is_obsolete()

version_status_t tor_version_is_obsolete ( const char *  myversion,
const char *  versionlist 

Return VS_RECOMMENDED if myversion is contained in versionlist. Else, return VS_EMPTY if versionlist has no entries. Else, return VS_OLD if every member of versionlist is newer than myversion. Else, return VS_NEW_IN_SERIES if there is at least one member of versionlist in the same series (major.minor.micro) as myversion, but no such member is newer than myversion.. Else, return VS_NEW if every member of versionlist is older than myversion. Else, return VS_UNRECOMMENDED.

(versionlist is a comma-separated list of version strings, optionally prefixed with "Tor". Versions that can't be parsed are ignored.)

Definition at line 53 of file versions.c.


◆ tor_version_parse()

int tor_version_parse ( const char *  s,
tor_version_t out 

Parse a tor version from s, and store the result in out. Return 0 on success, -1 on failure.

Definition at line 206 of file versions.c.

References var_type_fns_t::ok, tor_version_t::status, strcasecmpstart(), and tor_assert().

Referenced by compare_tor_version_str_ptr_(), and tor_version_as_new_as().

◆ tor_version_parse_platform()

int tor_version_parse_platform ( const char *  platform,
tor_version_t router_version,
int  strict 

Extract a Tor version from a platform line from a router descriptor, and place the result in router_version.

Return 1 on success, -1 on parsing failure, and 0 if the platform line does not indicate some version of Tor.

If strict is non-zero, finding any weird version components (like negative numbers) counts as a parsing failure.

Definition at line 127 of file versions.c.

References eat_whitespace(), find_whitespace(), and strcmpstart().

◆ tor_version_same_series()

int tor_version_same_series ( tor_version_t a,
tor_version_t b 

Return true iff versions a and b belong to the same series.

Definition at line 356 of file versions.c.

References tor_assert().

Variable Documentation



If there are more than this many entries, we're probably under some kind of weird DoS.

Definition at line 401 of file versions.c.

Referenced by memoize_protover_summary().

◆ protover_summary_map

strmap_t* protover_summary_map = NULL

Map from protover string to protover_summary_flags_t.

Definition at line 406 of file versions.c.

Referenced by memoize_protover_summary().