+2011-12-13 Vladimir Serbinenko <phcoder@gmail.com>
+
+ * grub-core/fs/iso9660.c (grub_iso9660_convert_string): Make first
+ argument a u8 pointer. All users updated.
+ Handle unaligned buffers.
+
2011-12-13 Vladimir Serbinenko <phcoder@gmail.com>
* grub-core/fs/iso9660.c (grub_iso9660_iterate_dir): Force inlining of
}
static char *
-grub_iso9660_convert_string (grub_uint16_t *us, int len)
+grub_iso9660_convert_string (grub_uint8_t *us, int len)
{
char *p;
int i;
+ grub_uint16_t t[len];
- p = grub_malloc (len * 4 + 1);
+ p = grub_malloc (len * GRUB_MAX_UTF8_PER_UTF16 + 1);
if (! p)
return p;
for (i=0; i<len; i++)
- us[i] = grub_be_to_cpu16 (us[i]);
+ t[i] = grub_be_to_cpu16 (grub_get_unaligned16 (us + 2 * i));
- *grub_utf16_to_utf8 ((grub_uint8_t *) p, us, len) = '\0';
+ *grub_utf16_to_utf8 ((grub_uint8_t *) p, t, len) = '\0';
return p;
}
oldname = filename;
filename = grub_iso9660_convert_string
- ((grub_uint16_t *) oldname, dirent.namelen >> 1);
+ ((grub_uint8_t *) oldname, dirent.namelen >> 1);
semicolon = grub_strrchr (filename, ';');
if (semicolon)
if (data)
{
if (data->joliet)
- *label = grub_iso9660_convert_string
- ((grub_uint16_t *) &data->voldesc.volname, 16);
+ *label = grub_iso9660_convert_string (data->voldesc.volname, 16);
else
*label = grub_strndup ((char *) data->voldesc.volname, 32);
if (*label)