Commit e32fd66bb95adfa0e8cb0e060aa84465ebe2c5a5
1 parent
b68b869c
made br_iterate_utemplates_file more robust
Showing
1 changed file
with
35 additions
and
9 deletions
openbr/universal_template.cpp
| ... | ... | @@ -58,18 +58,44 @@ static void callAndFree(br_utemplate_callback callback, br_utemplate t, br_callb |
| 58 | 58 | void br_iterate_utemplates_file(FILE *file, br_utemplate_callback callback, br_callback_context context, bool parallel) |
| 59 | 59 | { |
| 60 | 60 | QFutureSynchronizer<void> futures; |
| 61 | - while (!feof(file)) { | |
| 61 | + while (true) { | |
| 62 | 62 | br_utemplate t = (br_utemplate) malloc(sizeof(br_universal_template)); |
| 63 | 63 | |
| 64 | - if (fread(t, sizeof(br_universal_template), 1, file) > 0) { | |
| 65 | - t = (br_utemplate) realloc(t, sizeof(br_universal_template) + t->size); | |
| 66 | - if (fread(t+1, 1, t->size, file) != t->size) | |
| 67 | - qFatal("Unexepected EOF when reading universal template data."); | |
| 68 | - if (parallel) futures.addFuture(QtConcurrent::run(callAndFree, callback, t, context)); | |
| 69 | - else callAndFree(callback, t, context); | |
| 70 | - } else { | |
| 71 | - free(t); | |
| 64 | + int bytesRemaining = sizeof(br_universal_template); | |
| 65 | + while (bytesRemaining > 0) { | |
| 66 | + bytesRemaining -= fread(reinterpret_cast<char*>(t) + sizeof(br_universal_template) - bytesRemaining, 1, bytesRemaining, file); | |
| 67 | + | |
| 68 | + if (feof(file)) { | |
| 69 | + if (bytesRemaining == sizeof(br_universal_template)) { | |
| 70 | + free(t); | |
| 71 | + return; | |
| 72 | + } else { | |
| 73 | + qFatal("Unexpected end of file when reading template metadata."); | |
| 74 | + } | |
| 75 | + } | |
| 76 | + | |
| 77 | + if (ferror(file)) { | |
| 78 | + perror(NULL); | |
| 79 | + qFatal("Error while reading template metadata."); | |
| 80 | + } | |
| 72 | 81 | } |
| 82 | + | |
| 83 | + t = (br_utemplate) realloc(t, sizeof(br_universal_template) + t->size); | |
| 84 | + bytesRemaining = t->size; | |
| 85 | + while (bytesRemaining > 0) { | |
| 86 | + bytesRemaining -= fread(&t->data[t->size - bytesRemaining], 1, bytesRemaining, file); | |
| 87 | + | |
| 88 | + if (feof(file)) | |
| 89 | + qFatal("Unexpected end of file when reading template data."); | |
| 90 | + | |
| 91 | + if (ferror(file)) { | |
| 92 | + perror(NULL); | |
| 93 | + qFatal("Error while reading template data."); | |
| 94 | + } | |
| 95 | + } | |
| 96 | + | |
| 97 | + if (parallel) futures.addFuture(QtConcurrent::run(callAndFree, callback, t, context)); | |
| 98 | + else callAndFree(callback, t, context); | |
| 73 | 99 | } |
| 74 | 100 | futures.waitForFinished(); |
| 75 | 101 | } | ... | ... |