Avoid seeking when reading Android timezone identifier 'file'
@@ -53,35 +53,42 @@ static UINT64 winpr_windows_gmtime(void)
static char* winpr_read_unix_timezone_identifier_from_file(FILE* fp)
{
- INT64 length;
- char* tzid = NULL;
+ const INT CHUNK_SIZE = 32;
+ INT64 rc, read = 0, length = CHUNK_SIZE;
+ char *tmp, *tzid = NULL;
- if (_fseeki64(fp, 0, SEEK_END) != 0)
+ tzid = (char*)malloc(length);
+ if (!tzid)
return NULL;
- length = _ftelli64(fp);
+ do
+ {
+ rc = fread(tzid + read, 1, length - read - 1, fp);
+ read += rc;
- if (_fseeki64(fp, 0, SEEK_SET) != 0)
- return NULL;
+ if (read < (length - 1))
+ break;
- if (length < 2)
+ length += CHUNK_SIZE;
+ tmp = (char*)realloc(tzid, length);
+ if (!tmp)
+ {
+ free(tzid);
return NULL;
+ }
- tzid = (char*)malloc((size_t)length + 1);
-
- if (!tzid)
- return NULL;
+ tzid = tmp;
+ } while (rc > 0);
- if (fread(tzid, (size_t)length, 1, fp) != 1)
+ if (ferror(fp))
{
free(tzid);
return NULL;
}
- tzid[length] = '\0';
-
- if (tzid[length - 1] == '\n')
- tzid[length - 1] = '\0';
+ tzid[read] = '\0';
+ if (tzid[read - 1] == '\n')
+ tzid[read - 1] = '\0';
return tzid;
}
