mirror of
https://github.com/subsurface/subsurface.git
synced 2024-11-30 22:20:21 +00:00
Datatrak parsing
I have some trouble understanding this code, but as there is a clear bug involved (null dereference), I ask others to verify if I am onto something. And if datatrak import still works with this patch. From af2935622b1f00f373ed38c8e3194e25504372b6 Mon Sep 17 00:00:00 2001 From: Miika Turkia <miika.turkia@gmail.com> Date: Wed, 9 Sep 2015 18:03:45 +0300 Subject: [PATCH] Fix null dereference and parsing logic Null dereference in the first change is obviously a bug. The parsing logic I only assume to be wrong and suggest that we discard dives that are deemed to be bogus. Signed-off-by: Miika Turkia <miika.turkia@gmail.com> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
This commit is contained in:
parent
7a4b046c76
commit
1533191176
1 changed files with 9 additions and 7 deletions
16
datatrak.c
16
datatrak.c
|
@ -158,7 +158,7 @@ static dtrakheader read_file_header(FILE *archivo)
|
||||||
/*
|
/*
|
||||||
* Parses the dive extracting its data and filling a subsurface's dive structure
|
* Parses the dive extracting its data and filling a subsurface's dive structure
|
||||||
*/
|
*/
|
||||||
static struct dive dt_dive_parser(FILE *archivo, struct dive *dt_dive)
|
bool dt_dive_parser(FILE *archivo, struct dive *dt_dive)
|
||||||
{
|
{
|
||||||
unsigned char n;
|
unsigned char n;
|
||||||
int profile_length;
|
int profile_length;
|
||||||
|
@ -185,8 +185,7 @@ static struct dive dt_dive_parser(FILE *archivo, struct dive *dt_dive)
|
||||||
fread(&lector_bytes[n+1], 1, 1, archivo);
|
fread(&lector_bytes[n+1], 1, 1, archivo);
|
||||||
if (two_bytes_to_int(lector_bytes[0], lector_bytes[1]) != 0xA000) {
|
if (two_bytes_to_int(lector_bytes[0], lector_bytes[1]) != 0xA000) {
|
||||||
printf("Error: byte = %4x\n", two_bytes_to_int(lector_bytes[0], lector_bytes[1]));
|
printf("Error: byte = %4x\n", two_bytes_to_int(lector_bytes[0], lector_bytes[1]));
|
||||||
dt_dive = NULL;
|
return false;
|
||||||
return *dt_dive;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -649,7 +648,7 @@ static struct dive dt_dive_parser(FILE *archivo, struct dive *dt_dive)
|
||||||
dt_dive->cylinder[0].end.mbar = dt_dive->cylinder[0].start.mbar -
|
dt_dive->cylinder[0].end.mbar = dt_dive->cylinder[0].start.mbar -
|
||||||
((dt_dive->cylinder[0].gas_used.mliter / dt_dive->cylinder[0].type.size.mliter) * 1000);
|
((dt_dive->cylinder[0].gas_used.mliter / dt_dive->cylinder[0].type.size.mliter) * 1000);
|
||||||
}
|
}
|
||||||
return *dt_dive;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void datatrak_import(const char *file, struct dive_table *table)
|
void datatrak_import(const char *file, struct dive_table *table)
|
||||||
|
@ -670,11 +669,14 @@ void datatrak_import(const char *file, struct dive_table *table)
|
||||||
*fileheader = read_file_header(archivo);
|
*fileheader = read_file_header(archivo);
|
||||||
while (i < fileheader->divesNum) {
|
while (i < fileheader->divesNum) {
|
||||||
struct dive *ptdive = alloc_dive();
|
struct dive *ptdive = alloc_dive();
|
||||||
*ptdive = dt_dive_parser(archivo, ptdive);
|
|
||||||
if (!ptdive)
|
if (!dt_dive_parser(archivo, ptdive)) {
|
||||||
report_error(translate("gettextFromC", "Error: no dive"));
|
report_error(translate("gettextFromC", "Error: no dive"));
|
||||||
|
free(ptdive);
|
||||||
|
} else {
|
||||||
|
record_dive(ptdive);
|
||||||
|
}
|
||||||
i++;
|
i++;
|
||||||
record_dive(ptdive);
|
|
||||||
}
|
}
|
||||||
taglist_cleanup(&g_tag_list);
|
taglist_cleanup(&g_tag_list);
|
||||||
fclose(archivo);
|
fclose(archivo);
|
||||||
|
|
Loading…
Reference in a new issue