efi_loader: fix device path to text protocol
The printing of a file path node must properly handle: * odd length of the device path node * UTF-16 character only partially contained in device path node * buffer overflow due to very long file path Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt@canonical.com>
This commit is contained in:
parent
c672dd770e
commit
344f26a766
1 changed files with 13 additions and 4 deletions
|
@ -8,6 +8,7 @@
|
||||||
#include <common.h>
|
#include <common.h>
|
||||||
#include <blk.h>
|
#include <blk.h>
|
||||||
#include <efi_loader.h>
|
#include <efi_loader.h>
|
||||||
|
#include <malloc.h>
|
||||||
|
|
||||||
#define MAC_OUTPUT_LEN 22
|
#define MAC_OUTPUT_LEN 22
|
||||||
#define UNKNOWN_OUTPUT_LEN 23
|
#define UNKNOWN_OUTPUT_LEN 23
|
||||||
|
@ -292,10 +293,18 @@ static char *dp_media(char *s, struct efi_device_path *dp)
|
||||||
case DEVICE_PATH_SUB_TYPE_FILE_PATH: {
|
case DEVICE_PATH_SUB_TYPE_FILE_PATH: {
|
||||||
struct efi_device_path_file_path *fp =
|
struct efi_device_path_file_path *fp =
|
||||||
(struct efi_device_path_file_path *)dp;
|
(struct efi_device_path_file_path *)dp;
|
||||||
int slen = (dp->length - sizeof(*dp)) / 2;
|
u16 *buffer;
|
||||||
if (slen > MAX_NODE_LEN - 2)
|
int slen = dp->length - sizeof(*dp);
|
||||||
slen = MAX_NODE_LEN - 2;
|
|
||||||
s += sprintf(s, "%-.*ls", slen, fp->str);
|
/* two bytes for \0, extra byte if dp->length is odd */
|
||||||
|
buffer = calloc(1, slen + 3);
|
||||||
|
if (!buffer) {
|
||||||
|
log_err("Out of memory\n");
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
memcpy(buffer, fp->str, dp->length - sizeof(*dp));
|
||||||
|
s += snprintf(s, MAX_NODE_LEN - 1, "%ls", buffer);
|
||||||
|
free(buffer);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
|
|
Loading…
Reference in a new issue