char *filename;
int i;
struct grub_fshelp_node *node;
+ grub_uint16_t *keyname;
struct grub_hfsplus_catfile *fileinfo;
enum grub_fshelp_filetype type = GRUB_FSHELP_UNKNOWN;
struct list_nodes_ctx *ctx = hook_arg;
if (! filename)
return 0;
+ keyname = grub_malloc (grub_be_to_cpu16 (catkey->namelen) * sizeof (*keyname));
+ if (!keyname)
+ {
+ grub_free (filename);
+ return 0;
+ }
+
/* Make sure the byte order of the UTF16 string is correct. */
for (i = 0; i < grub_be_to_cpu16 (catkey->namelen); i++)
{
- catkey->name[i] = grub_be_to_cpu16 (catkey->name[i]);
+ keyname[i] = grub_be_to_cpu16 (catkey->name[i]);
- if (catkey->name[i] == '/')
- catkey->name[i] = ':';
+ if (keyname[i] == '/')
+ keyname[i] = ':';
/* If the name is obviously invalid, skip this node. */
- if (catkey->name[i] == 0)
+ if (keyname[i] == 0)
{
+ grub_free (keyname);
grub_free (filename);
return 0;
}
}
- *grub_utf16_to_utf8 ((grub_uint8_t *) filename, catkey->name,
+ *grub_utf16_to_utf8 ((grub_uint8_t *) filename, keyname,
grub_be_to_cpu16 (catkey->namelen)) = '\0';
- /* Restore the byte order to what it was previously. */
- for (i = 0; i < grub_be_to_cpu16 (catkey->namelen); i++)
- {
- if (catkey->name[i] == ':')
- catkey->name[i] = '/';
- catkey->name[i] = grub_be_to_cpu16 (catkey->name[i]);
- }
+ grub_free (keyname);
/* hfs+ is case insensitive. */
if (! ctx->dir->data->case_sensitive)
grub_disk_t disk = device->disk;
struct grub_hfsplus_catkey *catkey;
int i, label_len;
+ grub_uint16_t *label_name;
struct grub_hfsplus_key_internal intern;
struct grub_hfsplus_btnode *node = NULL;
grub_disk_addr_t ptr = 0;
grub_hfsplus_btree_recptr (&data->catalog_tree, node, ptr);
label_len = grub_be_to_cpu16 (catkey->namelen);
+ label_name = grub_malloc (label_len * sizeof (*label_name));
+ if (!label_name)
+ {
+ grub_free (node);
+ grub_free (data);
+ return grub_errno;
+ }
+
for (i = 0; i < label_len; i++)
{
- catkey->name[i] = grub_be_to_cpu16 (catkey->name[i]);
+ label_name[i] = grub_be_to_cpu16 (catkey->name[i]);
/* If the name is obviously invalid, skip this node. */
- if (catkey->name[i] == 0)
- return 0;
+ if (label_name[i] == 0)
+ {
+ grub_free (label_name);
+ grub_free (node);
+ grub_free (data);
+ return 0;
+ }
}
*label = grub_malloc (label_len * GRUB_MAX_UTF8_PER_UTF16 + 1);
if (! *label)
- return grub_errno;
+ {
+ grub_free (label_name);
+ grub_free (node);
+ grub_free (data);
+ return grub_errno;
+ }
- *grub_utf16_to_utf8 ((grub_uint8_t *) (*label), catkey->name,
+ *grub_utf16_to_utf8 ((grub_uint8_t *) (*label), label_name,
label_len) = '\0';
+ grub_free (label_name);
grub_free (node);
grub_free (data);