dir.c (47e4937a4a7ca4184fd282791dfee76c6799966a) | dir.c (8d8a09b093d7073465c824f74caf315c073d3875) |
---|---|
1// SPDX-License-Identifier: GPL-2.0-only 2/* 3 * Copyright (C) 2017-2018 HUAWEI, Inc. 4 * http://www.huawei.com/ 5 * Created by Gao Xiang <gaoxiang25@huawei.com> 6 */ 7#include "internal.h" 8 --- 31 unchanged lines hidden (view full) --- 40 41 /* the last dirent in the block? */ 42 if (de + 1 >= end) 43 de_namelen = strnlen(de_name, maxsize - nameoff); 44 else 45 de_namelen = le16_to_cpu(de[1].nameoff) - nameoff; 46 47 /* a corrupted entry is found */ | 1// SPDX-License-Identifier: GPL-2.0-only 2/* 3 * Copyright (C) 2017-2018 HUAWEI, Inc. 4 * http://www.huawei.com/ 5 * Created by Gao Xiang <gaoxiang25@huawei.com> 6 */ 7#include "internal.h" 8 --- 31 unchanged lines hidden (view full) --- 40 41 /* the last dirent in the block? */ 42 if (de + 1 >= end) 43 de_namelen = strnlen(de_name, maxsize - nameoff); 44 else 45 de_namelen = le16_to_cpu(de[1].nameoff) - nameoff; 46 47 /* a corrupted entry is found */ |
48 if (unlikely(nameoff + de_namelen > maxsize || 49 de_namelen > EROFS_NAME_LEN)) { | 48 if (nameoff + de_namelen > maxsize || 49 de_namelen > EROFS_NAME_LEN) { |
50 errln("bogus dirent @ nid %llu", EROFS_V(dir)->nid); 51 DBG_BUGON(1); 52 return -EFSCORRUPTED; 53 } 54 55 debug_one_dentry(d_type, de_name, de_namelen); 56 if (!dir_emit(ctx, de_name, de_namelen, 57 le64_to_cpu(de->nid), d_type)) --- 31 unchanged lines hidden (view full) --- 89 err = -EFSCORRUPTED; 90 break; 91 } 92 93 de = (struct erofs_dirent *)kmap(dentry_page); 94 95 nameoff = le16_to_cpu(de->nameoff); 96 | 50 errln("bogus dirent @ nid %llu", EROFS_V(dir)->nid); 51 DBG_BUGON(1); 52 return -EFSCORRUPTED; 53 } 54 55 debug_one_dentry(d_type, de_name, de_namelen); 56 if (!dir_emit(ctx, de_name, de_namelen, 57 le64_to_cpu(de->nid), d_type)) --- 31 unchanged lines hidden (view full) --- 89 err = -EFSCORRUPTED; 90 break; 91 } 92 93 de = (struct erofs_dirent *)kmap(dentry_page); 94 95 nameoff = le16_to_cpu(de->nameoff); 96 |
97 if (unlikely(nameoff < sizeof(struct erofs_dirent) || 98 nameoff >= PAGE_SIZE)) { | 97 if (nameoff < sizeof(struct erofs_dirent) || 98 nameoff >= PAGE_SIZE) { |
99 errln("%s, invalid de[0].nameoff %u @ nid %llu", 100 __func__, nameoff, EROFS_V(dir)->nid); 101 err = -EFSCORRUPTED; 102 goto skip_this; 103 } 104 105 maxsize = min_t(unsigned int, 106 dirsize - ctx->pos + ofs, PAGE_SIZE); 107 108 /* search dirents at the arbitrary position */ | 99 errln("%s, invalid de[0].nameoff %u @ nid %llu", 100 __func__, nameoff, EROFS_V(dir)->nid); 101 err = -EFSCORRUPTED; 102 goto skip_this; 103 } 104 105 maxsize = min_t(unsigned int, 106 dirsize - ctx->pos + ofs, PAGE_SIZE); 107 108 /* search dirents at the arbitrary position */ |
109 if (unlikely(initial)) { | 109 if (initial) { |
110 initial = false; 111 112 ofs = roundup(ofs, sizeof(struct erofs_dirent)); | 110 initial = false; 111 112 ofs = roundup(ofs, sizeof(struct erofs_dirent)); |
113 if (unlikely(ofs >= nameoff)) | 113 if (ofs >= nameoff) |
114 goto skip_this; 115 } 116 117 err = erofs_fill_dentries(dir, ctx, de, &ofs, 118 nameoff, maxsize); 119skip_this: 120 kunmap(dentry_page); 121 122 put_page(dentry_page); 123 124 ctx->pos = blknr_to_addr(i) + ofs; 125 | 114 goto skip_this; 115 } 116 117 err = erofs_fill_dentries(dir, ctx, de, &ofs, 118 nameoff, maxsize); 119skip_this: 120 kunmap(dentry_page); 121 122 put_page(dentry_page); 123 124 ctx->pos = blknr_to_addr(i) + ofs; 125 |
126 if (unlikely(err)) | 126 if (err) |
127 break; 128 ++i; 129 ofs = 0; 130 } 131 return err < 0 ? err : 0; 132} 133 134const struct file_operations erofs_dir_fops = { 135 .llseek = generic_file_llseek, 136 .read = generic_read_dir, 137 .iterate_shared = erofs_readdir, 138}; 139 | 127 break; 128 ++i; 129 ofs = 0; 130 } 131 return err < 0 ? err : 0; 132} 133 134const struct file_operations erofs_dir_fops = { 135 .llseek = generic_file_llseek, 136 .read = generic_read_dir, 137 .iterate_shared = erofs_readdir, 138}; 139 |