udf: Fix reading label, lvd.ident is dstring
UDF dstring has stored length in the last byte of buffer. Therefore last byte is not part of recorded characters. And empty string in dstring is encoded as empty buffer, including first byte (compression id).
This commit is contained in:
parent
e2296e205e
commit
ab444c54a7
1 changed files with 20 additions and 1 deletions
|
@ -860,6 +860,25 @@ read_string (const grub_uint8_t *raw, grub_size_t sz, char *outbuf)
|
|||
return outbuf;
|
||||
}
|
||||
|
||||
static char *
|
||||
read_dstring (const grub_uint8_t *raw, grub_size_t sz)
|
||||
{
|
||||
grub_size_t len;
|
||||
|
||||
if (raw[0] == 0) {
|
||||
char *outbuf = grub_malloc (1);
|
||||
if (!outbuf)
|
||||
return NULL;
|
||||
outbuf[0] = 0;
|
||||
return outbuf;
|
||||
}
|
||||
|
||||
len = raw[sz - 1];
|
||||
if (len > sz - 1)
|
||||
len = sz - 1;
|
||||
return read_string (raw, len, NULL);
|
||||
}
|
||||
|
||||
static int
|
||||
grub_udf_iterate_dir (grub_fshelp_node_t dir,
|
||||
grub_fshelp_iterate_dir_hook_t hook, void *hook_data)
|
||||
|
@ -1197,7 +1216,7 @@ grub_udf_label (grub_device_t device, char **label)
|
|||
|
||||
if (data)
|
||||
{
|
||||
*label = read_string (data->lvd.ident, sizeof (data->lvd.ident), 0);
|
||||
*label = read_dstring (data->lvd.ident, sizeof (data->lvd.ident));
|
||||
grub_free (data);
|
||||
}
|
||||
else
|
||||
|
|
Loading…
Reference in a new issue