Skip to content

Commit fc7a7d8

Browse files
committed
ECC-2167 - fixed offset computation if r->tell returns -1
1 parent 498bbb7 commit fc7a7d8

File tree

1 file changed

+25
-4
lines changed

1 file changed

+25
-4
lines changed

src/eccodes/grib_io.cc

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -889,6 +889,9 @@ static int ecc_read_any(reader* r, int no_alloc, int grib_ok, int bufr_ok, int h
889889
case BUFR:
890890
if (bufr_ok) {
891891
err = read_BUFR(r, no_alloc);
892+
if (r->offset == -5) {
893+
r->offset = offset - 4;
894+
}
892895
return err == GRIB_END_OF_FILE ? GRIB_PREMATURE_END_OF_FILE : err; /* Premature EOF */
893896
}
894897
break;
@@ -910,18 +913,27 @@ static int ecc_read_any(reader* r, int no_alloc, int grib_ok, int bufr_ok, int h
910913
case BUDG:
911914
if (grib_ok) {
912915
err = read_PSEUDO(r, "BUDG", no_alloc);
916+
if (r->offset == -5) {
917+
r->offset = offset - 4;
918+
}
913919
return err == GRIB_END_OF_FILE ? GRIB_PREMATURE_END_OF_FILE : err; /* Premature EOF */
914920
}
915921
break;
916922
case DIAG:
917923
if (grib_ok) {
918924
err = read_PSEUDO(r, "DIAG", no_alloc);
925+
if (r->offset == -5) {
926+
r->offset = offset - 4;
927+
}
919928
return err == GRIB_END_OF_FILE ? GRIB_PREMATURE_END_OF_FILE : err; /* Premature EOF */
920929
}
921930
break;
922931
case TIDE:
923932
if (grib_ok) {
924933
err = read_PSEUDO(r, "TIDE", no_alloc);
934+
if (r->offset == -5) {
935+
r->offset = offset - 4;
936+
}
925937
return err == GRIB_END_OF_FILE ? GRIB_PREMATURE_END_OF_FILE : err; /* Premature EOF */
926938
}
927939
break;
@@ -964,8 +976,10 @@ static int read_any_gts(reader* r)
964976
size_t message_size = 0;
965977
size_t already_read = 0;
966978
int i = 0;
979+
off_t offset = r->offset;
967980

968981
while (r->read(r->read_data, &c, 1, &err) == 1 && err == 0) {
982+
offset++;
969983
magic <<= 8;
970984
magic |= c;
971985
magic &= 0xffffffff;
@@ -976,7 +990,8 @@ static int read_any_gts(reader* r)
976990
tmp[i++] = 0x0d;
977991
tmp[i++] = 0x0a;
978992

979-
r->offset = r->tell(r->read_data) - 4;
993+
off_t rTell = r->tell(r->read_data);
994+
r->offset = (rTell != -1 ? rTell : offset) - 4;
980995

981996
if (r->read(r->read_data, &tmp[i], 6, &err) != 6 || err)
982997
return err == GRIB_END_OF_FILE ? GRIB_PREMATURE_END_OF_FILE : err; /* Premature EOF */
@@ -1023,8 +1038,10 @@ static int read_any_taf(reader* r)
10231038
size_t message_size = 0;
10241039
size_t already_read = 0;
10251040
int i = 0;
1041+
off_t offset = r->offset;
10261042

10271043
while (r->read(r->read_data, &c, 1, &err) == 1 && err == 0) {
1044+
offset++;
10281045
magic <<= 8;
10291046
magic |= c;
10301047
magic &= 0xffffffff;
@@ -1035,7 +1052,8 @@ static int read_any_taf(reader* r)
10351052
tmp[i++] = 0x46; //F
10361053
tmp[i++] = 0x20; //space
10371054

1038-
r->offset = r->tell(r->read_data) - 4;
1055+
off_t rTell = r->tell(r->read_data);
1056+
r->offset = (rTell != -1 ? rTell : offset) - 4;
10391057

10401058
already_read = 4;
10411059
message_size = already_read;
@@ -1071,8 +1089,10 @@ static int read_any_metar(reader* r)
10711089
size_t message_size = 0;
10721090
size_t already_read = 0;
10731091
int i = 0;
1092+
off_t offset = r->offset;
10741093

10751094
while (r->read(r->read_data, &c, 1, &err) == 1 && err == 0) {
1095+
offset++;
10761096
magic <<= 8;
10771097
magic |= c;
10781098
magic &= 0xffffffff;
@@ -1087,9 +1107,10 @@ static int read_any_metar(reader* r)
10871107
tmp[i++] = 0x41; // A
10881108
tmp[i++] = 'R';
10891109

1090-
r->offset = r->tell(r->read_data) - 4;
1091-
10921110
already_read = 5;
1111+
off_t rTell = r->tell(r->read_data);
1112+
r->offset = (rTell != -1 ? rTell : offset) - already_read;
1113+
10931114
message_size = already_read;
10941115
while (r->read(r->read_data, &c, 1, &err) == 1 && err == 0) {
10951116
message_size++;

0 commit comments

Comments
 (0)