blob: 956f362bd81bab34add117da216f76244f9cb0ec [file] [log] [blame]
Alex Deymof1cbe172015-03-05 15:58:37 -08001// Copyright 2015 The Chromium OS Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "update_engine/payload_generator/payload_generation_config.h"
6
7#include "update_engine/delta_performer.h"
8#include "update_engine/payload_generator/delta_diff_generator.h"
9#include "update_engine/utils.h"
10
11namespace chromeos_update_engine {
12
13bool ImageConfig::ValidateRootfsExists() const {
14 TEST_AND_RETURN_FALSE(!rootfs_part.empty());
15 TEST_AND_RETURN_FALSE(utils::FileExists(rootfs_part.c_str()));
16 TEST_AND_RETURN_FALSE(rootfs_size > 0);
17 // The requested size is within the limits of the file.
18 TEST_AND_RETURN_FALSE(static_cast<off_t>(rootfs_size) <=
19 utils::FileSize(rootfs_part.c_str()));
20 return true;
21}
22
23bool ImageConfig::ValidateKernelExists() const {
24 TEST_AND_RETURN_FALSE(!kernel_part.empty());
25 TEST_AND_RETURN_FALSE(utils::FileExists(kernel_part.c_str()));
26 TEST_AND_RETURN_FALSE(kernel_size > 0);
27 TEST_AND_RETURN_FALSE(static_cast<off_t>(kernel_size) <=
28 utils::FileSize(kernel_part.c_str()));
29 return true;
30}
31
32bool ImageConfig::ValidateIsEmpty() const {
33 TEST_AND_RETURN_FALSE(ImageInfoIsEmpty());
34
35 TEST_AND_RETURN_FALSE(rootfs_part.empty());
36 TEST_AND_RETURN_FALSE(rootfs_size == 0);
37 TEST_AND_RETURN_FALSE(rootfs_mountpt.empty());
38 TEST_AND_RETURN_FALSE(kernel_part.empty());
39 TEST_AND_RETURN_FALSE(kernel_size == 0);
40 return true;
41}
42
43bool ImageConfig::LoadImageSize() {
44 TEST_AND_RETURN_FALSE(!rootfs_part.empty());
45 int rootfs_block_count, rootfs_block_size;
46 TEST_AND_RETURN_FALSE(utils::GetFilesystemSize(rootfs_part,
47 &rootfs_block_count,
48 &rootfs_block_size));
49 rootfs_size = static_cast<size_t>(rootfs_block_count) * rootfs_block_size;
50 if (!kernel_part.empty())
51 kernel_size = utils::FileSize(kernel_part);
52
53 // TODO(deymo): The delta generator algorithm doesn't support a block size
54 // different than 4 KiB. Remove this check once that's fixed. crbug.com/455045
55 if (rootfs_block_size != 4096) {
56 LOG(ERROR) << "The filesystem provided in " << rootfs_part
57 << " has a block size of " << rootfs_block_size
58 << " but delta_generator only supports 4096.";
59 return false;
60 }
61 return true;
62}
63
64bool ImageConfig::ImageInfoIsEmpty() const {
65 return image_info.board().empty()
66 && image_info.key().empty()
67 && image_info.channel().empty()
68 && image_info.version().empty()
69 && image_info.build_channel().empty()
70 && image_info.build_version().empty();
71}
72
73bool PayloadGenerationConfig::Validate() const {
74 if (is_delta) {
75 TEST_AND_RETURN_FALSE(source.ValidateRootfsExists());
76 TEST_AND_RETURN_FALSE(source.rootfs_size % block_size == 0);
77
78 if (!source.kernel_part.empty()) {
79 TEST_AND_RETURN_FALSE(source.ValidateKernelExists());
80 TEST_AND_RETURN_FALSE(source.kernel_size % block_size == 0);
81 }
82
83 // For deltas, we also need to check that the image is mounted in order to
84 // inspect the contents.
85 TEST_AND_RETURN_FALSE(!source.rootfs_mountpt.empty());
86 TEST_AND_RETURN_FALSE(utils::IsDir(source.rootfs_mountpt.c_str()));
87
88 TEST_AND_RETURN_FALSE(!target.rootfs_mountpt.empty());
89 TEST_AND_RETURN_FALSE(utils::IsDir(target.rootfs_mountpt.c_str()));
90
91 // Check for the supported minor_version values.
92 TEST_AND_RETURN_FALSE(minor_version == kInPlaceMinorPayloadVersion ||
93 minor_version == kSourceMinorPayloadVersion);
94
95 // If new_image_info is present, old_image_info must be present.
96 TEST_AND_RETURN_FALSE(source.ImageInfoIsEmpty() ==
97 target.ImageInfoIsEmpty());
98 } else {
99 // All the "source" image fields must be empty for full payloads.
100 TEST_AND_RETURN_FALSE(source.ValidateIsEmpty());
101 TEST_AND_RETURN_FALSE(minor_version ==
102 DeltaPerformer::kFullPayloadMinorVersion);
103 }
104
105 // In all cases, the target image must exists.
106 TEST_AND_RETURN_FALSE(target.ValidateRootfsExists());
107 TEST_AND_RETURN_FALSE(target.ValidateKernelExists());
108 TEST_AND_RETURN_FALSE(target.rootfs_size % block_size == 0);
109 TEST_AND_RETURN_FALSE(target.kernel_size % block_size == 0);
110
111 TEST_AND_RETURN_FALSE(chunk_size == -1 || chunk_size % block_size == 0);
Alex Deymo9b244df2015-03-11 21:51:18 -0700112
113 TEST_AND_RETURN_FALSE(rootfs_partition_size % block_size == 0);
114 TEST_AND_RETURN_FALSE(rootfs_partition_size >= target.rootfs_size);
115
Alex Deymof1cbe172015-03-05 15:58:37 -0800116 return true;
117}
118
119} // namespace chromeos_update_engine