efi_loader: fix AppendDevicePath
authorHeinrich Schuchardt <xypron.glpk@gmx.de>
Mon, 16 Apr 2018 05:59:06 +0000 (07:59 +0200)
committerAlexander Graf <agraf@suse.de>
Mon, 23 Apr 2018 19:34:28 +0000 (21:34 +0200)
The logic of the AppendDevicePath service of the
EFI_DEVICE_PATH_UTILITIES_PROTOCOL is incorrectly implemented:

* if both paths are NULL an end node has to be returned
* if both paths are not NULL the end node of the second device path has to
  be kept

Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
Signed-off-by: Alexander Graf <agraf@suse.de>
lib/efi_loader/efi_device_path.c

index 0cd0b45..9b4d9ae 100644 (file)
@@ -263,7 +263,10 @@ struct efi_device_path *efi_dp_append(const struct efi_device_path *dp1,
 {
        struct efi_device_path *ret;
 
-       if (!dp1) {
+       if (!dp1 && !dp2) {
+               /* return an end node */
+               ret = efi_dp_dup(&END);
+       } else if (!dp1) {
                ret = efi_dp_dup(dp2);
        } else if (!dp2) {
                ret = efi_dp_dup(dp1);
@@ -275,8 +278,8 @@ struct efi_device_path *efi_dp_append(const struct efi_device_path *dp1,
                if (!p)
                        return NULL;
                memcpy(p, dp1, sz1);
-               memcpy(p + sz1, dp2, sz2);
-               memcpy(p + sz1 + sz2, &END, sizeof(END));
+               /* the end node of the second device path has to be retained */
+               memcpy(p + sz1, dp2, sz2 + sizeof(END));
                ret = p;
        }