From: kernel test robot <lkp@intel.com> To: Jan Kara <jack@suse.cz> Cc: kbuild-all@lists.01.org, Linux Memory Management List <linux-mm@kvack.org> Subject: [linux-next:master 13255/13500] fs/udf/dir.c:78:25: error: cast from pointer to integer of different size Date: Tue, 9 Nov 2021 17:30:48 +0800 [thread overview] Message-ID: <202111091741.uS8Q9UEJ-lkp@intel.com> (raw) [-- Attachment #1: Type: text/plain, Size: 7827 bytes --] tree: https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git master head: c8109c2ba35e9bfd8a55087ffb1f42cc0dcf71e6 commit: 39a464de961f256197934d36aa5dda546cba8ed0 [13255/13500] udf: Fix crash after seekdir config: arc-allyesconfig (attached as .config) compiler: arceb-elf-gcc (GCC) 11.2.0 reproduce (this is a W=1 build): wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git/commit/?id=39a464de961f256197934d36aa5dda546cba8ed0 git remote add linux-next https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git git fetch --no-tags linux-next master git checkout 39a464de961f256197934d36aa5dda546cba8ed0 # save the attached .config to linux build tree COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-11.2.0 make.cross ARCH=arc If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <lkp@intel.com> All errors (new ones prefixed by >>): fs/udf/dir.c: In function 'udf_readdir': >> fs/udf/dir.c:78:25: error: cast from pointer to integer of different size [-Werror=pointer-to-int-cast] 78 | if (ctx->pos != (loff_t)file->private_data) { | ^ >> fs/udf/dir.c:211:30: error: cast to pointer from integer of different size [-Werror=int-to-pointer-cast] 211 | file->private_data = (void *)ctx->pos; | ^ cc1: all warnings being treated as errors vim +78 fs/udf/dir.c 37 38 static int udf_readdir(struct file *file, struct dir_context *ctx) 39 { 40 struct inode *dir = file_inode(file); 41 struct udf_inode_info *iinfo = UDF_I(dir); 42 struct udf_fileident_bh fibh = { .sbh = NULL, .ebh = NULL}; 43 struct fileIdentDesc *fi = NULL; 44 struct fileIdentDesc cfi; 45 udf_pblk_t block, iblock; 46 loff_t nf_pos, emit_pos; 47 int flen; 48 unsigned char *fname = NULL, *copy_name = NULL; 49 unsigned char *nameptr; 50 uint16_t liu; 51 uint8_t lfi; 52 loff_t size = udf_ext0_offset(dir) + dir->i_size; 53 struct buffer_head *tmp, *bha[16]; 54 struct kernel_lb_addr eloc; 55 uint32_t elen; 56 sector_t offset; 57 int i, num, ret = 0; 58 struct extent_position epos = { NULL, 0, {0, 0} }; 59 struct super_block *sb = dir->i_sb; 60 61 if (ctx->pos == 0) { 62 if (!dir_emit_dot(file, ctx)) 63 return 0; 64 ctx->pos = 1; 65 } 66 nf_pos = (ctx->pos - 1) << 2; 67 if (nf_pos >= size) 68 goto out; 69 70 /* 71 * Did our position change since last readdir (likely lseek was 72 * called)? We need to verify the position correctly points at the 73 * beginning of some dir entry so that the directory parsing code does 74 * not get confused. Since UDF does not have any reliable way of 75 * identifying beginning of dir entry (names are under user control), 76 * we need to scan the directory from the beginning. 77 */ > 78 if (ctx->pos != (loff_t)file->private_data) { 79 emit_pos = nf_pos; 80 nf_pos = 0; 81 } 82 83 fname = kmalloc(UDF_NAME_LEN, GFP_NOFS); 84 if (!fname) { 85 ret = -ENOMEM; 86 goto out; 87 } 88 89 if (nf_pos == 0) 90 nf_pos = udf_ext0_offset(dir); 91 92 fibh.soffset = fibh.eoffset = nf_pos & (sb->s_blocksize - 1); 93 if (iinfo->i_alloc_type != ICBTAG_FLAG_AD_IN_ICB) { 94 if (inode_bmap(dir, nf_pos >> sb->s_blocksize_bits, 95 &epos, &eloc, &elen, &offset) 96 != (EXT_RECORDED_ALLOCATED >> 30)) { 97 ret = -ENOENT; 98 goto out; 99 } 100 block = udf_get_lb_pblock(sb, &eloc, offset); 101 if ((++offset << sb->s_blocksize_bits) < elen) { 102 if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT) 103 epos.offset -= sizeof(struct short_ad); 104 else if (iinfo->i_alloc_type == 105 ICBTAG_FLAG_AD_LONG) 106 epos.offset -= sizeof(struct long_ad); 107 } else { 108 offset = 0; 109 } 110 111 if (!(fibh.sbh = fibh.ebh = udf_tread(sb, block))) { 112 ret = -EIO; 113 goto out; 114 } 115 116 if (!(offset & ((16 >> (sb->s_blocksize_bits - 9)) - 1))) { 117 i = 16 >> (sb->s_blocksize_bits - 9); 118 if (i + offset > (elen >> sb->s_blocksize_bits)) 119 i = (elen >> sb->s_blocksize_bits) - offset; 120 for (num = 0; i > 0; i--) { 121 block = udf_get_lb_pblock(sb, &eloc, offset + i); 122 tmp = udf_tgetblk(sb, block); 123 if (tmp && !buffer_uptodate(tmp) && !buffer_locked(tmp)) 124 bha[num++] = tmp; 125 else 126 brelse(tmp); 127 } 128 if (num) { 129 ll_rw_block(REQ_OP_READ, REQ_RAHEAD, num, bha); 130 for (i = 0; i < num; i++) 131 brelse(bha[i]); 132 } 133 } 134 } 135 136 while (nf_pos < size) { 137 struct kernel_lb_addr tloc; 138 loff_t cur_pos = nf_pos; 139 140 /* Update file position only if we got past the current one */ 141 if (nf_pos >= emit_pos) 142 ctx->pos = (nf_pos >> 2) + 1; 143 144 fi = udf_fileident_read(dir, &nf_pos, &fibh, &cfi, &epos, &eloc, 145 &elen, &offset); 146 if (!fi) 147 goto out; 148 /* Still not at offset where user asked us to read from? */ 149 if (cur_pos < emit_pos) 150 continue; 151 152 liu = le16_to_cpu(cfi.lengthOfImpUse); 153 lfi = cfi.lengthFileIdent; 154 155 if (fibh.sbh == fibh.ebh) { 156 nameptr = udf_get_fi_ident(fi); 157 } else { 158 int poffset; /* Unpaded ending offset */ 159 160 poffset = fibh.soffset + sizeof(struct fileIdentDesc) + liu + lfi; 161 162 if (poffset >= lfi) { 163 nameptr = (char *)(fibh.ebh->b_data + poffset - lfi); 164 } else { 165 if (!copy_name) { 166 copy_name = kmalloc(UDF_NAME_LEN, 167 GFP_NOFS); 168 if (!copy_name) { 169 ret = -ENOMEM; 170 goto out; 171 } 172 } 173 nameptr = copy_name; 174 memcpy(nameptr, udf_get_fi_ident(fi), 175 lfi - poffset); 176 memcpy(nameptr + lfi - poffset, 177 fibh.ebh->b_data, poffset); 178 } 179 } 180 181 if ((cfi.fileCharacteristics & FID_FILE_CHAR_DELETED) != 0) { 182 if (!UDF_QUERY_FLAG(sb, UDF_FLAG_UNDELETE)) 183 continue; 184 } 185 186 if ((cfi.fileCharacteristics & FID_FILE_CHAR_HIDDEN) != 0) { 187 if (!UDF_QUERY_FLAG(sb, UDF_FLAG_UNHIDE)) 188 continue; 189 } 190 191 if (cfi.fileCharacteristics & FID_FILE_CHAR_PARENT) { 192 if (!dir_emit_dotdot(file, ctx)) 193 goto out; 194 continue; 195 } 196 197 flen = udf_get_filename(sb, nameptr, lfi, fname, UDF_NAME_LEN); 198 if (flen < 0) 199 continue; 200 201 tloc = lelb_to_cpu(cfi.icb.extLocation); 202 iblock = udf_get_lb_pblock(sb, &tloc, 0); 203 if (!dir_emit(ctx, fname, flen, iblock, DT_UNKNOWN)) 204 goto out; 205 } /* end while */ 206 207 ctx->pos = (nf_pos >> 2) + 1; 208 209 out: 210 /* Store position where we've ended */ > 211 file->private_data = (void *)ctx->pos; 212 if (fibh.sbh != fibh.ebh) 213 brelse(fibh.ebh); 214 brelse(fibh.sbh); 215 brelse(epos.bh); 216 kfree(fname); 217 kfree(copy_name); 218 219 return ret; 220 } 221 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org [-- Attachment #2: .config.gz --] [-- Type: application/gzip, Size: 70028 bytes --]
WARNING: multiple messages have this Message-ID (diff)
From: kernel test robot <lkp@intel.com> To: kbuild-all@lists.01.org Subject: [linux-next:master 13255/13500] fs/udf/dir.c:78:25: error: cast from pointer to integer of different size Date: Tue, 09 Nov 2021 17:30:48 +0800 [thread overview] Message-ID: <202111091741.uS8Q9UEJ-lkp@intel.com> (raw) [-- Attachment #1: Type: text/plain, Size: 8050 bytes --] tree: https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git master head: c8109c2ba35e9bfd8a55087ffb1f42cc0dcf71e6 commit: 39a464de961f256197934d36aa5dda546cba8ed0 [13255/13500] udf: Fix crash after seekdir config: arc-allyesconfig (attached as .config) compiler: arceb-elf-gcc (GCC) 11.2.0 reproduce (this is a W=1 build): wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git/commit/?id=39a464de961f256197934d36aa5dda546cba8ed0 git remote add linux-next https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git git fetch --no-tags linux-next master git checkout 39a464de961f256197934d36aa5dda546cba8ed0 # save the attached .config to linux build tree COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-11.2.0 make.cross ARCH=arc If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <lkp@intel.com> All errors (new ones prefixed by >>): fs/udf/dir.c: In function 'udf_readdir': >> fs/udf/dir.c:78:25: error: cast from pointer to integer of different size [-Werror=pointer-to-int-cast] 78 | if (ctx->pos != (loff_t)file->private_data) { | ^ >> fs/udf/dir.c:211:30: error: cast to pointer from integer of different size [-Werror=int-to-pointer-cast] 211 | file->private_data = (void *)ctx->pos; | ^ cc1: all warnings being treated as errors vim +78 fs/udf/dir.c 37 38 static int udf_readdir(struct file *file, struct dir_context *ctx) 39 { 40 struct inode *dir = file_inode(file); 41 struct udf_inode_info *iinfo = UDF_I(dir); 42 struct udf_fileident_bh fibh = { .sbh = NULL, .ebh = NULL}; 43 struct fileIdentDesc *fi = NULL; 44 struct fileIdentDesc cfi; 45 udf_pblk_t block, iblock; 46 loff_t nf_pos, emit_pos; 47 int flen; 48 unsigned char *fname = NULL, *copy_name = NULL; 49 unsigned char *nameptr; 50 uint16_t liu; 51 uint8_t lfi; 52 loff_t size = udf_ext0_offset(dir) + dir->i_size; 53 struct buffer_head *tmp, *bha[16]; 54 struct kernel_lb_addr eloc; 55 uint32_t elen; 56 sector_t offset; 57 int i, num, ret = 0; 58 struct extent_position epos = { NULL, 0, {0, 0} }; 59 struct super_block *sb = dir->i_sb; 60 61 if (ctx->pos == 0) { 62 if (!dir_emit_dot(file, ctx)) 63 return 0; 64 ctx->pos = 1; 65 } 66 nf_pos = (ctx->pos - 1) << 2; 67 if (nf_pos >= size) 68 goto out; 69 70 /* 71 * Did our position change since last readdir (likely lseek was 72 * called)? We need to verify the position correctly points at the 73 * beginning of some dir entry so that the directory parsing code does 74 * not get confused. Since UDF does not have any reliable way of 75 * identifying beginning of dir entry (names are under user control), 76 * we need to scan the directory from the beginning. 77 */ > 78 if (ctx->pos != (loff_t)file->private_data) { 79 emit_pos = nf_pos; 80 nf_pos = 0; 81 } 82 83 fname = kmalloc(UDF_NAME_LEN, GFP_NOFS); 84 if (!fname) { 85 ret = -ENOMEM; 86 goto out; 87 } 88 89 if (nf_pos == 0) 90 nf_pos = udf_ext0_offset(dir); 91 92 fibh.soffset = fibh.eoffset = nf_pos & (sb->s_blocksize - 1); 93 if (iinfo->i_alloc_type != ICBTAG_FLAG_AD_IN_ICB) { 94 if (inode_bmap(dir, nf_pos >> sb->s_blocksize_bits, 95 &epos, &eloc, &elen, &offset) 96 != (EXT_RECORDED_ALLOCATED >> 30)) { 97 ret = -ENOENT; 98 goto out; 99 } 100 block = udf_get_lb_pblock(sb, &eloc, offset); 101 if ((++offset << sb->s_blocksize_bits) < elen) { 102 if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT) 103 epos.offset -= sizeof(struct short_ad); 104 else if (iinfo->i_alloc_type == 105 ICBTAG_FLAG_AD_LONG) 106 epos.offset -= sizeof(struct long_ad); 107 } else { 108 offset = 0; 109 } 110 111 if (!(fibh.sbh = fibh.ebh = udf_tread(sb, block))) { 112 ret = -EIO; 113 goto out; 114 } 115 116 if (!(offset & ((16 >> (sb->s_blocksize_bits - 9)) - 1))) { 117 i = 16 >> (sb->s_blocksize_bits - 9); 118 if (i + offset > (elen >> sb->s_blocksize_bits)) 119 i = (elen >> sb->s_blocksize_bits) - offset; 120 for (num = 0; i > 0; i--) { 121 block = udf_get_lb_pblock(sb, &eloc, offset + i); 122 tmp = udf_tgetblk(sb, block); 123 if (tmp && !buffer_uptodate(tmp) && !buffer_locked(tmp)) 124 bha[num++] = tmp; 125 else 126 brelse(tmp); 127 } 128 if (num) { 129 ll_rw_block(REQ_OP_READ, REQ_RAHEAD, num, bha); 130 for (i = 0; i < num; i++) 131 brelse(bha[i]); 132 } 133 } 134 } 135 136 while (nf_pos < size) { 137 struct kernel_lb_addr tloc; 138 loff_t cur_pos = nf_pos; 139 140 /* Update file position only if we got past the current one */ 141 if (nf_pos >= emit_pos) 142 ctx->pos = (nf_pos >> 2) + 1; 143 144 fi = udf_fileident_read(dir, &nf_pos, &fibh, &cfi, &epos, &eloc, 145 &elen, &offset); 146 if (!fi) 147 goto out; 148 /* Still not at offset where user asked us to read from? */ 149 if (cur_pos < emit_pos) 150 continue; 151 152 liu = le16_to_cpu(cfi.lengthOfImpUse); 153 lfi = cfi.lengthFileIdent; 154 155 if (fibh.sbh == fibh.ebh) { 156 nameptr = udf_get_fi_ident(fi); 157 } else { 158 int poffset; /* Unpaded ending offset */ 159 160 poffset = fibh.soffset + sizeof(struct fileIdentDesc) + liu + lfi; 161 162 if (poffset >= lfi) { 163 nameptr = (char *)(fibh.ebh->b_data + poffset - lfi); 164 } else { 165 if (!copy_name) { 166 copy_name = kmalloc(UDF_NAME_LEN, 167 GFP_NOFS); 168 if (!copy_name) { 169 ret = -ENOMEM; 170 goto out; 171 } 172 } 173 nameptr = copy_name; 174 memcpy(nameptr, udf_get_fi_ident(fi), 175 lfi - poffset); 176 memcpy(nameptr + lfi - poffset, 177 fibh.ebh->b_data, poffset); 178 } 179 } 180 181 if ((cfi.fileCharacteristics & FID_FILE_CHAR_DELETED) != 0) { 182 if (!UDF_QUERY_FLAG(sb, UDF_FLAG_UNDELETE)) 183 continue; 184 } 185 186 if ((cfi.fileCharacteristics & FID_FILE_CHAR_HIDDEN) != 0) { 187 if (!UDF_QUERY_FLAG(sb, UDF_FLAG_UNHIDE)) 188 continue; 189 } 190 191 if (cfi.fileCharacteristics & FID_FILE_CHAR_PARENT) { 192 if (!dir_emit_dotdot(file, ctx)) 193 goto out; 194 continue; 195 } 196 197 flen = udf_get_filename(sb, nameptr, lfi, fname, UDF_NAME_LEN); 198 if (flen < 0) 199 continue; 200 201 tloc = lelb_to_cpu(cfi.icb.extLocation); 202 iblock = udf_get_lb_pblock(sb, &tloc, 0); 203 if (!dir_emit(ctx, fname, flen, iblock, DT_UNKNOWN)) 204 goto out; 205 } /* end while */ 206 207 ctx->pos = (nf_pos >> 2) + 1; 208 209 out: 210 /* Store position where we've ended */ > 211 file->private_data = (void *)ctx->pos; 212 if (fibh.sbh != fibh.ebh) 213 brelse(fibh.ebh); 214 brelse(fibh.sbh); 215 brelse(epos.bh); 216 kfree(fname); 217 kfree(copy_name); 218 219 return ret; 220 } 221 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org [-- Attachment #2: config.gz --] [-- Type: application/gzip, Size: 70028 bytes --]
next reply other threads:[~2021-11-09 9:31 UTC|newest] Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top 2021-11-09 9:30 kernel test robot [this message] 2021-11-09 9:30 ` [linux-next:master 13255/13500] fs/udf/dir.c:78:25: error: cast from pointer to integer of different size kernel test robot
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=202111091741.uS8Q9UEJ-lkp@intel.com \ --to=lkp@intel.com \ --cc=jack@suse.cz \ --cc=kbuild-all@lists.01.org \ --cc=linux-mm@kvack.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.