Merge tag 'ASB-2025-01-05_4.19-stable' of https://android.googlesource.com/kernel/common into android13-4.19-kona
https://source.android.com/docs/security/bulletin/2025-01-01 * tag 'ASB-2025-01-05_4.19-stable' of https://android.googlesource.com/kernel/common: (132 commits) Revert "UPSTREAM: unicode: Don't special case ignorable code points" Reapply "UPSTREAM: unicode: Don't special case ignorable code points" Revert "UPSTREAM: unicode: Don't special case ignorable code points" Linux 4.19.325 sh: intc: Fix use-after-free bug in register_intc_controller() modpost: remove incorrect code in do_eisa_entry() 9p/xen: fix release of IRQ 9p/xen: fix init sequence block: return unsigned int from bdev_io_min jffs2: fix use of uninitialized variable ubi: fastmap: Fix duplicate slab cache names while attaching ubifs: Correct the total block count by deducting journal reservation rtc: check if __rtc_read_time was successful in rtc_timer_do_work() NFSv4.0: Fix a use-after-free problem in the asynchronous open() um: Fix the return value of elf_core_copy_task_fpregs rpmsg: glink: Propagate TX failures in intentless mode as well NFSD: Prevent a potential integer overflow lib: string_helpers: silence snprintf() output truncation warning usb: dwc3: gadget: Fix checking for number of TRBs left media: wl128x: Fix atomicity violation in fmc_send_cmd() ... Conflicts: arch/arm64/boot/dts/vendor/bindings/clock/adi,axi-clkgen.yaml arch/arm64/boot/dts/vendor/bindings/clock/axi-clkgen.txt drivers/rpmsg/qcom_glink_native.c Change-Id: Iea6ddf20dfaa4419f6e0b2efcee1890bfa8e2554
This commit is contained in:
@@ -185,6 +185,56 @@ static inline ext4_fsblk_t ext4_fsmap_next_pblk(struct ext4_fsmap *fmr)
|
||||
return fmr->fmr_physical + fmr->fmr_length;
|
||||
}
|
||||
|
||||
static int ext4_getfsmap_meta_helper(struct super_block *sb,
|
||||
ext4_group_t agno, ext4_grpblk_t start,
|
||||
ext4_grpblk_t len, void *priv)
|
||||
{
|
||||
struct ext4_getfsmap_info *info = priv;
|
||||
struct ext4_fsmap *p;
|
||||
struct ext4_fsmap *tmp;
|
||||
struct ext4_sb_info *sbi = EXT4_SB(sb);
|
||||
ext4_fsblk_t fsb, fs_start, fs_end;
|
||||
int error;
|
||||
|
||||
fs_start = fsb = (EXT4_C2B(sbi, start) +
|
||||
ext4_group_first_block_no(sb, agno));
|
||||
fs_end = fs_start + EXT4_C2B(sbi, len);
|
||||
|
||||
/* Return relevant extents from the meta_list */
|
||||
list_for_each_entry_safe(p, tmp, &info->gfi_meta_list, fmr_list) {
|
||||
if (p->fmr_physical < info->gfi_next_fsblk) {
|
||||
list_del(&p->fmr_list);
|
||||
kfree(p);
|
||||
continue;
|
||||
}
|
||||
if (p->fmr_physical <= fs_start ||
|
||||
p->fmr_physical + p->fmr_length <= fs_end) {
|
||||
/* Emit the retained free extent record if present */
|
||||
if (info->gfi_lastfree.fmr_owner) {
|
||||
error = ext4_getfsmap_helper(sb, info,
|
||||
&info->gfi_lastfree);
|
||||
if (error)
|
||||
return error;
|
||||
info->gfi_lastfree.fmr_owner = 0;
|
||||
}
|
||||
error = ext4_getfsmap_helper(sb, info, p);
|
||||
if (error)
|
||||
return error;
|
||||
fsb = p->fmr_physical + p->fmr_length;
|
||||
if (info->gfi_next_fsblk < fsb)
|
||||
info->gfi_next_fsblk = fsb;
|
||||
list_del(&p->fmr_list);
|
||||
kfree(p);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if (info->gfi_next_fsblk < fsb)
|
||||
info->gfi_next_fsblk = fsb;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/* Transform a blockgroup's free record into a fsmap */
|
||||
static int ext4_getfsmap_datadev_helper(struct super_block *sb,
|
||||
ext4_group_t agno, ext4_grpblk_t start,
|
||||
@@ -539,6 +589,7 @@ static int ext4_getfsmap_datadev(struct super_block *sb,
|
||||
error = ext4_mballoc_query_range(sb, info->gfi_agno,
|
||||
EXT4_B2C(sbi, info->gfi_low.fmr_physical),
|
||||
EXT4_B2C(sbi, info->gfi_high.fmr_physical),
|
||||
ext4_getfsmap_meta_helper,
|
||||
ext4_getfsmap_datadev_helper, info);
|
||||
if (error)
|
||||
goto err;
|
||||
@@ -560,7 +611,8 @@ static int ext4_getfsmap_datadev(struct super_block *sb,
|
||||
|
||||
/* Report any gaps at the end of the bg */
|
||||
info->gfi_last = true;
|
||||
error = ext4_getfsmap_datadev_helper(sb, end_ag, last_cluster, 0, info);
|
||||
error = ext4_getfsmap_datadev_helper(sb, end_ag, last_cluster + 1,
|
||||
0, info);
|
||||
if (error)
|
||||
goto err;
|
||||
|
||||
|
||||
@@ -5424,13 +5424,14 @@ int
|
||||
ext4_mballoc_query_range(
|
||||
struct super_block *sb,
|
||||
ext4_group_t group,
|
||||
ext4_grpblk_t start,
|
||||
ext4_grpblk_t first,
|
||||
ext4_grpblk_t end,
|
||||
ext4_mballoc_query_range_fn meta_formatter,
|
||||
ext4_mballoc_query_range_fn formatter,
|
||||
void *priv)
|
||||
{
|
||||
void *bitmap;
|
||||
ext4_grpblk_t next;
|
||||
ext4_grpblk_t start, next;
|
||||
struct ext4_buddy e4b;
|
||||
int error;
|
||||
|
||||
@@ -5441,10 +5442,19 @@ ext4_mballoc_query_range(
|
||||
|
||||
ext4_lock_group(sb, group);
|
||||
|
||||
start = max(e4b.bd_info->bb_first_free, start);
|
||||
start = max(e4b.bd_info->bb_first_free, first);
|
||||
if (end >= EXT4_CLUSTERS_PER_GROUP(sb))
|
||||
end = EXT4_CLUSTERS_PER_GROUP(sb) - 1;
|
||||
|
||||
if (meta_formatter && start != first) {
|
||||
if (start > end)
|
||||
start = end;
|
||||
ext4_unlock_group(sb, group);
|
||||
error = meta_formatter(sb, group, first, start - first,
|
||||
priv);
|
||||
if (error)
|
||||
goto out_unload;
|
||||
ext4_lock_group(sb, group);
|
||||
}
|
||||
while (start <= end) {
|
||||
start = mb_find_next_zero_bit(bitmap, end + 1, start);
|
||||
if (start > end)
|
||||
|
||||
@@ -212,6 +212,7 @@ ext4_mballoc_query_range(
|
||||
ext4_group_t agno,
|
||||
ext4_grpblk_t start,
|
||||
ext4_grpblk_t end,
|
||||
ext4_mballoc_query_range_fn meta_formatter,
|
||||
ext4_mballoc_query_range_fn formatter,
|
||||
void *priv);
|
||||
|
||||
|
||||
@@ -259,9 +259,9 @@ __u32 ext4_free_group_clusters(struct super_block *sb,
|
||||
__u32 ext4_free_inodes_count(struct super_block *sb,
|
||||
struct ext4_group_desc *bg)
|
||||
{
|
||||
return le16_to_cpu(bg->bg_free_inodes_count_lo) |
|
||||
return le16_to_cpu(READ_ONCE(bg->bg_free_inodes_count_lo)) |
|
||||
(EXT4_DESC_SIZE(sb) >= EXT4_MIN_DESC_SIZE_64BIT ?
|
||||
(__u32)le16_to_cpu(bg->bg_free_inodes_count_hi) << 16 : 0);
|
||||
(__u32)le16_to_cpu(READ_ONCE(bg->bg_free_inodes_count_hi)) << 16 : 0);
|
||||
}
|
||||
|
||||
__u32 ext4_used_dirs_count(struct super_block *sb,
|
||||
@@ -315,9 +315,9 @@ void ext4_free_group_clusters_set(struct super_block *sb,
|
||||
void ext4_free_inodes_set(struct super_block *sb,
|
||||
struct ext4_group_desc *bg, __u32 count)
|
||||
{
|
||||
bg->bg_free_inodes_count_lo = cpu_to_le16((__u16)count);
|
||||
WRITE_ONCE(bg->bg_free_inodes_count_lo, cpu_to_le16((__u16)count));
|
||||
if (EXT4_DESC_SIZE(sb) >= EXT4_MIN_DESC_SIZE_64BIT)
|
||||
bg->bg_free_inodes_count_hi = cpu_to_le16(count >> 16);
|
||||
WRITE_ONCE(bg->bg_free_inodes_count_hi, cpu_to_le16(count >> 16));
|
||||
}
|
||||
|
||||
void ext4_used_dirs_set(struct super_block *sb,
|
||||
|
||||
@@ -156,6 +156,7 @@ struct hfsplus_sb_info {
|
||||
|
||||
/* Runtime variables */
|
||||
u32 blockoffset;
|
||||
u32 min_io_size;
|
||||
sector_t part_start;
|
||||
sector_t sect_count;
|
||||
int fs_shift;
|
||||
@@ -306,7 +307,7 @@ struct hfsplus_readdir_data {
|
||||
*/
|
||||
static inline unsigned short hfsplus_min_io_size(struct super_block *sb)
|
||||
{
|
||||
return max_t(unsigned short, bdev_logical_block_size(sb->s_bdev),
|
||||
return max_t(unsigned short, HFSPLUS_SB(sb)->min_io_size,
|
||||
HFSPLUS_SECTOR_SIZE);
|
||||
}
|
||||
|
||||
|
||||
@@ -170,6 +170,8 @@ int hfsplus_read_wrapper(struct super_block *sb)
|
||||
if (!blocksize)
|
||||
goto out;
|
||||
|
||||
sbi->min_io_size = blocksize;
|
||||
|
||||
if (hfsplus_get_last_session(sb, &part_start, &part_size))
|
||||
goto out;
|
||||
|
||||
|
||||
@@ -340,10 +340,9 @@ static int jffs2_block_check_erase(struct jffs2_sb_info *c, struct jffs2_erasebl
|
||||
} while(--retlen);
|
||||
mtd_unpoint(c->mtd, jeb->offset, c->sector_size);
|
||||
if (retlen) {
|
||||
pr_warn("Newly-erased block contained word 0x%lx at offset 0x%08tx\n",
|
||||
*wordebuf,
|
||||
jeb->offset +
|
||||
c->sector_size-retlen * sizeof(*wordebuf));
|
||||
*bad_offset = jeb->offset + c->sector_size - retlen * sizeof(*wordebuf);
|
||||
pr_warn("Newly-erased block contained word 0x%lx at offset 0x%08x\n",
|
||||
*wordebuf, *bad_offset);
|
||||
return -EIO;
|
||||
}
|
||||
return 0;
|
||||
|
||||
@@ -572,7 +572,7 @@ static int ea_get(struct inode *inode, struct ea_buffer *ea_buf, int min_size)
|
||||
|
||||
size_check:
|
||||
if (EALIST_SIZE(ea_buf->xattr) != ea_size) {
|
||||
int size = min_t(int, EALIST_SIZE(ea_buf->xattr), ea_size);
|
||||
int size = clamp_t(int, ea_size, 0, EALIST_SIZE(ea_buf->xattr));
|
||||
|
||||
printk(KERN_ERR "ea_get: invalid extended attribute\n");
|
||||
print_hex_dump(KERN_ERR, "", DUMP_PREFIX_ADDRESS, 16, 1,
|
||||
|
||||
@@ -2379,12 +2379,14 @@ static void nfs4_open_release(void *calldata)
|
||||
struct nfs4_opendata *data = calldata;
|
||||
struct nfs4_state *state = NULL;
|
||||
|
||||
/* In case of error, no cleanup! */
|
||||
if (data->rpc_status != 0 || !data->rpc_done) {
|
||||
nfs_release_seqid(data->o_arg.seqid);
|
||||
goto out_free;
|
||||
}
|
||||
/* If this request hasn't been cancelled, do nothing */
|
||||
if (!data->cancelled)
|
||||
goto out_free;
|
||||
/* In case of error, no cleanup! */
|
||||
if (data->rpc_status != 0 || !data->rpc_done)
|
||||
goto out_free;
|
||||
/* In case we need an open_confirm, no cleanup! */
|
||||
if (data->o_res.rflags & NFS4_OPEN_RESULT_CONFIRM)
|
||||
goto out_free;
|
||||
|
||||
@@ -283,17 +283,17 @@ static int decode_cb_compound4res(struct xdr_stream *xdr,
|
||||
u32 length;
|
||||
__be32 *p;
|
||||
|
||||
p = xdr_inline_decode(xdr, 4 + 4);
|
||||
p = xdr_inline_decode(xdr, XDR_UNIT);
|
||||
if (unlikely(p == NULL))
|
||||
goto out_overflow;
|
||||
hdr->status = be32_to_cpup(p++);
|
||||
hdr->status = be32_to_cpup(p);
|
||||
/* Ignore the tag */
|
||||
length = be32_to_cpup(p++);
|
||||
p = xdr_inline_decode(xdr, length + 4);
|
||||
if (unlikely(p == NULL))
|
||||
if (xdr_stream_decode_u32(xdr, &length) < 0)
|
||||
goto out_overflow;
|
||||
if (xdr_inline_decode(xdr, length) == NULL)
|
||||
goto out_overflow;
|
||||
if (xdr_stream_decode_u32(xdr, &hdr->nops) < 0)
|
||||
goto out_overflow;
|
||||
p += XDR_QUADLEN(length);
|
||||
hdr->nops = be32_to_cpup(p);
|
||||
return 0;
|
||||
out_overflow:
|
||||
return -EIO;
|
||||
@@ -1134,6 +1134,8 @@ static void nfsd4_process_cb_update(struct nfsd4_callback *cb)
|
||||
ses = c->cn_session;
|
||||
}
|
||||
spin_unlock(&clp->cl_lock);
|
||||
if (!c)
|
||||
return;
|
||||
|
||||
err = setup_callback_client(clp, &conn, ses);
|
||||
if (err) {
|
||||
|
||||
@@ -596,7 +596,8 @@ nfs4_reset_recoverydir(char *recdir)
|
||||
return status;
|
||||
status = -ENOTDIR;
|
||||
if (d_is_dir(path.dentry)) {
|
||||
strcpy(user_recovery_dirname, recdir);
|
||||
strscpy(user_recovery_dirname, recdir,
|
||||
sizeof(user_recovery_dirname));
|
||||
status = 0;
|
||||
}
|
||||
path_put(&path);
|
||||
|
||||
@@ -68,7 +68,6 @@ nilfs_btnode_create_block(struct address_space *btnc, __u64 blocknr)
|
||||
goto failed;
|
||||
}
|
||||
memset(bh->b_data, 0, i_blocksize(inode));
|
||||
bh->b_bdev = inode->i_sb->s_bdev;
|
||||
bh->b_blocknr = blocknr;
|
||||
set_buffer_mapped(bh);
|
||||
set_buffer_uptodate(bh);
|
||||
@@ -133,7 +132,6 @@ int nilfs_btnode_submit_block(struct address_space *btnc, __u64 blocknr,
|
||||
goto found;
|
||||
}
|
||||
set_buffer_mapped(bh);
|
||||
bh->b_bdev = inode->i_sb->s_bdev;
|
||||
bh->b_blocknr = pblocknr; /* set block address for read */
|
||||
bh->b_end_io = end_buffer_read_sync;
|
||||
get_bh(bh);
|
||||
|
||||
@@ -83,10 +83,8 @@ int nilfs_gccache_submit_read_data(struct inode *inode, sector_t blkoff,
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (!buffer_mapped(bh)) {
|
||||
bh->b_bdev = inode->i_sb->s_bdev;
|
||||
if (!buffer_mapped(bh))
|
||||
set_buffer_mapped(bh);
|
||||
}
|
||||
bh->b_blocknr = pbn;
|
||||
bh->b_end_io = end_buffer_read_sync;
|
||||
get_bh(bh);
|
||||
|
||||
@@ -89,7 +89,6 @@ static int nilfs_mdt_create_block(struct inode *inode, unsigned long block,
|
||||
if (buffer_uptodate(bh))
|
||||
goto failed_bh;
|
||||
|
||||
bh->b_bdev = sb->s_bdev;
|
||||
err = nilfs_mdt_insert_new_block(inode, block, bh, init_block);
|
||||
if (likely(!err)) {
|
||||
get_bh(bh);
|
||||
|
||||
@@ -39,7 +39,6 @@ __nilfs_get_page_block(struct page *page, unsigned long block, pgoff_t index,
|
||||
first_block = (unsigned long)index << (PAGE_SHIFT - blkbits);
|
||||
bh = nilfs_page_get_nth_block(page, block - first_block);
|
||||
|
||||
touch_buffer(bh);
|
||||
wait_on_buffer(bh);
|
||||
return bh;
|
||||
}
|
||||
@@ -64,6 +63,7 @@ struct buffer_head *nilfs_grab_buffer(struct inode *inode,
|
||||
put_page(page);
|
||||
return NULL;
|
||||
}
|
||||
bh->b_bdev = inode->i_sb->s_bdev;
|
||||
return bh;
|
||||
}
|
||||
|
||||
|
||||
@@ -86,6 +86,8 @@ enum ocfs2_iocb_lock_bits {
|
||||
OCFS2_IOCB_NUM_LOCKS
|
||||
};
|
||||
|
||||
#define ocfs2_iocb_init_rw_locked(iocb) \
|
||||
(iocb->private = NULL)
|
||||
#define ocfs2_iocb_clear_rw_locked(iocb) \
|
||||
clear_bit(OCFS2_IOCB_RW_LOCK, (unsigned long *)&iocb->private)
|
||||
#define ocfs2_iocb_rw_locked_level(iocb) \
|
||||
|
||||
@@ -2412,6 +2412,8 @@ static ssize_t ocfs2_file_write_iter(struct kiocb *iocb,
|
||||
} else
|
||||
inode_lock(inode);
|
||||
|
||||
ocfs2_iocb_init_rw_locked(iocb);
|
||||
|
||||
/*
|
||||
* Concurrent O_DIRECT writes are allowed with
|
||||
* mount_option "coherency=buffered".
|
||||
@@ -2558,6 +2560,8 @@ static ssize_t ocfs2_file_read_iter(struct kiocb *iocb,
|
||||
if (!direct_io && nowait)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
ocfs2_iocb_init_rw_locked(iocb);
|
||||
|
||||
/*
|
||||
* buffered reads protect themselves in ->readpage(). O_DIRECT reads
|
||||
* need locks to protect pending reads from racing with truncate.
|
||||
|
||||
@@ -582,6 +582,8 @@ int ocfs2_group_add(struct inode *inode, struct ocfs2_new_group_input *input)
|
||||
ocfs2_commit_trans(osb, handle);
|
||||
|
||||
out_free_group_bh:
|
||||
if (ret < 0)
|
||||
ocfs2_remove_from_cache(INODE_CACHE(inode), group_bh);
|
||||
brelse(group_bh);
|
||||
|
||||
out_unlock:
|
||||
|
||||
@@ -2374,6 +2374,7 @@ static int ocfs2_verify_volume(struct ocfs2_dinode *di,
|
||||
struct ocfs2_blockcheck_stats *stats)
|
||||
{
|
||||
int status = -EAGAIN;
|
||||
u32 blksz_bits;
|
||||
|
||||
if (memcmp(di->i_signature, OCFS2_SUPER_BLOCK_SIGNATURE,
|
||||
strlen(OCFS2_SUPER_BLOCK_SIGNATURE)) == 0) {
|
||||
@@ -2388,11 +2389,15 @@ static int ocfs2_verify_volume(struct ocfs2_dinode *di,
|
||||
goto out;
|
||||
}
|
||||
status = -EINVAL;
|
||||
if ((1 << le32_to_cpu(di->id2.i_super.s_blocksize_bits)) != blksz) {
|
||||
/* Acceptable block sizes are 512 bytes, 1K, 2K and 4K. */
|
||||
blksz_bits = le32_to_cpu(di->id2.i_super.s_blocksize_bits);
|
||||
if (blksz_bits < 9 || blksz_bits > 12) {
|
||||
mlog(ML_ERROR, "found superblock with incorrect block "
|
||||
"size: found %u, should be %u\n",
|
||||
1 << le32_to_cpu(di->id2.i_super.s_blocksize_bits),
|
||||
blksz);
|
||||
"size bits: found %u, should be 9, 10, 11, or 12\n",
|
||||
blksz_bits);
|
||||
} else if ((1 << le32_to_cpu(blksz_bits)) != blksz) {
|
||||
mlog(ML_ERROR, "found superblock with incorrect block "
|
||||
"size: found %u, should be %u\n", 1 << blksz_bits, blksz);
|
||||
} else if (le16_to_cpu(di->id2.i_super.s_major_rev_level) !=
|
||||
OCFS2_MAJOR_REV_LEVEL ||
|
||||
le16_to_cpu(di->id2.i_super.s_minor_rev_level) !=
|
||||
|
||||
@@ -19,7 +19,7 @@ static int show_softirqs(struct seq_file *p, void *v)
|
||||
for (i = 0; i < NR_SOFTIRQS; i++) {
|
||||
seq_printf(p, "%12s:", softirq_to_name[i]);
|
||||
for_each_possible_cpu(j)
|
||||
seq_printf(p, " %10u", kstat_softirqs_cpu(i, j));
|
||||
seq_put_decimal_ull_width(p, " ", kstat_softirqs_cpu(i, j), 10);
|
||||
seq_putc(p, '\n');
|
||||
}
|
||||
return 0;
|
||||
|
||||
@@ -767,10 +767,10 @@ static void init_constants_master(struct ubifs_info *c)
|
||||
* necessary to report something for the 'statfs()' call.
|
||||
*
|
||||
* Subtract the LEB reserved for GC, the LEB which is reserved for
|
||||
* deletions, minimum LEBs for the index, and assume only one journal
|
||||
* head is available.
|
||||
* deletions, minimum LEBs for the index, the LEBs which are reserved
|
||||
* for each journal head.
|
||||
*/
|
||||
tmp64 = c->main_lebs - 1 - 1 - MIN_INDEX_LEBS - c->jhead_cnt + 1;
|
||||
tmp64 = c->main_lebs - 1 - 1 - MIN_INDEX_LEBS - c->jhead_cnt;
|
||||
tmp64 *= (long long)c->leb_size - c->leb_overhead;
|
||||
tmp64 = ubifs_reported_space(c, tmp64);
|
||||
c->block_cnt = tmp64 >> UBIFS_BLOCK_SHIFT;
|
||||
|
||||
@@ -2230,6 +2230,75 @@ static void nfdicf_init(void)
|
||||
file_fail(fold_name);
|
||||
}
|
||||
|
||||
static void ignore_init(void)
|
||||
{
|
||||
FILE *file;
|
||||
unsigned int unichar;
|
||||
unsigned int first;
|
||||
unsigned int last;
|
||||
unsigned int *um;
|
||||
int count;
|
||||
int ret;
|
||||
|
||||
if (verbose > 0)
|
||||
printf("Parsing %s\n", prop_name);
|
||||
file = fopen(prop_name, "r");
|
||||
if (!file)
|
||||
open_fail(prop_name, errno);
|
||||
assert(file);
|
||||
count = 0;
|
||||
while (fgets(line, LINESIZE, file)) {
|
||||
ret = sscanf(line, "%X..%X ; %s # ", &first, &last, buf0);
|
||||
if (ret == 3) {
|
||||
if (strcmp(buf0, "Default_Ignorable_Code_Point"))
|
||||
continue;
|
||||
if (!utf32valid(first) || !utf32valid(last))
|
||||
line_fail(prop_name, line);
|
||||
for (unichar = first; unichar <= last; unichar++) {
|
||||
free(unicode_data[unichar].utf32nfdi);
|
||||
um = malloc(sizeof(unsigned int));
|
||||
*um = 0;
|
||||
unicode_data[unichar].utf32nfdi = um;
|
||||
free(unicode_data[unichar].utf32nfdicf);
|
||||
um = malloc(sizeof(unsigned int));
|
||||
*um = 0;
|
||||
unicode_data[unichar].utf32nfdicf = um;
|
||||
count++;
|
||||
}
|
||||
if (verbose > 1)
|
||||
printf(" %X..%X Default_Ignorable_Code_Point\n",
|
||||
first, last);
|
||||
continue;
|
||||
}
|
||||
ret = sscanf(line, "%X ; %s # ", &unichar, buf0);
|
||||
if (ret == 2) {
|
||||
if (strcmp(buf0, "Default_Ignorable_Code_Point"))
|
||||
continue;
|
||||
if (!utf32valid(unichar))
|
||||
line_fail(prop_name, line);
|
||||
free(unicode_data[unichar].utf32nfdi);
|
||||
um = malloc(sizeof(unsigned int));
|
||||
*um = 0;
|
||||
unicode_data[unichar].utf32nfdi = um;
|
||||
free(unicode_data[unichar].utf32nfdicf);
|
||||
um = malloc(sizeof(unsigned int));
|
||||
*um = 0;
|
||||
unicode_data[unichar].utf32nfdicf = um;
|
||||
if (verbose > 1)
|
||||
printf(" %X Default_Ignorable_Code_Point\n",
|
||||
unichar);
|
||||
count++;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
fclose(file);
|
||||
|
||||
if (verbose > 0)
|
||||
printf("Found %d entries\n", count);
|
||||
if (count == 0)
|
||||
file_fail(prop_name);
|
||||
}
|
||||
|
||||
static void corrections_init(void)
|
||||
{
|
||||
FILE *file;
|
||||
@@ -3327,6 +3396,7 @@ int main(int argc, char *argv[])
|
||||
ccc_init();
|
||||
nfdi_init();
|
||||
nfdicf_init();
|
||||
ignore_init();
|
||||
corrections_init();
|
||||
hangul_decompose();
|
||||
nfdi_decompose();
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user