Refactor the signature validation and lockdown integration a little in
order to avoid an unused variable.

Signed-off-by: Matthew Garrett <[email protected]>
Cc: Jiri Bohac <[email protected]>
Cc: Dave Young <[email protected]>
Cc: [email protected]
---
 kernel/kexec_file.c | 72 ++++++++++++++++++++++++++++-----------------
 1 file changed, 45 insertions(+), 27 deletions(-)

diff --git a/kernel/kexec_file.c b/kernel/kexec_file.c
index be0c13076056..e878587715b9 100644
--- a/kernel/kexec_file.c
+++ b/kernel/kexec_file.c
@@ -177,36 +177,13 @@ void kimage_file_post_load_cleanup(struct kimage *image)
        image->image_loader_data = NULL;
 }
 
-/*
- * In file mode list of segments is prepared by kernel. Copy relevant
- * data from user space, do error checking, prepare segment list
- */
+#ifdef CONFIG_KEXEC_SIG
 static int
-kimage_file_prepare_segments(struct kimage *image, int kernel_fd, int 
initrd_fd,
-                            const char __user *cmdline_ptr,
-                            unsigned long cmdline_len, unsigned flags)
+kimage_validate_signature(struct kimage *image)
 {
        const char *reason;
        int ret;
-       void *ldata;
-       loff_t size;
-
-       ret = kernel_read_file_from_fd(kernel_fd, &image->kernel_buf,
-                                      &size, INT_MAX, READING_KEXEC_IMAGE);
-       if (ret)
-               return ret;
-       image->kernel_buf_len = size;
-
-       /* IMA needs to pass the measurement list to the next kernel. */
-       ima_add_kexec_buffer(image);
 
-       /* Call arch image probe handlers */
-       ret = arch_kexec_kernel_image_probe(image, image->kernel_buf,
-                                           image->kernel_buf_len);
-       if (ret)
-               goto out;
-
-#ifdef CONFIG_KEXEC_SIG
        ret = arch_kexec_kernel_verify_sig(image, image->kernel_buf,
                                           image->kernel_buf_len);
        switch (ret) {
@@ -228,7 +205,7 @@ kimage_file_prepare_segments(struct kimage *image, int 
kernel_fd, int initrd_fd,
        decide:
                if (IS_ENABLED(CONFIG_KEXEC_SIG_FORCE)) {
                        pr_notice("%s rejected\n", reason);
-                       goto out;
+                       break;
                }
 
                ret = 0;
@@ -251,9 +228,44 @@ kimage_file_prepare_segments(struct kimage *image, int 
kernel_fd, int initrd_fd,
                 */
        default:
                pr_notice("kernel signature verification failed (%d).\n", ret);
-               goto out;
+               break;
        }
+
+       return ret;
+}
+#endif
+
+/*
+ * In file mode list of segments is prepared by kernel. Copy relevant
+ * data from user space, do error checking, prepare segment list
+ */
+static int
+kimage_file_prepare_segments(struct kimage *image, int kernel_fd, int 
initrd_fd,
+                            const char __user *cmdline_ptr,
+                            unsigned long cmdline_len, unsigned flags)
+{
+       int ret;
+       void *ldata;
+       loff_t size;
+
+       ret = kernel_read_file_from_fd(kernel_fd, &image->kernel_buf,
+                                      &size, INT_MAX, READING_KEXEC_IMAGE);
+       if (ret)
+               return ret;
+       image->kernel_buf_len = size;
+
+       /* Call arch image probe handlers */
+       ret = arch_kexec_kernel_image_probe(image, image->kernel_buf,
+                                           image->kernel_buf_len);
+       if (ret)
+               goto out;
+
+#ifdef CONFIG_KEXEC_SIG
+       ret = kimage_validate_signature(image);
+       if (ret)
+               goto out;
 #endif
+
        /* It is possible that there no initramfs is being loaded */
        if (!(flags & KEXEC_FILE_NO_INITRAMFS)) {
                ret = kernel_read_file_from_fd(initrd_fd, &image->initrd_buf,
@@ -279,8 +291,14 @@ kimage_file_prepare_segments(struct kimage *image, int 
kernel_fd, int initrd_fd,
                        ret = -EINVAL;
                        goto out;
                }
+
+               ima_kexec_cmdline(image->cmdline_buf,
+                                 image->cmdline_buf_len - 1);
        }
 
+       /* IMA needs to pass the measurement list to the next kernel. */
+       ima_add_kexec_buffer(image);
+
        /* Call arch image load handlers */
        ldata = arch_kexec_kernel_image_load(image);
 
-- 
2.23.0.rc1.153.gdeed80330f-goog


_______________________________________________
kexec mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/kexec

Reply via email to