aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'updater/blockimg.c')
-rw-r--r--updater/blockimg.c48
1 files changed, 20 insertions, 28 deletions
diff --git a/updater/blockimg.c b/updater/blockimg.c
index d5344f99..532e7b84 100644
--- a/updater/blockimg.c
+++ b/updater/blockimg.c
@@ -113,13 +113,12 @@ static int range_overlaps(RangeSet* r1, RangeSet* r2) {
113static int read_all(int fd, uint8_t* data, size_t size) { 113static int read_all(int fd, uint8_t* data, size_t size) {
114 size_t so_far = 0; 114 size_t so_far = 0;
115 while (so_far < size) { 115 while (so_far < size) {
116 ssize_t r = read(fd, data+so_far, size-so_far); 116 ssize_t r = TEMP_FAILURE_RETRY(read(fd, data+so_far, size-so_far));
117 if (r < 0 && errno != EINTR) { 117 if (r == -1) {
118 fprintf(stderr, "read failed: %s\n", strerror(errno)); 118 fprintf(stderr, "read failed: %s\n", strerror(errno));
119 return -1; 119 return -1;
120 } else {
121 so_far += r;
122 } 120 }
121 so_far += r;
123 } 122 }
124 return 0; 123 return 0;
125} 124}
@@ -127,13 +126,12 @@ static int read_all(int fd, uint8_t* data, size_t size) {
127static int write_all(int fd, const uint8_t* data, size_t size) { 126static int write_all(int fd, const uint8_t* data, size_t size) {
128 size_t written = 0; 127 size_t written = 0;
129 while (written < size) { 128 while (written < size) {
130 ssize_t w = write(fd, data+written, size-written); 129 ssize_t w = TEMP_FAILURE_RETRY(write(fd, data+written, size-written));
131 if (w < 0 && errno != EINTR) { 130 if (w == -1) {
132 fprintf(stderr, "write failed: %s\n", strerror(errno)); 131 fprintf(stderr, "write failed: %s\n", strerror(errno));
133 return -1; 132 return -1;
134 } else {
135 written += w;
136 } 133 }
134 written += w;
137 } 135 }
138 136
139 if (fsync(fd) == -1) { 137 if (fsync(fd) == -1) {
@@ -144,19 +142,13 @@ static int write_all(int fd, const uint8_t* data, size_t size) {
144 return 0; 142 return 0;
145} 143}
146 144
147static int check_lseek(int fd, off64_t offset, int whence) { 145static bool check_lseek(int fd, off64_t offset, int whence) {
148 while (true) { 146 off64_t rc = TEMP_FAILURE_RETRY(lseek64(fd, offset, whence));
149 off64_t ret = lseek64(fd, offset, whence); 147 if (rc == -1) {
150 if (ret < 0) { 148 fprintf(stderr, "lseek64 failed: %s\n", strerror(errno));
151 if (errno != EINTR) { 149 return false;
152 fprintf(stderr, "lseek64 failed: %s\n", strerror(errno));
153 return -1;
154 }
155 } else {
156 break;
157 }
158 } 150 }
159 return 0; 151 return true;
160} 152}
161 153
162static void allocate(size_t size, uint8_t** buffer, size_t* buffer_alloc) { 154static void allocate(size_t size, uint8_t** buffer, size_t* buffer_alloc) {
@@ -213,8 +205,8 @@ static ssize_t RangeSinkWrite(const uint8_t* data, ssize_t size, void* token) {
213 rss->p_remain = (rss->tgt->pos[rss->p_block * 2 + 1] - 205 rss->p_remain = (rss->tgt->pos[rss->p_block * 2 + 1] -
214 rss->tgt->pos[rss->p_block * 2]) * BLOCKSIZE; 206 rss->tgt->pos[rss->p_block * 2]) * BLOCKSIZE;
215 207
216 if (check_lseek(rss->fd, (off64_t)rss->tgt->pos[rss->p_block*2] * BLOCKSIZE, 208 if (!check_lseek(rss->fd, (off64_t)rss->tgt->pos[rss->p_block*2] * BLOCKSIZE,
217 SEEK_SET) == -1) { 209 SEEK_SET)) {
218 break; 210 break;
219 } 211 }
220 } else { 212 } else {
@@ -306,7 +298,7 @@ static int ReadBlocks(RangeSet* src, uint8_t* buffer, int fd) {
306 } 298 }
307 299
308 for (i = 0; i < src->count; ++i) { 300 for (i = 0; i < src->count; ++i) {
309 if (check_lseek(fd, (off64_t) src->pos[i * 2] * BLOCKSIZE, SEEK_SET) == -1) { 301 if (!check_lseek(fd, (off64_t) src->pos[i * 2] * BLOCKSIZE, SEEK_SET)) {
310 return -1; 302 return -1;
311 } 303 }
312 304
@@ -332,7 +324,7 @@ static int WriteBlocks(RangeSet* tgt, uint8_t* buffer, int fd) {
332 } 324 }
333 325
334 for (i = 0; i < tgt->count; ++i) { 326 for (i = 0; i < tgt->count; ++i) {
335 if (check_lseek(fd, (off64_t) tgt->pos[i * 2] * BLOCKSIZE, SEEK_SET) == -1) { 327 if (!check_lseek(fd, (off64_t) tgt->pos[i * 2] * BLOCKSIZE, SEEK_SET)) {
336 return -1; 328 return -1;
337 } 329 }
338 330
@@ -1217,7 +1209,7 @@ static int PerformCommandZero(CommandParameters* params) {
1217 1209
1218 if (params->canwrite) { 1210 if (params->canwrite) {
1219 for (i = 0; i < tgt->count; ++i) { 1211 for (i = 0; i < tgt->count; ++i) {
1220 if (check_lseek(params->fd, (off64_t) tgt->pos[i * 2] * BLOCKSIZE, SEEK_SET) == -1) { 1212 if (!check_lseek(params->fd, (off64_t) tgt->pos[i * 2] * BLOCKSIZE, SEEK_SET)) {
1221 goto pczout; 1213 goto pczout;
1222 } 1214 }
1223 1215
@@ -1271,7 +1263,7 @@ static int PerformCommandNew(CommandParameters* params) {
1271 rss.p_block = 0; 1263 rss.p_block = 0;
1272 rss.p_remain = (tgt->pos[1] - tgt->pos[0]) * BLOCKSIZE; 1264 rss.p_remain = (tgt->pos[1] - tgt->pos[0]) * BLOCKSIZE;
1273 1265
1274 if (check_lseek(params->fd, (off64_t) tgt->pos[0] * BLOCKSIZE, SEEK_SET) == -1) { 1266 if (!check_lseek(params->fd, (off64_t) tgt->pos[0] * BLOCKSIZE, SEEK_SET)) {
1275 goto pcnout; 1267 goto pcnout;
1276 } 1268 }
1277 1269
@@ -1367,7 +1359,7 @@ static int PerformCommandDiff(CommandParameters* params) {
1367 rss.p_block = 0; 1359 rss.p_block = 0;
1368 rss.p_remain = (tgt->pos[1] - tgt->pos[0]) * BLOCKSIZE; 1360 rss.p_remain = (tgt->pos[1] - tgt->pos[0]) * BLOCKSIZE;
1369 1361
1370 if (check_lseek(params->fd, (off64_t) tgt->pos[0] * BLOCKSIZE, SEEK_SET) == -1) { 1362 if (!check_lseek(params->fd, (off64_t) tgt->pos[0] * BLOCKSIZE, SEEK_SET)) {
1371 goto pcdout; 1363 goto pcdout;
1372 } 1364 }
1373 1365
@@ -1906,7 +1898,7 @@ Value* RangeSha1Fn(const char* name, State* state, int argc, Expr* argv[]) {
1906 1898
1907 int i, j; 1899 int i, j;
1908 for (i = 0; i < rs->count; ++i) { 1900 for (i = 0; i < rs->count; ++i) {
1909 if (check_lseek(fd, (off64_t)rs->pos[i*2] * BLOCKSIZE, SEEK_SET) == -1) { 1901 if (!check_lseek(fd, (off64_t)rs->pos[i*2] * BLOCKSIZE, SEEK_SET)) {
1910 ErrorAbort(state, "failed to seek %s: %s", blockdev_filename->data, 1902 ErrorAbort(state, "failed to seek %s: %s", blockdev_filename->data,
1911 strerror(errno)); 1903 strerror(errno));
1912 goto done; 1904 goto done;