From 610a882f1d4be4c3c77819e6d54bf2c2408757dc Mon Sep 17 00:00:00 2001 From: Jonathan Lafontaine Date: Tue, 30 Oct 2018 16:47:06 -0400 Subject: [PATCH] remove unsupported call to fseek when file is opened with popen --- winpr/libwinpr/timezone/timezone.c | 44 +++++++++++++++++++----------- 1 file changed, 28 insertions(+), 16 deletions(-) diff --git a/winpr/libwinpr/timezone/timezone.c b/winpr/libwinpr/timezone/timezone.c index 9724ac111..736df669a 100644 --- a/winpr/libwinpr/timezone/timezone.c +++ b/winpr/libwinpr/timezone/timezone.c @@ -2032,31 +2032,43 @@ static UINT64 winpr_windows_gmtime() 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) - return NULL; - length = _ftelli64(fp); - if (_fseeki64(fp, 0, SEEK_SET) != 0) - return NULL; - - if (length < 2) - return NULL; - - tzid = (char*) malloc(length + 1); + tzid = (char*) malloc(length); if (!tzid) return NULL; - if (fread(tzid, length, 1, fp) != 1) + do + { + rc = fread(tzid + read, 1, length - read - 1, fp); + read += rc; + + if(read < (length - 1)) + break; + + length += CHUNK_SIZE; + tmp = (char*) realloc(tzid, length); + if(!tmp) + { + free(tzid); + return NULL; + } + + tzid = tmp; + } + while(rc > 0); + + 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; }