diff options
Diffstat (limited to 'updater/blockimg.c')
-rw-r--r-- | updater/blockimg.c | 48 |
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) { | |||
113 | static int read_all(int fd, uint8_t* data, size_t size) { | 113 | static 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) { | |||
127 | static int write_all(int fd, const uint8_t* data, size_t size) { | 126 | static 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 | ||
147 | static int check_lseek(int fd, off64_t offset, int whence) { | 145 | static 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 | ||
162 | static void allocate(size_t size, uint8_t** buffer, size_t* buffer_alloc) { | 154 | static 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; |