sourcestats: check samples loaded from dump files
When loading a dump file with the -r option, check also sanity of the sample time, offset, peer/root delay/dispersion, and the sample order to better handle corrupted files.
This commit is contained in:
parent
bb9ba3e4bd
commit
fc99317291
1 changed files with 14 additions and 0 deletions
|
@ -885,6 +885,7 @@ int
|
||||||
SST_LoadFromFile(SST_Stats inst, FILE *in)
|
SST_LoadFromFile(SST_Stats inst, FILE *in)
|
||||||
{
|
{
|
||||||
int i, n_samples, arun;
|
int i, n_samples, arun;
|
||||||
|
struct timespec now;
|
||||||
double sample_time;
|
double sample_time;
|
||||||
char line[256];
|
char line[256];
|
||||||
|
|
||||||
|
@ -895,6 +896,8 @@ SST_LoadFromFile(SST_Stats inst, FILE *in)
|
||||||
|
|
||||||
SST_ResetInstance(inst);
|
SST_ResetInstance(inst);
|
||||||
|
|
||||||
|
LCL_ReadCookedTime(&now, NULL);
|
||||||
|
|
||||||
for (i = 0; i < n_samples; i++) {
|
for (i = 0; i < n_samples; i++) {
|
||||||
if (!fgets(line, sizeof (line), in) ||
|
if (!fgets(line, sizeof (line), in) ||
|
||||||
sscanf(line, "%lf %lf %lf %lf %lf %lf %lf",
|
sscanf(line, "%lf %lf %lf %lf %lf %lf %lf",
|
||||||
|
@ -903,8 +906,19 @@ SST_LoadFromFile(SST_Stats inst, FILE *in)
|
||||||
&inst->root_delays[i], &inst->root_dispersions[i]) != 7)
|
&inst->root_delays[i], &inst->root_dispersions[i]) != 7)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
if (!UTI_IsTimeOffsetSane(&now, sample_time - UTI_TimespecToDouble(&now)))
|
||||||
|
return 0;
|
||||||
|
|
||||||
/* Some resolution is lost in the double format, but that's ok */
|
/* Some resolution is lost in the double format, but that's ok */
|
||||||
UTI_DoubleToTimespec(sample_time, &inst->sample_times[i]);
|
UTI_DoubleToTimespec(sample_time, &inst->sample_times[i]);
|
||||||
|
|
||||||
|
/* Make sure the samples are sane and they are in order */
|
||||||
|
if (!UTI_IsTimeOffsetSane(&inst->sample_times[i], -inst->offsets[i]) ||
|
||||||
|
!(fabs(inst->peer_delays[i]) < 1.0e6 && fabs(inst->peer_dispersions[i]) < 1.0e6 &&
|
||||||
|
fabs(inst->root_delays[i]) < 1.0e6 && fabs(inst->root_dispersions[i]) < 1.0e6) ||
|
||||||
|
(i > 0 && UTI_CompareTimespecs(&inst->sample_times[i],
|
||||||
|
&inst->sample_times[i - 1]) <= 0))
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
inst->n_samples = n_samples;
|
inst->n_samples = n_samples;
|
||||||
|
|
Loading…
Reference in a new issue