else if (j->compressed == IMPORT_JOB_GZIP)
inflateEnd(&j->gzip);
+ if (j->hash_context)
+ gcry_md_close(j->hash_context);
+
free(j->url);
free(j->etag);
strv_free(j->old_etags);
free(j->payload);
+ free(j->sha256);
free(j);
goto finish;
} else if (status == 304) {
log_info("Image already downloaded. Skipping download.");
+ j->etag_exists = true;
r = 0;
goto finish;
} else if (status >= 300) {
goto finish;
}
+ if (j->hash_context) {
+ uint8_t *k;
+
+ k = gcry_md_read(j->hash_context, GCRY_MD_SHA256);
+ if (!k) {
+ log_error("Failed to get checksum.");
+ r = -EIO;
+ goto finish;
+ }
+
+ j->sha256 = hexmem(k, gcry_md_get_algo_dlen(GCRY_MD_SHA256));
+ if (!j->sha256) {
+ r = log_oom();
+ goto finish;
+ }
+
+ log_debug("SHA256 of %s is %s.", j->url, j->sha256);
+ }
+
if (j->disk_fd >= 0 && j->allow_sparse) {
/* Make sure the file size is right, in case the file was
* sparse and we just seeked for the last part */
import_job_finish(j, r);
}
-
static int import_job_write_uncompressed(ImportJob *j, void *p, size_t sz) {
ssize_t n;
assert(j);
assert(p);
assert(sz > 0);
- assert(j->disk_fd >= 0);
if (j->written_uncompressed + sz < j->written_uncompressed) {
log_error("File too large, overflow");
assert(j);
assert(p);
assert(sz > 0);
- assert(j->disk_fd >= 0);
if (j->written_compressed + sz < j->written_compressed) {
log_error("File too large, overflow");
return -EFBIG;
}
+ if (j->hash_context)
+ gcry_md_write(j->hash_context, p, sz);
+
switch (j->compressed) {
case IMPORT_JOB_UNCOMPRESSED:
}
}
+ if (j->calc_hash) {
+ if (gcry_md_open(&j->hash_context, GCRY_MD_SHA256, 0) != 0) {
+ log_error("Failed to initialize hash context.");
+ return -EIO;
+ }
+ }
+
return 0;
}
j->payload = NULL;
j->payload_size = 0;
+ j->payload_allocated = 0;
j->state = IMPORT_JOB_RUNNING;
if (strv_contains(j->old_etags, j->etag)) {
log_info("Image already downloaded. Skipping download.");
+ j->etag_exists = true;
import_job_finish(j, 0);
return sz;
}