diff --git a/updater/blockimg.cpp b/updater/blockimg.cpp
index 5f5f9bd..091bedf 100644
--- a/updater/blockimg.cpp
+++ b/updater/blockimg.cpp
@@ -378,19 +378,16 @@
 //    <src_range> <tgt_range>
 //
 // The source range is loaded into the provided buffer, reallocating
-// it to make it larger if necessary.  The target ranges are returned
-// in *tgt, if tgt is non-null.
+// it to make it larger if necessary.
 
-static int LoadSrcTgtVersion1(char** wordsave, RangeSet* tgt, size_t& src_blocks,
+static int LoadSrcTgtVersion1(char** wordsave, RangeSet& tgt, size_t& src_blocks,
         uint8_t** buffer, size_t* buffer_alloc, int fd) {
     char* word = strtok_r(nullptr, " ", wordsave);
     RangeSet src;
     parse_range(word, src);
 
-    if (tgt != nullptr) {
-        word = strtok_r(nullptr, " ", wordsave);
-        parse_range(word, *tgt);
-    }
+    word = strtok_r(nullptr, " ", wordsave);
+    parse_range(word, tgt);
 
     allocate(src.size * BLOCKSIZE, buffer, buffer_alloc);
     int rc = ReadBlocks(src, *buffer, fd);
@@ -730,9 +727,15 @@
         return 0;
     }
 
-    if (LoadSrcTgtVersion1(wordsave, nullptr, blocks, buffer, buffer_alloc, fd) == -1) {
+    char* word = strtok_r(nullptr, " ", wordsave);
+    RangeSet src;
+    parse_range(word, src);
+
+    allocate(src.size * BLOCKSIZE, buffer, buffer_alloc);
+    if (ReadBlocks(src, *buffer, fd) == -1) {
         return -1;
     }
+    blocks = src.size;
 
     if (usehash && VerifyBlocks(id, *buffer, blocks, true) != 0) {
         // Source blocks have unexpected contents. If we actually need this
@@ -791,7 +794,7 @@
 // reallocated if needed to accommodate the source data.  *tgt is the
 // target RangeSet.  Any stashes required are loaded using LoadStash.
 
-static int LoadSrcTgtVersion2(char** wordsave, RangeSet* tgt, size_t& src_blocks, uint8_t** buffer,
+static int LoadSrcTgtVersion2(char** wordsave, RangeSet& tgt, size_t& src_blocks, uint8_t** buffer,
         size_t* buffer_alloc, int fd, const std::string& stashbase, bool* overlap) {
     char* word;
     char* colonsave;
@@ -800,10 +803,8 @@
     size_t stashalloc = 0;
     uint8_t* stash = nullptr;
 
-    if (tgt != nullptr) {
-        word = strtok_r(nullptr, " ", wordsave);
-        parse_range(word, *tgt);
-    }
+    word = strtok_r(nullptr, " ", wordsave);
+    parse_range(word, tgt);
 
     word = strtok_r(nullptr, " ", wordsave);
     src_blocks = strtol(word, nullptr, 0);
@@ -818,8 +819,8 @@
         parse_range(word, src);
         int res = ReadBlocks(src, *buffer, fd);
 
-        if (overlap && tgt) {
-            *overlap = range_overlaps(src, *tgt);
+        if (overlap) {
+            *overlap = range_overlaps(src, tgt);
         }
 
         if (res == -1) {
@@ -902,13 +903,9 @@
 // If the return value is 0, source blocks have expected content and the command
 // can be performed.
 
-static int LoadSrcTgtVersion3(CommandParameters& params, RangeSet* tgt, size_t& src_blocks,
+static int LoadSrcTgtVersion3(CommandParameters& params, RangeSet& tgt, size_t& src_blocks,
         bool onehash, bool& overlap) {
 
-    if (!tgt) {
-        return -1;
-    }
-
     char* srchash = strtok_r(nullptr, " ", &params.cpos);
     if (srchash == nullptr) {
         fprintf(stderr, "missing source hash\n");
@@ -932,13 +929,13 @@
         return -1;
     }
 
-    std::vector<uint8_t> tgtbuffer(tgt->size * BLOCKSIZE);
+    std::vector<uint8_t> tgtbuffer(tgt.size * BLOCKSIZE);
 
-    if (ReadBlocks(*tgt, tgtbuffer.data(), params.fd) == -1) {
+    if (ReadBlocks(tgt, tgtbuffer.data(), params.fd) == -1) {
         return -1;
     }
 
-    if (VerifyBlocks(tgthash, tgtbuffer.data(), tgt->size, false) == 0) {
+    if (VerifyBlocks(tgthash, tgtbuffer.data(), tgt.size, false) == 0) {
         // Target blocks already have expected content, command should be skipped
         fprintf(stderr, "verified, to return 1");
         return 1;
@@ -989,13 +986,13 @@
     RangeSet tgt;
 
     if (params.version == 1) {
-        status = LoadSrcTgtVersion1(&params.cpos, &tgt, blocks, &params.buffer,
+        status = LoadSrcTgtVersion1(&params.cpos, tgt, blocks, &params.buffer,
                     &params.bufsize, params.fd);
     } else if (params.version == 2) {
-        status = LoadSrcTgtVersion2(&params.cpos, &tgt, blocks, &params.buffer,
+        status = LoadSrcTgtVersion2(&params.cpos, tgt, blocks, &params.buffer,
                     &params.bufsize, params.fd, params.stashbase, nullptr);
     } else if (params.version >= 3) {
-        status = LoadSrcTgtVersion3(params, &tgt, blocks, true, overlap);
+        status = LoadSrcTgtVersion3(params, tgt, blocks, true, overlap);
     }
 
     if (status == -1) {
@@ -1149,13 +1146,13 @@
     size_t blocks = 0;
     int status = 0;
     if (params.version == 1) {
-        status = LoadSrcTgtVersion1(&params.cpos, &tgt, blocks, &params.buffer,
+        status = LoadSrcTgtVersion1(&params.cpos, tgt, blocks, &params.buffer,
                     &params.bufsize, params.fd);
     } else if (params.version == 2) {
-        status = LoadSrcTgtVersion2(&params.cpos, &tgt, blocks, &params.buffer,
+        status = LoadSrcTgtVersion2(&params.cpos, tgt, blocks, &params.buffer,
                     &params.bufsize, params.fd, params.stashbase, nullptr);
     } else if (params.version >= 3) {
-        status = LoadSrcTgtVersion3(params, &tgt, blocks, false, overlap);
+        status = LoadSrcTgtVersion3(params, tgt, blocks, false, overlap);
     }
 
     if (status == -1) {
