NLS: update handling of Unicode
This patch (as1239) updates the kernel's treatment of Unicode. The character-set conversion routines are well behind the current state of the Unicode specification: They don't recognize the existence of code points beyond plane 0 or of surrogate pairs in the UTF-16 encoding. The old wchar_t 16-bit type is retained because it's still used in lots of places. This shouldn't cause any new problems; if a conversion now results in an invalid 16-bit code then before it must have yielded an undefined code. Difficult-to-read names like "utf_mbstowcs" are replaced with more transparent names like "utf8s_to_utf16s" and the ordering of the parameters is rationalized (buffer lengths come immediate after the pointers they refer to, and the inputs precede the outputs). Fortunately the low-level conversion routines are used in only a few places; the interfaces to the higher-level uni2char and char2uni methods have been left unchanged. Signed-off-by: Alan Stern <stern@rowland.harvard.edu> Acked-by: Clemens Ladisch <clemens@ladisch.de> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:

committato da
Greg Kroah-Hartman

parent
a853a3d4eb
commit
74675a5850
29
fs/fat/dir.c
29
fs/fat/dir.c
@@ -22,6 +22,19 @@
|
||||
#include <asm/uaccess.h>
|
||||
#include "fat.h"
|
||||
|
||||
/*
|
||||
* Maximum buffer size of short name.
|
||||
* [(MSDOS_NAME + '.') * max one char + nul]
|
||||
* For msdos style, ['.' (hidden) + MSDOS_NAME + '.' + nul]
|
||||
*/
|
||||
#define FAT_MAX_SHORT_SIZE ((MSDOS_NAME + 1) * NLS_MAX_CHARSET_SIZE + 1)
|
||||
/*
|
||||
* Maximum buffer size of unicode chars from slots.
|
||||
* [(max longname slots * 13 (size in a slot) + nul) * sizeof(wchar_t)]
|
||||
*/
|
||||
#define FAT_MAX_UNI_CHARS ((MSDOS_SLOTS - 1) * 13 + 1)
|
||||
#define FAT_MAX_UNI_SIZE (FAT_MAX_UNI_CHARS * sizeof(wchar_t))
|
||||
|
||||
static inline loff_t fat_make_i_pos(struct super_block *sb,
|
||||
struct buffer_head *bh,
|
||||
struct msdos_dir_entry *de)
|
||||
@@ -171,7 +184,8 @@ static inline int fat_uni_to_x8(struct msdos_sb_info *sbi, const wchar_t *uni,
|
||||
unsigned char *buf, int size)
|
||||
{
|
||||
if (sbi->options.utf8)
|
||||
return utf8_wcstombs(buf, uni, size);
|
||||
return utf16s_to_utf8s(uni, FAT_MAX_UNI_CHARS,
|
||||
UTF16_HOST_ENDIAN, buf, size);
|
||||
else
|
||||
return uni16_to_x8(buf, uni, size, sbi->options.unicode_xlate,
|
||||
sbi->nls_io);
|
||||
@@ -324,19 +338,6 @@ parse_long:
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Maximum buffer size of short name.
|
||||
* [(MSDOS_NAME + '.') * max one char + nul]
|
||||
* For msdos style, ['.' (hidden) + MSDOS_NAME + '.' + nul]
|
||||
*/
|
||||
#define FAT_MAX_SHORT_SIZE ((MSDOS_NAME + 1) * NLS_MAX_CHARSET_SIZE + 1)
|
||||
/*
|
||||
* Maximum buffer size of unicode chars from slots.
|
||||
* [(max longname slots * 13 (size in a slot) + nul) * sizeof(wchar_t)]
|
||||
*/
|
||||
#define FAT_MAX_UNI_CHARS ((MSDOS_SLOTS - 1) * 13 + 1)
|
||||
#define FAT_MAX_UNI_SIZE (FAT_MAX_UNI_CHARS * sizeof(wchar_t))
|
||||
|
||||
/*
|
||||
* Return values: negative -> error, 0 -> not found, positive -> found,
|
||||
* value is the total amount of slots, including the shortname entry.
|
||||
|
@@ -502,11 +502,11 @@ xlate_to_uni(const unsigned char *name, int len, unsigned char *outname,
|
||||
if (utf8) {
|
||||
int name_len = strlen(name);
|
||||
|
||||
*outlen = utf8_mbstowcs((wchar_t *)outname, name, PATH_MAX);
|
||||
*outlen = utf8s_to_utf16s(name, PATH_MAX, (wchar_t *) outname);
|
||||
|
||||
/*
|
||||
* We stripped '.'s before and set len appropriately,
|
||||
* but utf8_mbstowcs doesn't care about len
|
||||
* but utf8s_to_utf16s doesn't care about len
|
||||
*/
|
||||
*outlen -= (name_len - len);
|
||||
|
||||
|
Fai riferimento in un nuovo problema
Block a user