CC: kbuild-all(a)lists.01.org CC: linux-kernel(a)vger.kernel.org TO: Corentin Labbe CC: Herbert Xu tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master head: 407ab579637ced6dc32cfb2295afb7259cca4b22 commit: 56f6d5aee88d129b2424902cd630f10794550763 crypto: sun8i-ce - support hash algorithms date: 7 weeks ago :::::: branch date: 2 hours ago :::::: commit date: 7 weeks ago config: x86_64-randconfig-m001-20201109 (attached as .config) compiler: gcc-9 (Debian 9.3.0-15) 9.3.0 If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot Reported-by: Dan Carpenter smatch warnings: drivers/crypto/allwinner/sun8i-ce/sun8i-ce-hash.c:412 sun8i_ce_hash_run() warn: possible memory leak of 'result' vim +/result +412 drivers/crypto/allwinner/sun8i-ce/sun8i-ce-hash.c 56f6d5aee88d129 Corentin Labbe 2020-09-18 248 56f6d5aee88d129 Corentin Labbe 2020-09-18 249 int sun8i_ce_hash_run(struct crypto_engine *engine, void *breq) 56f6d5aee88d129 Corentin Labbe 2020-09-18 250 { 56f6d5aee88d129 Corentin Labbe 2020-09-18 251 struct ahash_request *areq = container_of(breq, struct ahash_request, base); 56f6d5aee88d129 Corentin Labbe 2020-09-18 252 struct crypto_ahash *tfm = crypto_ahash_reqtfm(areq); 56f6d5aee88d129 Corentin Labbe 2020-09-18 253 struct ahash_alg *alg = __crypto_ahash_alg(tfm->base.__crt_alg); 56f6d5aee88d129 Corentin Labbe 2020-09-18 254 struct sun8i_ce_hash_reqctx *rctx = ahash_request_ctx(areq); 56f6d5aee88d129 Corentin Labbe 2020-09-18 255 struct sun8i_ce_alg_template *algt; 56f6d5aee88d129 Corentin Labbe 2020-09-18 256 struct sun8i_ce_dev *ce; 56f6d5aee88d129 Corentin Labbe 2020-09-18 257 struct sun8i_ce_flow *chan; 56f6d5aee88d129 Corentin Labbe 2020-09-18 258 struct ce_task *cet; 56f6d5aee88d129 Corentin Labbe 2020-09-18 259 struct scatterlist *sg; 56f6d5aee88d129 Corentin Labbe 2020-09-18 260 int nr_sgs, flow, err; 56f6d5aee88d129 Corentin Labbe 2020-09-18 261 unsigned int len; 56f6d5aee88d129 Corentin Labbe 2020-09-18 262 u32 common; 56f6d5aee88d129 Corentin Labbe 2020-09-18 263 u64 byte_count; 56f6d5aee88d129 Corentin Labbe 2020-09-18 264 __le32 *bf; 56f6d5aee88d129 Corentin Labbe 2020-09-18 265 void *buf; 56f6d5aee88d129 Corentin Labbe 2020-09-18 266 int j, i, todo; 56f6d5aee88d129 Corentin Labbe 2020-09-18 267 int nbw = 0; 56f6d5aee88d129 Corentin Labbe 2020-09-18 268 u64 fill, min_fill; 56f6d5aee88d129 Corentin Labbe 2020-09-18 269 __be64 *bebits; 56f6d5aee88d129 Corentin Labbe 2020-09-18 270 __le64 *lebits; 56f6d5aee88d129 Corentin Labbe 2020-09-18 271 void *result; 56f6d5aee88d129 Corentin Labbe 2020-09-18 272 u64 bs; 56f6d5aee88d129 Corentin Labbe 2020-09-18 273 int digestsize; 56f6d5aee88d129 Corentin Labbe 2020-09-18 274 dma_addr_t addr_res, addr_pad; 56f6d5aee88d129 Corentin Labbe 2020-09-18 275 56f6d5aee88d129 Corentin Labbe 2020-09-18 276 algt = container_of(alg, struct sun8i_ce_alg_template, alg.hash); 56f6d5aee88d129 Corentin Labbe 2020-09-18 277 ce = algt->ce; 56f6d5aee88d129 Corentin Labbe 2020-09-18 278 56f6d5aee88d129 Corentin Labbe 2020-09-18 279 bs = algt->alg.hash.halg.base.cra_blocksize; 56f6d5aee88d129 Corentin Labbe 2020-09-18 280 digestsize = algt->alg.hash.halg.digestsize; 56f6d5aee88d129 Corentin Labbe 2020-09-18 281 if (digestsize == SHA224_DIGEST_SIZE) 56f6d5aee88d129 Corentin Labbe 2020-09-18 282 digestsize = SHA256_DIGEST_SIZE; 56f6d5aee88d129 Corentin Labbe 2020-09-18 283 if (digestsize == SHA384_DIGEST_SIZE) 56f6d5aee88d129 Corentin Labbe 2020-09-18 284 digestsize = SHA512_DIGEST_SIZE; 56f6d5aee88d129 Corentin Labbe 2020-09-18 285 56f6d5aee88d129 Corentin Labbe 2020-09-18 286 /* the padding could be up to two block. */ 56f6d5aee88d129 Corentin Labbe 2020-09-18 287 buf = kzalloc(bs * 2, GFP_KERNEL | GFP_DMA); 56f6d5aee88d129 Corentin Labbe 2020-09-18 288 if (!buf) 56f6d5aee88d129 Corentin Labbe 2020-09-18 289 return -ENOMEM; 56f6d5aee88d129 Corentin Labbe 2020-09-18 290 bf = (__le32 *)buf; 56f6d5aee88d129 Corentin Labbe 2020-09-18 291 56f6d5aee88d129 Corentin Labbe 2020-09-18 292 result = kzalloc(digestsize, GFP_KERNEL | GFP_DMA); 56f6d5aee88d129 Corentin Labbe 2020-09-18 293 if (!result) 56f6d5aee88d129 Corentin Labbe 2020-09-18 294 return -ENOMEM; 56f6d5aee88d129 Corentin Labbe 2020-09-18 295 56f6d5aee88d129 Corentin Labbe 2020-09-18 296 flow = rctx->flow; 56f6d5aee88d129 Corentin Labbe 2020-09-18 297 chan = &ce->chanlist[flow]; 56f6d5aee88d129 Corentin Labbe 2020-09-18 298 56f6d5aee88d129 Corentin Labbe 2020-09-18 299 #ifdef CONFIG_CRYPTO_DEV_SUN8I_CE_DEBUG 56f6d5aee88d129 Corentin Labbe 2020-09-18 300 algt->stat_req++; 56f6d5aee88d129 Corentin Labbe 2020-09-18 301 #endif 56f6d5aee88d129 Corentin Labbe 2020-09-18 302 dev_dbg(ce->dev, "%s %s len=%d\n", __func__, crypto_tfm_alg_name(areq->base.tfm), areq->nbytes); 56f6d5aee88d129 Corentin Labbe 2020-09-18 303 56f6d5aee88d129 Corentin Labbe 2020-09-18 304 cet = chan->tl; 56f6d5aee88d129 Corentin Labbe 2020-09-18 305 memset(cet, 0, sizeof(struct ce_task)); 56f6d5aee88d129 Corentin Labbe 2020-09-18 306 56f6d5aee88d129 Corentin Labbe 2020-09-18 307 cet->t_id = cpu_to_le32(flow); 56f6d5aee88d129 Corentin Labbe 2020-09-18 308 common = ce->variant->alg_hash[algt->ce_algo_id]; 56f6d5aee88d129 Corentin Labbe 2020-09-18 309 common |= CE_COMM_INT; 56f6d5aee88d129 Corentin Labbe 2020-09-18 310 cet->t_common_ctl = cpu_to_le32(common); 56f6d5aee88d129 Corentin Labbe 2020-09-18 311 56f6d5aee88d129 Corentin Labbe 2020-09-18 312 cet->t_sym_ctl = 0; 56f6d5aee88d129 Corentin Labbe 2020-09-18 313 cet->t_asym_ctl = 0; 56f6d5aee88d129 Corentin Labbe 2020-09-18 314 56f6d5aee88d129 Corentin Labbe 2020-09-18 315 nr_sgs = dma_map_sg(ce->dev, areq->src, sg_nents(areq->src), DMA_TO_DEVICE); 56f6d5aee88d129 Corentin Labbe 2020-09-18 316 if (nr_sgs <= 0 || nr_sgs > MAX_SG) { 56f6d5aee88d129 Corentin Labbe 2020-09-18 317 dev_err(ce->dev, "Invalid sg number %d\n", nr_sgs); 56f6d5aee88d129 Corentin Labbe 2020-09-18 318 err = -EINVAL; 56f6d5aee88d129 Corentin Labbe 2020-09-18 319 goto theend; 56f6d5aee88d129 Corentin Labbe 2020-09-18 320 } 56f6d5aee88d129 Corentin Labbe 2020-09-18 321 56f6d5aee88d129 Corentin Labbe 2020-09-18 322 len = areq->nbytes; 56f6d5aee88d129 Corentin Labbe 2020-09-18 323 for_each_sg(areq->src, sg, nr_sgs, i) { 56f6d5aee88d129 Corentin Labbe 2020-09-18 324 cet->t_src[i].addr = cpu_to_le32(sg_dma_address(sg)); 56f6d5aee88d129 Corentin Labbe 2020-09-18 325 todo = min(len, sg_dma_len(sg)); 56f6d5aee88d129 Corentin Labbe 2020-09-18 326 cet->t_src[i].len = cpu_to_le32(todo / 4); 56f6d5aee88d129 Corentin Labbe 2020-09-18 327 len -= todo; 56f6d5aee88d129 Corentin Labbe 2020-09-18 328 } 56f6d5aee88d129 Corentin Labbe 2020-09-18 329 if (len > 0) { 56f6d5aee88d129 Corentin Labbe 2020-09-18 330 dev_err(ce->dev, "remaining len %d\n", len); 56f6d5aee88d129 Corentin Labbe 2020-09-18 331 err = -EINVAL; 56f6d5aee88d129 Corentin Labbe 2020-09-18 332 goto theend; 56f6d5aee88d129 Corentin Labbe 2020-09-18 333 } 56f6d5aee88d129 Corentin Labbe 2020-09-18 334 addr_res = dma_map_single(ce->dev, result, digestsize, DMA_FROM_DEVICE); 56f6d5aee88d129 Corentin Labbe 2020-09-18 335 cet->t_dst[0].addr = cpu_to_le32(addr_res); 56f6d5aee88d129 Corentin Labbe 2020-09-18 336 cet->t_dst[0].len = cpu_to_le32(digestsize / 4); 56f6d5aee88d129 Corentin Labbe 2020-09-18 337 if (dma_mapping_error(ce->dev, addr_res)) { 56f6d5aee88d129 Corentin Labbe 2020-09-18 338 dev_err(ce->dev, "DMA map dest\n"); 56f6d5aee88d129 Corentin Labbe 2020-09-18 339 err = -EINVAL; 56f6d5aee88d129 Corentin Labbe 2020-09-18 340 goto theend; 56f6d5aee88d129 Corentin Labbe 2020-09-18 341 } 56f6d5aee88d129 Corentin Labbe 2020-09-18 342 56f6d5aee88d129 Corentin Labbe 2020-09-18 343 byte_count = areq->nbytes; 56f6d5aee88d129 Corentin Labbe 2020-09-18 344 j = 0; 56f6d5aee88d129 Corentin Labbe 2020-09-18 345 bf[j++] = cpu_to_le32(0x80); 56f6d5aee88d129 Corentin Labbe 2020-09-18 346 56f6d5aee88d129 Corentin Labbe 2020-09-18 347 if (bs == 64) { 56f6d5aee88d129 Corentin Labbe 2020-09-18 348 fill = 64 - (byte_count % 64); 56f6d5aee88d129 Corentin Labbe 2020-09-18 349 min_fill = 2 * sizeof(u32) + (nbw ? 0 : sizeof(u32)); 56f6d5aee88d129 Corentin Labbe 2020-09-18 350 } else { 56f6d5aee88d129 Corentin Labbe 2020-09-18 351 fill = 128 - (byte_count % 128); 56f6d5aee88d129 Corentin Labbe 2020-09-18 352 min_fill = 4 * sizeof(u32) + (nbw ? 0 : sizeof(u32)); 56f6d5aee88d129 Corentin Labbe 2020-09-18 353 } 56f6d5aee88d129 Corentin Labbe 2020-09-18 354 56f6d5aee88d129 Corentin Labbe 2020-09-18 355 if (fill < min_fill) 56f6d5aee88d129 Corentin Labbe 2020-09-18 356 fill += bs; 56f6d5aee88d129 Corentin Labbe 2020-09-18 357 56f6d5aee88d129 Corentin Labbe 2020-09-18 358 j += (fill - min_fill) / sizeof(u32); 56f6d5aee88d129 Corentin Labbe 2020-09-18 359 56f6d5aee88d129 Corentin Labbe 2020-09-18 360 switch (algt->ce_algo_id) { 56f6d5aee88d129 Corentin Labbe 2020-09-18 361 case CE_ID_HASH_MD5: 56f6d5aee88d129 Corentin Labbe 2020-09-18 362 lebits = (__le64 *)&bf[j]; 56f6d5aee88d129 Corentin Labbe 2020-09-18 363 *lebits = cpu_to_le64(byte_count << 3); 56f6d5aee88d129 Corentin Labbe 2020-09-18 364 j += 2; 56f6d5aee88d129 Corentin Labbe 2020-09-18 365 break; 56f6d5aee88d129 Corentin Labbe 2020-09-18 366 case CE_ID_HASH_SHA1: 56f6d5aee88d129 Corentin Labbe 2020-09-18 367 case CE_ID_HASH_SHA224: 56f6d5aee88d129 Corentin Labbe 2020-09-18 368 case CE_ID_HASH_SHA256: 56f6d5aee88d129 Corentin Labbe 2020-09-18 369 bebits = (__be64 *)&bf[j]; 56f6d5aee88d129 Corentin Labbe 2020-09-18 370 *bebits = cpu_to_be64(byte_count << 3); 56f6d5aee88d129 Corentin Labbe 2020-09-18 371 j += 2; 56f6d5aee88d129 Corentin Labbe 2020-09-18 372 break; 56f6d5aee88d129 Corentin Labbe 2020-09-18 373 case CE_ID_HASH_SHA384: 56f6d5aee88d129 Corentin Labbe 2020-09-18 374 case CE_ID_HASH_SHA512: 56f6d5aee88d129 Corentin Labbe 2020-09-18 375 bebits = (__be64 *)&bf[j]; 56f6d5aee88d129 Corentin Labbe 2020-09-18 376 *bebits = cpu_to_be64(byte_count >> 61); 56f6d5aee88d129 Corentin Labbe 2020-09-18 377 j += 2; 56f6d5aee88d129 Corentin Labbe 2020-09-18 378 bebits = (__be64 *)&bf[j]; 56f6d5aee88d129 Corentin Labbe 2020-09-18 379 *bebits = cpu_to_be64(byte_count << 3); 56f6d5aee88d129 Corentin Labbe 2020-09-18 380 j += 2; 56f6d5aee88d129 Corentin Labbe 2020-09-18 381 break; 56f6d5aee88d129 Corentin Labbe 2020-09-18 382 } 56f6d5aee88d129 Corentin Labbe 2020-09-18 383 56f6d5aee88d129 Corentin Labbe 2020-09-18 384 addr_pad = dma_map_single(ce->dev, buf, j * 4, DMA_TO_DEVICE); 56f6d5aee88d129 Corentin Labbe 2020-09-18 385 cet->t_src[i].addr = cpu_to_le32(addr_pad); 56f6d5aee88d129 Corentin Labbe 2020-09-18 386 cet->t_src[i].len = cpu_to_le32(j); 56f6d5aee88d129 Corentin Labbe 2020-09-18 387 if (dma_mapping_error(ce->dev, addr_pad)) { 56f6d5aee88d129 Corentin Labbe 2020-09-18 388 dev_err(ce->dev, "DMA error on padding SG\n"); 56f6d5aee88d129 Corentin Labbe 2020-09-18 389 err = -EINVAL; 56f6d5aee88d129 Corentin Labbe 2020-09-18 390 goto theend; 56f6d5aee88d129 Corentin Labbe 2020-09-18 391 } 56f6d5aee88d129 Corentin Labbe 2020-09-18 392 56f6d5aee88d129 Corentin Labbe 2020-09-18 393 if (ce->variant->hash_t_dlen_in_bits) 56f6d5aee88d129 Corentin Labbe 2020-09-18 394 cet->t_dlen = cpu_to_le32((areq->nbytes + j * 4) * 8); 56f6d5aee88d129 Corentin Labbe 2020-09-18 395 else 56f6d5aee88d129 Corentin Labbe 2020-09-18 396 cet->t_dlen = cpu_to_le32(areq->nbytes / 4 + j); 56f6d5aee88d129 Corentin Labbe 2020-09-18 397 56f6d5aee88d129 Corentin Labbe 2020-09-18 398 chan->timeout = areq->nbytes; 56f6d5aee88d129 Corentin Labbe 2020-09-18 399 56f6d5aee88d129 Corentin Labbe 2020-09-18 400 err = sun8i_ce_run_task(ce, flow, crypto_tfm_alg_name(areq->base.tfm)); 56f6d5aee88d129 Corentin Labbe 2020-09-18 401 56f6d5aee88d129 Corentin Labbe 2020-09-18 402 dma_unmap_single(ce->dev, addr_pad, j * 4, DMA_TO_DEVICE); 56f6d5aee88d129 Corentin Labbe 2020-09-18 403 dma_unmap_sg(ce->dev, areq->src, nr_sgs, DMA_TO_DEVICE); 56f6d5aee88d129 Corentin Labbe 2020-09-18 404 dma_unmap_single(ce->dev, addr_res, digestsize, DMA_FROM_DEVICE); 56f6d5aee88d129 Corentin Labbe 2020-09-18 405 56f6d5aee88d129 Corentin Labbe 2020-09-18 406 kfree(buf); 56f6d5aee88d129 Corentin Labbe 2020-09-18 407 56f6d5aee88d129 Corentin Labbe 2020-09-18 408 memcpy(areq->result, result, algt->alg.hash.halg.digestsize); 56f6d5aee88d129 Corentin Labbe 2020-09-18 409 kfree(result); 56f6d5aee88d129 Corentin Labbe 2020-09-18 410 theend: 56f6d5aee88d129 Corentin Labbe 2020-09-18 411 crypto_finalize_hash_request(engine, breq, err); 56f6d5aee88d129 Corentin Labbe 2020-09-18 @412 return 0; --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org