All of lore.kernel.org
 help / color / mirror / Atom feed
* [linux-next:master 1083/1266] drivers/dma/sun6i-dma.c:777 sun6i_dma_prep_slave_sg() error: dereferencing freed memory 'v_lli'
@ 2024-03-26 10:19 kernel test robot
  0 siblings, 0 replies; 3+ messages in thread
From: kernel test robot @ 2024-03-26 10:19 UTC (permalink / raw)
  To: oe-kbuild; +Cc: lkp, Dan Carpenter

BCC: lkp@intel.com
CC: oe-kbuild-all@lists.linux.dev
CC: Linux Memory Management List <linux-mm@kvack.org>
TO: Suren Baghdasaryan <surenb@google.com>
CC: Andrew Morton <akpm@linux-foundation.org>
CC: Linux Memory Management List <linux-mm@kvack.org>
CC: Kent Overstreet <kent.overstreet@linux.dev>
CC: Kees Cook <keescook@chromium.org>

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git master
head:   084c8e315db34b59d38d06e684b1a0dd07d30287
commit: c64e38ed88d13557ebeb4cb8def02390a8f3dfc4 [1083/1266] mm/slab: enable slab allocation tagging for kmalloc and friends
:::::: branch date: 5 hours ago
:::::: commit date: 3 days ago
config: m68k-randconfig-r071-20240326 (https://download.01.org/0day-ci/archive/20240326/202403261808.c8ovEmC1-lkp@intel.com/config)
compiler: m68k-linux-gcc (GCC) 13.2.0

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Reported-by: Dan Carpenter <error27@gmail.com>
| Closes: https://lore.kernel.org/r/202403261808.c8ovEmC1-lkp@intel.com/

smatch warnings:
drivers/dma/sun6i-dma.c:777 sun6i_dma_prep_slave_sg() error: dereferencing freed memory 'v_lli'
drivers/dma/sun6i-dma.c:848 sun6i_dma_prep_dma_cyclic() error: dereferencing freed memory 'v_lli'

vim +/v_lli +777 drivers/dma/sun6i-dma.c

555859308723d8 Maxime Ripard       2014-07-17  699  
555859308723d8 Maxime Ripard       2014-07-17  700  static struct dma_async_tx_descriptor *sun6i_dma_prep_slave_sg(
555859308723d8 Maxime Ripard       2014-07-17  701  		struct dma_chan *chan, struct scatterlist *sgl,
555859308723d8 Maxime Ripard       2014-07-17  702  		unsigned int sg_len, enum dma_transfer_direction dir,
555859308723d8 Maxime Ripard       2014-07-17  703  		unsigned long flags, void *context)
555859308723d8 Maxime Ripard       2014-07-17  704  {
555859308723d8 Maxime Ripard       2014-07-17  705  	struct sun6i_dma_dev *sdev = to_sun6i_dma_dev(chan->device);
555859308723d8 Maxime Ripard       2014-07-17  706  	struct sun6i_vchan *vchan = to_sun6i_vchan(chan);
555859308723d8 Maxime Ripard       2014-07-17  707  	struct dma_slave_config *sconfig = &vchan->cfg;
555859308723d8 Maxime Ripard       2014-07-17  708  	struct sun6i_dma_lli *v_lli, *prev = NULL;
555859308723d8 Maxime Ripard       2014-07-17  709  	struct sun6i_desc *txd;
555859308723d8 Maxime Ripard       2014-07-17  710  	struct scatterlist *sg;
555859308723d8 Maxime Ripard       2014-07-17  711  	dma_addr_t p_lli;
52c871798ff84b Jean-Francois Moine 2016-04-22  712  	u32 lli_cfg;
555859308723d8 Maxime Ripard       2014-07-17  713  	int i, ret;
555859308723d8 Maxime Ripard       2014-07-17  714  
555859308723d8 Maxime Ripard       2014-07-17  715  	if (!sgl)
555859308723d8 Maxime Ripard       2014-07-17  716  		return NULL;
555859308723d8 Maxime Ripard       2014-07-17  717  
52c871798ff84b Jean-Francois Moine 2016-04-22  718  	ret = set_config(sdev, sconfig, dir, &lli_cfg);
52c871798ff84b Jean-Francois Moine 2016-04-22  719  	if (ret) {
52c871798ff84b Jean-Francois Moine 2016-04-22  720  		dev_err(chan2dev(chan), "Invalid DMA configuration\n");
52c871798ff84b Jean-Francois Moine 2016-04-22  721  		return NULL;
52c871798ff84b Jean-Francois Moine 2016-04-22  722  	}
52c871798ff84b Jean-Francois Moine 2016-04-22  723  
555859308723d8 Maxime Ripard       2014-07-17  724  	txd = kzalloc(sizeof(*txd), GFP_NOWAIT);
555859308723d8 Maxime Ripard       2014-07-17  725  	if (!txd)
555859308723d8 Maxime Ripard       2014-07-17  726  		return NULL;
555859308723d8 Maxime Ripard       2014-07-17  727  
555859308723d8 Maxime Ripard       2014-07-17  728  	for_each_sg(sgl, sg, sg_len, i) {
ec31c5c5949275 Samuel Holland      2022-04-24  729  		v_lli = dma_pool_alloc(sdev->pool, GFP_DMA32 | GFP_NOWAIT, &p_lli);
4fbd804e009ae9 Maxime Ripard       2014-07-30  730  		if (!v_lli)
4fbd804e009ae9 Maxime Ripard       2014-07-30  731  			goto err_lli_free;
555859308723d8 Maxime Ripard       2014-07-17  732  
52c871798ff84b Jean-Francois Moine 2016-04-22  733  		v_lli->len = sg_dma_len(sg);
52c871798ff84b Jean-Francois Moine 2016-04-22  734  		v_lli->para = NORMAL_WAIT;
555859308723d8 Maxime Ripard       2014-07-17  735  
52c871798ff84b Jean-Francois Moine 2016-04-22  736  		if (dir == DMA_MEM_TO_DEV) {
ec31c5c5949275 Samuel Holland      2022-04-24  737  			sun6i_dma_set_addr(sdev, v_lli,
ec31c5c5949275 Samuel Holland      2022-04-24  738  					   sg_dma_address(sg),
ec31c5c5949275 Samuel Holland      2022-04-24  739  					   sconfig->dst_addr);
802440bdf3b787 Jernej Skrabec      2019-05-27  740  			v_lli->cfg = lli_cfg;
67f34055118cb6 Jernej Skrabec      2019-05-27  741  			sdev->cfg->set_drq(&v_lli->cfg, DRQ_SDRAM, vchan->port);
802440bdf3b787 Jernej Skrabec      2019-05-27  742  			sdev->cfg->set_mode(&v_lli->cfg, LINEAR_MODE, IO_MODE);
555859308723d8 Maxime Ripard       2014-07-17  743  
555859308723d8 Maxime Ripard       2014-07-17  744  			dev_dbg(chan2dev(chan),
7f5e03e7367293 Vinod Koul          2014-07-28  745  				"%s; chan: %d, dest: %pad, src: %pad, len: %u. flags: 0x%08lx\n",
555859308723d8 Maxime Ripard       2014-07-17  746  				__func__, vchan->vc.chan.chan_id,
555859308723d8 Maxime Ripard       2014-07-17  747  				&sconfig->dst_addr, &sg_dma_address(sg),
555859308723d8 Maxime Ripard       2014-07-17  748  				sg_dma_len(sg), flags);
555859308723d8 Maxime Ripard       2014-07-17  749  
555859308723d8 Maxime Ripard       2014-07-17  750  		} else {
ec31c5c5949275 Samuel Holland      2022-04-24  751  			sun6i_dma_set_addr(sdev, v_lli,
ec31c5c5949275 Samuel Holland      2022-04-24  752  					   sconfig->src_addr,
ec31c5c5949275 Samuel Holland      2022-04-24  753  					   sg_dma_address(sg));
802440bdf3b787 Jernej Skrabec      2019-05-27  754  			v_lli->cfg = lli_cfg;
67f34055118cb6 Jernej Skrabec      2019-05-27  755  			sdev->cfg->set_drq(&v_lli->cfg, vchan->port, DRQ_SDRAM);
802440bdf3b787 Jernej Skrabec      2019-05-27  756  			sdev->cfg->set_mode(&v_lli->cfg, IO_MODE, LINEAR_MODE);
555859308723d8 Maxime Ripard       2014-07-17  757  
555859308723d8 Maxime Ripard       2014-07-17  758  			dev_dbg(chan2dev(chan),
7f5e03e7367293 Vinod Koul          2014-07-28  759  				"%s; chan: %d, dest: %pad, src: %pad, len: %u. flags: 0x%08lx\n",
555859308723d8 Maxime Ripard       2014-07-17  760  				__func__, vchan->vc.chan.chan_id,
555859308723d8 Maxime Ripard       2014-07-17  761  				&sg_dma_address(sg), &sconfig->src_addr,
555859308723d8 Maxime Ripard       2014-07-17  762  				sg_dma_len(sg), flags);
555859308723d8 Maxime Ripard       2014-07-17  763  		}
555859308723d8 Maxime Ripard       2014-07-17  764  
555859308723d8 Maxime Ripard       2014-07-17  765  		prev = sun6i_dma_lli_add(prev, v_lli, p_lli, txd);
555859308723d8 Maxime Ripard       2014-07-17  766  	}
555859308723d8 Maxime Ripard       2014-07-17  767  
555859308723d8 Maxime Ripard       2014-07-17  768  	dev_dbg(chan2dev(chan), "First: %pad\n", &txd->p_lli);
9aa48806edb8c3 Samuel Holland      2022-04-24  769  	for (p_lli = txd->p_lli, v_lli = txd->v_lli; v_lli;
9aa48806edb8c3 Samuel Holland      2022-04-24  770  	     p_lli = v_lli->p_lli_next, v_lli = v_lli->v_lli_next)
9aa48806edb8c3 Samuel Holland      2022-04-24  771  		sun6i_dma_dump_lli(vchan, v_lli, p_lli);
555859308723d8 Maxime Ripard       2014-07-17  772  
555859308723d8 Maxime Ripard       2014-07-17  773  	return vchan_tx_prep(&vchan->vc, &txd->vd, flags);
555859308723d8 Maxime Ripard       2014-07-17  774  
4fbd804e009ae9 Maxime Ripard       2014-07-30  775  err_lli_free:
9aa48806edb8c3 Samuel Holland      2022-04-24  776  	for (p_lli = txd->p_lli, v_lli = txd->v_lli; v_lli;
9aa48806edb8c3 Samuel Holland      2022-04-24 @777  	     p_lli = v_lli->p_lli_next, v_lli = v_lli->v_lli_next)
9aa48806edb8c3 Samuel Holland      2022-04-24  778  		dma_pool_free(sdev->pool, v_lli, p_lli);
4fbd804e009ae9 Maxime Ripard       2014-07-30  779  	kfree(txd);
555859308723d8 Maxime Ripard       2014-07-17  780  	return NULL;
555859308723d8 Maxime Ripard       2014-07-17  781  }
555859308723d8 Maxime Ripard       2014-07-17  782  
a90e173f3faf29 Jean-Francois Moine 2016-04-28  783  static struct dma_async_tx_descriptor *sun6i_dma_prep_dma_cyclic(
a90e173f3faf29 Jean-Francois Moine 2016-04-28  784  					struct dma_chan *chan,
a90e173f3faf29 Jean-Francois Moine 2016-04-28  785  					dma_addr_t buf_addr,
a90e173f3faf29 Jean-Francois Moine 2016-04-28  786  					size_t buf_len,
a90e173f3faf29 Jean-Francois Moine 2016-04-28  787  					size_t period_len,
a90e173f3faf29 Jean-Francois Moine 2016-04-28  788  					enum dma_transfer_direction dir,
a90e173f3faf29 Jean-Francois Moine 2016-04-28  789  					unsigned long flags)
a90e173f3faf29 Jean-Francois Moine 2016-04-28  790  {
a90e173f3faf29 Jean-Francois Moine 2016-04-28  791  	struct sun6i_dma_dev *sdev = to_sun6i_dma_dev(chan->device);
a90e173f3faf29 Jean-Francois Moine 2016-04-28  792  	struct sun6i_vchan *vchan = to_sun6i_vchan(chan);
a90e173f3faf29 Jean-Francois Moine 2016-04-28  793  	struct dma_slave_config *sconfig = &vchan->cfg;
a90e173f3faf29 Jean-Francois Moine 2016-04-28  794  	struct sun6i_dma_lli *v_lli, *prev = NULL;
a90e173f3faf29 Jean-Francois Moine 2016-04-28  795  	struct sun6i_desc *txd;
a90e173f3faf29 Jean-Francois Moine 2016-04-28  796  	dma_addr_t p_lli;
a90e173f3faf29 Jean-Francois Moine 2016-04-28  797  	u32 lli_cfg;
a90e173f3faf29 Jean-Francois Moine 2016-04-28  798  	unsigned int i, periods = buf_len / period_len;
a90e173f3faf29 Jean-Francois Moine 2016-04-28  799  	int ret;
a90e173f3faf29 Jean-Francois Moine 2016-04-28  800  
a90e173f3faf29 Jean-Francois Moine 2016-04-28  801  	ret = set_config(sdev, sconfig, dir, &lli_cfg);
a90e173f3faf29 Jean-Francois Moine 2016-04-28  802  	if (ret) {
a90e173f3faf29 Jean-Francois Moine 2016-04-28  803  		dev_err(chan2dev(chan), "Invalid DMA configuration\n");
a90e173f3faf29 Jean-Francois Moine 2016-04-28  804  		return NULL;
a90e173f3faf29 Jean-Francois Moine 2016-04-28  805  	}
a90e173f3faf29 Jean-Francois Moine 2016-04-28  806  
a90e173f3faf29 Jean-Francois Moine 2016-04-28  807  	txd = kzalloc(sizeof(*txd), GFP_NOWAIT);
a90e173f3faf29 Jean-Francois Moine 2016-04-28  808  	if (!txd)
a90e173f3faf29 Jean-Francois Moine 2016-04-28  809  		return NULL;
a90e173f3faf29 Jean-Francois Moine 2016-04-28  810  
a90e173f3faf29 Jean-Francois Moine 2016-04-28  811  	for (i = 0; i < periods; i++) {
ec31c5c5949275 Samuel Holland      2022-04-24  812  		v_lli = dma_pool_alloc(sdev->pool, GFP_DMA32 | GFP_NOWAIT, &p_lli);
a90e173f3faf29 Jean-Francois Moine 2016-04-28  813  		if (!v_lli) {
a90e173f3faf29 Jean-Francois Moine 2016-04-28  814  			dev_err(sdev->slave.dev, "Failed to alloc lli memory\n");
a90e173f3faf29 Jean-Francois Moine 2016-04-28  815  			goto err_lli_free;
a90e173f3faf29 Jean-Francois Moine 2016-04-28  816  		}
a90e173f3faf29 Jean-Francois Moine 2016-04-28  817  
a90e173f3faf29 Jean-Francois Moine 2016-04-28  818  		v_lli->len = period_len;
a90e173f3faf29 Jean-Francois Moine 2016-04-28  819  		v_lli->para = NORMAL_WAIT;
a90e173f3faf29 Jean-Francois Moine 2016-04-28  820  
a90e173f3faf29 Jean-Francois Moine 2016-04-28  821  		if (dir == DMA_MEM_TO_DEV) {
ec31c5c5949275 Samuel Holland      2022-04-24  822  			sun6i_dma_set_addr(sdev, v_lli,
ec31c5c5949275 Samuel Holland      2022-04-24  823  					   buf_addr + period_len * i,
ec31c5c5949275 Samuel Holland      2022-04-24  824  					   sconfig->dst_addr);
802440bdf3b787 Jernej Skrabec      2019-05-27  825  			v_lli->cfg = lli_cfg;
67f34055118cb6 Jernej Skrabec      2019-05-27  826  			sdev->cfg->set_drq(&v_lli->cfg, DRQ_SDRAM, vchan->port);
802440bdf3b787 Jernej Skrabec      2019-05-27  827  			sdev->cfg->set_mode(&v_lli->cfg, LINEAR_MODE, IO_MODE);
a90e173f3faf29 Jean-Francois Moine 2016-04-28  828  		} else {
ec31c5c5949275 Samuel Holland      2022-04-24  829  			sun6i_dma_set_addr(sdev, v_lli,
ec31c5c5949275 Samuel Holland      2022-04-24  830  					   sconfig->src_addr,
ec31c5c5949275 Samuel Holland      2022-04-24  831  					   buf_addr + period_len * i);
802440bdf3b787 Jernej Skrabec      2019-05-27  832  			v_lli->cfg = lli_cfg;
67f34055118cb6 Jernej Skrabec      2019-05-27  833  			sdev->cfg->set_drq(&v_lli->cfg, vchan->port, DRQ_SDRAM);
802440bdf3b787 Jernej Skrabec      2019-05-27  834  			sdev->cfg->set_mode(&v_lli->cfg, IO_MODE, LINEAR_MODE);
a90e173f3faf29 Jean-Francois Moine 2016-04-28  835  		}
a90e173f3faf29 Jean-Francois Moine 2016-04-28  836  
a90e173f3faf29 Jean-Francois Moine 2016-04-28  837  		prev = sun6i_dma_lli_add(prev, v_lli, p_lli, txd);
a90e173f3faf29 Jean-Francois Moine 2016-04-28  838  	}
a90e173f3faf29 Jean-Francois Moine 2016-04-28  839  
a90e173f3faf29 Jean-Francois Moine 2016-04-28  840  	prev->p_lli_next = txd->p_lli;		/* cyclic list */
a90e173f3faf29 Jean-Francois Moine 2016-04-28  841  
a90e173f3faf29 Jean-Francois Moine 2016-04-28  842  	vchan->cyclic = true;
a90e173f3faf29 Jean-Francois Moine 2016-04-28  843  
a90e173f3faf29 Jean-Francois Moine 2016-04-28  844  	return vchan_tx_prep(&vchan->vc, &txd->vd, flags);
a90e173f3faf29 Jean-Francois Moine 2016-04-28  845  
a90e173f3faf29 Jean-Francois Moine 2016-04-28  846  err_lli_free:
9aa48806edb8c3 Samuel Holland      2022-04-24  847  	for (p_lli = txd->p_lli, v_lli = txd->v_lli; v_lli;
9aa48806edb8c3 Samuel Holland      2022-04-24 @848  	     p_lli = v_lli->p_lli_next, v_lli = v_lli->v_lli_next)
9aa48806edb8c3 Samuel Holland      2022-04-24  849  		dma_pool_free(sdev->pool, v_lli, p_lli);
a90e173f3faf29 Jean-Francois Moine 2016-04-28  850  	kfree(txd);
a90e173f3faf29 Jean-Francois Moine 2016-04-28  851  	return NULL;
a90e173f3faf29 Jean-Francois Moine 2016-04-28  852  }
a90e173f3faf29 Jean-Francois Moine 2016-04-28  853  

:::::: The code at line 777 was first introduced by commit
:::::: 9aa48806edb8c37e82532dbc6098b03f6bd4245e dmaengine: sun6i: Do not use virt_to_phys

:::::: TO: Samuel Holland <samuel@sholland.org>
:::::: CC: Vinod Koul <vkoul@kernel.org>

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

^ permalink raw reply	[flat|nested] 3+ messages in thread

* [linux-next:master 1083/1266] drivers/dma/sun6i-dma.c:777 sun6i_dma_prep_slave_sg() error: dereferencing freed memory 'v_lli'
@ 2024-03-26 14:53 Dan Carpenter
  2024-03-26 16:15 ` Suren Baghdasaryan
  0 siblings, 1 reply; 3+ messages in thread
From: Dan Carpenter @ 2024-03-26 14:53 UTC (permalink / raw)
  To: oe-kbuild, Maxime Ripard, Samuel Holland, Suren Baghdasaryan
  Cc: lkp, oe-kbuild-all, Kees Cook

[ I guess Suren Baghdasaryan's patches exposed a much older use after
  free in this driver.  -dan ]

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git master
head:   084c8e315db34b59d38d06e684b1a0dd07d30287
commit: c64e38ed88d13557ebeb4cb8def02390a8f3dfc4 [1083/1266] mm/slab: enable slab allocation tagging for kmalloc and friends
config: m68k-randconfig-r071-20240326 (https://download.01.org/0day-ci/archive/20240326/202403261808.c8ovEmC1-lkp@intel.com/config)
compiler: m68k-linux-gcc (GCC) 13.2.0

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Reported-by: Dan Carpenter <dan.carpenter@linaro.org>
| Closes: https://lore.kernel.org/r/202403261808.c8ovEmC1-lkp@intel.com/

smatch warnings:
drivers/dma/sun6i-dma.c:777 sun6i_dma_prep_slave_sg() error: dereferencing freed memory 'v_lli'
drivers/dma/sun6i-dma.c:848 sun6i_dma_prep_dma_cyclic() error: dereferencing freed memory 'v_lli'

vim +/v_lli +777 drivers/dma/sun6i-dma.c

555859308723d8 Maxime Ripard       2014-07-17  700  static struct dma_async_tx_descriptor *sun6i_dma_prep_slave_sg(
555859308723d8 Maxime Ripard       2014-07-17  701  		struct dma_chan *chan, struct scatterlist *sgl,
555859308723d8 Maxime Ripard       2014-07-17  702  		unsigned int sg_len, enum dma_transfer_direction dir,
555859308723d8 Maxime Ripard       2014-07-17  703  		unsigned long flags, void *context)
555859308723d8 Maxime Ripard       2014-07-17  704  {
555859308723d8 Maxime Ripard       2014-07-17  705  	struct sun6i_dma_dev *sdev = to_sun6i_dma_dev(chan->device);
555859308723d8 Maxime Ripard       2014-07-17  706  	struct sun6i_vchan *vchan = to_sun6i_vchan(chan);
555859308723d8 Maxime Ripard       2014-07-17  707  	struct dma_slave_config *sconfig = &vchan->cfg;
555859308723d8 Maxime Ripard       2014-07-17  708  	struct sun6i_dma_lli *v_lli, *prev = NULL;
555859308723d8 Maxime Ripard       2014-07-17  709  	struct sun6i_desc *txd;
555859308723d8 Maxime Ripard       2014-07-17  710  	struct scatterlist *sg;
555859308723d8 Maxime Ripard       2014-07-17  711  	dma_addr_t p_lli;
52c871798ff84b Jean-Francois Moine 2016-04-22  712  	u32 lli_cfg;
555859308723d8 Maxime Ripard       2014-07-17  713  	int i, ret;
555859308723d8 Maxime Ripard       2014-07-17  714  
555859308723d8 Maxime Ripard       2014-07-17  715  	if (!sgl)
555859308723d8 Maxime Ripard       2014-07-17  716  		return NULL;
555859308723d8 Maxime Ripard       2014-07-17  717  
52c871798ff84b Jean-Francois Moine 2016-04-22  718  	ret = set_config(sdev, sconfig, dir, &lli_cfg);
52c871798ff84b Jean-Francois Moine 2016-04-22  719  	if (ret) {
52c871798ff84b Jean-Francois Moine 2016-04-22  720  		dev_err(chan2dev(chan), "Invalid DMA configuration\n");
52c871798ff84b Jean-Francois Moine 2016-04-22  721  		return NULL;
52c871798ff84b Jean-Francois Moine 2016-04-22  722  	}
52c871798ff84b Jean-Francois Moine 2016-04-22  723  
555859308723d8 Maxime Ripard       2014-07-17  724  	txd = kzalloc(sizeof(*txd), GFP_NOWAIT);
555859308723d8 Maxime Ripard       2014-07-17  725  	if (!txd)
555859308723d8 Maxime Ripard       2014-07-17  726  		return NULL;
555859308723d8 Maxime Ripard       2014-07-17  727  
555859308723d8 Maxime Ripard       2014-07-17  728  	for_each_sg(sgl, sg, sg_len, i) {
ec31c5c5949275 Samuel Holland      2022-04-24  729  		v_lli = dma_pool_alloc(sdev->pool, GFP_DMA32 | GFP_NOWAIT, &p_lli);
4fbd804e009ae9 Maxime Ripard       2014-07-30  730  		if (!v_lli)
4fbd804e009ae9 Maxime Ripard       2014-07-30  731  			goto err_lli_free;
555859308723d8 Maxime Ripard       2014-07-17  732  
52c871798ff84b Jean-Francois Moine 2016-04-22  733  		v_lli->len = sg_dma_len(sg);
52c871798ff84b Jean-Francois Moine 2016-04-22  734  		v_lli->para = NORMAL_WAIT;
555859308723d8 Maxime Ripard       2014-07-17  735  
52c871798ff84b Jean-Francois Moine 2016-04-22  736  		if (dir == DMA_MEM_TO_DEV) {
ec31c5c5949275 Samuel Holland      2022-04-24  737  			sun6i_dma_set_addr(sdev, v_lli,
ec31c5c5949275 Samuel Holland      2022-04-24  738  					   sg_dma_address(sg),
ec31c5c5949275 Samuel Holland      2022-04-24  739  					   sconfig->dst_addr);
802440bdf3b787 Jernej Skrabec      2019-05-27  740  			v_lli->cfg = lli_cfg;
67f34055118cb6 Jernej Skrabec      2019-05-27  741  			sdev->cfg->set_drq(&v_lli->cfg, DRQ_SDRAM, vchan->port);
802440bdf3b787 Jernej Skrabec      2019-05-27  742  			sdev->cfg->set_mode(&v_lli->cfg, LINEAR_MODE, IO_MODE);
555859308723d8 Maxime Ripard       2014-07-17  743  
555859308723d8 Maxime Ripard       2014-07-17  744  			dev_dbg(chan2dev(chan),
7f5e03e7367293 Vinod Koul          2014-07-28  745  				"%s; chan: %d, dest: %pad, src: %pad, len: %u. flags: 0x%08lx\n",
555859308723d8 Maxime Ripard       2014-07-17  746  				__func__, vchan->vc.chan.chan_id,
555859308723d8 Maxime Ripard       2014-07-17  747  				&sconfig->dst_addr, &sg_dma_address(sg),
555859308723d8 Maxime Ripard       2014-07-17  748  				sg_dma_len(sg), flags);
555859308723d8 Maxime Ripard       2014-07-17  749  
555859308723d8 Maxime Ripard       2014-07-17  750  		} else {
ec31c5c5949275 Samuel Holland      2022-04-24  751  			sun6i_dma_set_addr(sdev, v_lli,
ec31c5c5949275 Samuel Holland      2022-04-24  752  					   sconfig->src_addr,
ec31c5c5949275 Samuel Holland      2022-04-24  753  					   sg_dma_address(sg));
802440bdf3b787 Jernej Skrabec      2019-05-27  754  			v_lli->cfg = lli_cfg;
67f34055118cb6 Jernej Skrabec      2019-05-27  755  			sdev->cfg->set_drq(&v_lli->cfg, vchan->port, DRQ_SDRAM);
802440bdf3b787 Jernej Skrabec      2019-05-27  756  			sdev->cfg->set_mode(&v_lli->cfg, IO_MODE, LINEAR_MODE);
555859308723d8 Maxime Ripard       2014-07-17  757  
555859308723d8 Maxime Ripard       2014-07-17  758  			dev_dbg(chan2dev(chan),
7f5e03e7367293 Vinod Koul          2014-07-28  759  				"%s; chan: %d, dest: %pad, src: %pad, len: %u. flags: 0x%08lx\n",
555859308723d8 Maxime Ripard       2014-07-17  760  				__func__, vchan->vc.chan.chan_id,
555859308723d8 Maxime Ripard       2014-07-17  761  				&sg_dma_address(sg), &sconfig->src_addr,
555859308723d8 Maxime Ripard       2014-07-17  762  				sg_dma_len(sg), flags);
555859308723d8 Maxime Ripard       2014-07-17  763  		}
555859308723d8 Maxime Ripard       2014-07-17  764  
555859308723d8 Maxime Ripard       2014-07-17  765  		prev = sun6i_dma_lli_add(prev, v_lli, p_lli, txd);
555859308723d8 Maxime Ripard       2014-07-17  766  	}
555859308723d8 Maxime Ripard       2014-07-17  767  
555859308723d8 Maxime Ripard       2014-07-17  768  	dev_dbg(chan2dev(chan), "First: %pad\n", &txd->p_lli);
9aa48806edb8c3 Samuel Holland      2022-04-24  769  	for (p_lli = txd->p_lli, v_lli = txd->v_lli; v_lli;
9aa48806edb8c3 Samuel Holland      2022-04-24  770  	     p_lli = v_lli->p_lli_next, v_lli = v_lli->v_lli_next)
9aa48806edb8c3 Samuel Holland      2022-04-24  771  		sun6i_dma_dump_lli(vchan, v_lli, p_lli);
555859308723d8 Maxime Ripard       2014-07-17  772  
555859308723d8 Maxime Ripard       2014-07-17  773  	return vchan_tx_prep(&vchan->vc, &txd->vd, flags);
555859308723d8 Maxime Ripard       2014-07-17  774  
4fbd804e009ae9 Maxime Ripard       2014-07-30  775  err_lli_free:
9aa48806edb8c3 Samuel Holland      2022-04-24  776  	for (p_lli = txd->p_lli, v_lli = txd->v_lli; v_lli;
9aa48806edb8c3 Samuel Holland      2022-04-24 @777  	     p_lli = v_lli->p_lli_next, v_lli = v_lli->v_lli_next)
                                                                     ^^^^^^^                    ^^^^^^^
9aa48806edb8c3 Samuel Holland      2022-04-24  778  		dma_pool_free(sdev->pool, v_lli, p_lli);
                                                                                          ^^^^^
It's illegal to dereference "v_lli" after passing it to
dma_pool_free().

4fbd804e009ae9 Maxime Ripard       2014-07-30  779  	kfree(txd);
555859308723d8 Maxime Ripard       2014-07-17  780  	return NULL;
555859308723d8 Maxime Ripard       2014-07-17  781  }
555859308723d8 Maxime Ripard       2014-07-17  782  
a90e173f3faf29 Jean-Francois Moine 2016-04-28  783  static struct dma_async_tx_descriptor *sun6i_dma_prep_dma_cyclic(
a90e173f3faf29 Jean-Francois Moine 2016-04-28  784  					struct dma_chan *chan,
a90e173f3faf29 Jean-Francois Moine 2016-04-28  785  					dma_addr_t buf_addr,
a90e173f3faf29 Jean-Francois Moine 2016-04-28  786  					size_t buf_len,
a90e173f3faf29 Jean-Francois Moine 2016-04-28  787  					size_t period_len,
a90e173f3faf29 Jean-Francois Moine 2016-04-28  788  					enum dma_transfer_direction dir,
a90e173f3faf29 Jean-Francois Moine 2016-04-28  789  					unsigned long flags)
a90e173f3faf29 Jean-Francois Moine 2016-04-28  790  {
a90e173f3faf29 Jean-Francois Moine 2016-04-28  791  	struct sun6i_dma_dev *sdev = to_sun6i_dma_dev(chan->device);
a90e173f3faf29 Jean-Francois Moine 2016-04-28  792  	struct sun6i_vchan *vchan = to_sun6i_vchan(chan);
a90e173f3faf29 Jean-Francois Moine 2016-04-28  793  	struct dma_slave_config *sconfig = &vchan->cfg;
a90e173f3faf29 Jean-Francois Moine 2016-04-28  794  	struct sun6i_dma_lli *v_lli, *prev = NULL;
a90e173f3faf29 Jean-Francois Moine 2016-04-28  795  	struct sun6i_desc *txd;
a90e173f3faf29 Jean-Francois Moine 2016-04-28  796  	dma_addr_t p_lli;
a90e173f3faf29 Jean-Francois Moine 2016-04-28  797  	u32 lli_cfg;
a90e173f3faf29 Jean-Francois Moine 2016-04-28  798  	unsigned int i, periods = buf_len / period_len;
a90e173f3faf29 Jean-Francois Moine 2016-04-28  799  	int ret;
a90e173f3faf29 Jean-Francois Moine 2016-04-28  800  
a90e173f3faf29 Jean-Francois Moine 2016-04-28  801  	ret = set_config(sdev, sconfig, dir, &lli_cfg);
a90e173f3faf29 Jean-Francois Moine 2016-04-28  802  	if (ret) {
a90e173f3faf29 Jean-Francois Moine 2016-04-28  803  		dev_err(chan2dev(chan), "Invalid DMA configuration\n");
a90e173f3faf29 Jean-Francois Moine 2016-04-28  804  		return NULL;
a90e173f3faf29 Jean-Francois Moine 2016-04-28  805  	}
a90e173f3faf29 Jean-Francois Moine 2016-04-28  806  
a90e173f3faf29 Jean-Francois Moine 2016-04-28  807  	txd = kzalloc(sizeof(*txd), GFP_NOWAIT);
a90e173f3faf29 Jean-Francois Moine 2016-04-28  808  	if (!txd)
a90e173f3faf29 Jean-Francois Moine 2016-04-28  809  		return NULL;
a90e173f3faf29 Jean-Francois Moine 2016-04-28  810  
a90e173f3faf29 Jean-Francois Moine 2016-04-28  811  	for (i = 0; i < periods; i++) {
ec31c5c5949275 Samuel Holland      2022-04-24  812  		v_lli = dma_pool_alloc(sdev->pool, GFP_DMA32 | GFP_NOWAIT, &p_lli);
a90e173f3faf29 Jean-Francois Moine 2016-04-28  813  		if (!v_lli) {
a90e173f3faf29 Jean-Francois Moine 2016-04-28  814  			dev_err(sdev->slave.dev, "Failed to alloc lli memory\n");
a90e173f3faf29 Jean-Francois Moine 2016-04-28  815  			goto err_lli_free;
a90e173f3faf29 Jean-Francois Moine 2016-04-28  816  		}
a90e173f3faf29 Jean-Francois Moine 2016-04-28  817  
a90e173f3faf29 Jean-Francois Moine 2016-04-28  818  		v_lli->len = period_len;
a90e173f3faf29 Jean-Francois Moine 2016-04-28  819  		v_lli->para = NORMAL_WAIT;
a90e173f3faf29 Jean-Francois Moine 2016-04-28  820  
a90e173f3faf29 Jean-Francois Moine 2016-04-28  821  		if (dir == DMA_MEM_TO_DEV) {
ec31c5c5949275 Samuel Holland      2022-04-24  822  			sun6i_dma_set_addr(sdev, v_lli,
ec31c5c5949275 Samuel Holland      2022-04-24  823  					   buf_addr + period_len * i,
ec31c5c5949275 Samuel Holland      2022-04-24  824  					   sconfig->dst_addr);
802440bdf3b787 Jernej Skrabec      2019-05-27  825  			v_lli->cfg = lli_cfg;
67f34055118cb6 Jernej Skrabec      2019-05-27  826  			sdev->cfg->set_drq(&v_lli->cfg, DRQ_SDRAM, vchan->port);
802440bdf3b787 Jernej Skrabec      2019-05-27  827  			sdev->cfg->set_mode(&v_lli->cfg, LINEAR_MODE, IO_MODE);
a90e173f3faf29 Jean-Francois Moine 2016-04-28  828  		} else {
ec31c5c5949275 Samuel Holland      2022-04-24  829  			sun6i_dma_set_addr(sdev, v_lli,
ec31c5c5949275 Samuel Holland      2022-04-24  830  					   sconfig->src_addr,
ec31c5c5949275 Samuel Holland      2022-04-24  831  					   buf_addr + period_len * i);
802440bdf3b787 Jernej Skrabec      2019-05-27  832  			v_lli->cfg = lli_cfg;
67f34055118cb6 Jernej Skrabec      2019-05-27  833  			sdev->cfg->set_drq(&v_lli->cfg, vchan->port, DRQ_SDRAM);
802440bdf3b787 Jernej Skrabec      2019-05-27  834  			sdev->cfg->set_mode(&v_lli->cfg, IO_MODE, LINEAR_MODE);
a90e173f3faf29 Jean-Francois Moine 2016-04-28  835  		}
a90e173f3faf29 Jean-Francois Moine 2016-04-28  836  
a90e173f3faf29 Jean-Francois Moine 2016-04-28  837  		prev = sun6i_dma_lli_add(prev, v_lli, p_lli, txd);
a90e173f3faf29 Jean-Francois Moine 2016-04-28  838  	}
a90e173f3faf29 Jean-Francois Moine 2016-04-28  839  
a90e173f3faf29 Jean-Francois Moine 2016-04-28  840  	prev->p_lli_next = txd->p_lli;		/* cyclic list */
a90e173f3faf29 Jean-Francois Moine 2016-04-28  841  
a90e173f3faf29 Jean-Francois Moine 2016-04-28  842  	vchan->cyclic = true;
a90e173f3faf29 Jean-Francois Moine 2016-04-28  843  
a90e173f3faf29 Jean-Francois Moine 2016-04-28  844  	return vchan_tx_prep(&vchan->vc, &txd->vd, flags);
a90e173f3faf29 Jean-Francois Moine 2016-04-28  845  
a90e173f3faf29 Jean-Francois Moine 2016-04-28  846  err_lli_free:
9aa48806edb8c3 Samuel Holland      2022-04-24  847  	for (p_lli = txd->p_lli, v_lli = txd->v_lli; v_lli;
9aa48806edb8c3 Samuel Holland      2022-04-24 @848  	     p_lli = v_lli->p_lli_next, v_lli = v_lli->v_lli_next)
9aa48806edb8c3 Samuel Holland      2022-04-24  849  		dma_pool_free(sdev->pool, v_lli, p_lli);

Same.

a90e173f3faf29 Jean-Francois Moine 2016-04-28  850  	kfree(txd);
a90e173f3faf29 Jean-Francois Moine 2016-04-28  851  	return NULL;
a90e173f3faf29 Jean-Francois Moine 2016-04-28  852  }

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki


^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [linux-next:master 1083/1266] drivers/dma/sun6i-dma.c:777 sun6i_dma_prep_slave_sg() error: dereferencing freed memory 'v_lli'
  2024-03-26 14:53 Dan Carpenter
@ 2024-03-26 16:15 ` Suren Baghdasaryan
  0 siblings, 0 replies; 3+ messages in thread
From: Suren Baghdasaryan @ 2024-03-26 16:15 UTC (permalink / raw)
  To: Dan Carpenter
  Cc: oe-kbuild, Maxime Ripard, Samuel Holland, lkp, oe-kbuild-all,
	Kees Cook, Kent Overstreet

On Tue, Mar 26, 2024 at 7:53 AM Dan Carpenter <dan.carpenter@linaro.org> wrote:
>
> [ I guess Suren Baghdasaryan's patches exposed a much older use after
>   free in this driver.  -dan ]

Huh, this is interesting. The warnings seem reasonable but I have no
idea why our patchset would make them more visible... CC'ing Kent in
case he has an idea.

>
> tree:   https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git master
> head:   084c8e315db34b59d38d06e684b1a0dd07d30287
> commit: c64e38ed88d13557ebeb4cb8def02390a8f3dfc4 [1083/1266] mm/slab: enable slab allocation tagging for kmalloc and friends
> config: m68k-randconfig-r071-20240326 (https://download.01.org/0day-ci/archive/20240326/202403261808.c8ovEmC1-lkp@intel.com/config)
> compiler: m68k-linux-gcc (GCC) 13.2.0
>
> If you fix the issue in a separate patch/commit (i.e. not just a new version of
> the same patch/commit), kindly add following tags
> | Reported-by: kernel test robot <lkp@intel.com>
> | Reported-by: Dan Carpenter <dan.carpenter@linaro.org>
> | Closes: https://lore.kernel.org/r/202403261808.c8ovEmC1-lkp@intel.com/
>
> smatch warnings:
> drivers/dma/sun6i-dma.c:777 sun6i_dma_prep_slave_sg() error: dereferencing freed memory 'v_lli'
> drivers/dma/sun6i-dma.c:848 sun6i_dma_prep_dma_cyclic() error: dereferencing freed memory 'v_lli'
>
> vim +/v_lli +777 drivers/dma/sun6i-dma.c
>
> 555859308723d8 Maxime Ripard       2014-07-17  700  static struct dma_async_tx_descriptor *sun6i_dma_prep_slave_sg(
> 555859308723d8 Maxime Ripard       2014-07-17  701              struct dma_chan *chan, struct scatterlist *sgl,
> 555859308723d8 Maxime Ripard       2014-07-17  702              unsigned int sg_len, enum dma_transfer_direction dir,
> 555859308723d8 Maxime Ripard       2014-07-17  703              unsigned long flags, void *context)
> 555859308723d8 Maxime Ripard       2014-07-17  704  {
> 555859308723d8 Maxime Ripard       2014-07-17  705      struct sun6i_dma_dev *sdev = to_sun6i_dma_dev(chan->device);
> 555859308723d8 Maxime Ripard       2014-07-17  706      struct sun6i_vchan *vchan = to_sun6i_vchan(chan);
> 555859308723d8 Maxime Ripard       2014-07-17  707      struct dma_slave_config *sconfig = &vchan->cfg;
> 555859308723d8 Maxime Ripard       2014-07-17  708      struct sun6i_dma_lli *v_lli, *prev = NULL;
> 555859308723d8 Maxime Ripard       2014-07-17  709      struct sun6i_desc *txd;
> 555859308723d8 Maxime Ripard       2014-07-17  710      struct scatterlist *sg;
> 555859308723d8 Maxime Ripard       2014-07-17  711      dma_addr_t p_lli;
> 52c871798ff84b Jean-Francois Moine 2016-04-22  712      u32 lli_cfg;
> 555859308723d8 Maxime Ripard       2014-07-17  713      int i, ret;
> 555859308723d8 Maxime Ripard       2014-07-17  714
> 555859308723d8 Maxime Ripard       2014-07-17  715      if (!sgl)
> 555859308723d8 Maxime Ripard       2014-07-17  716              return NULL;
> 555859308723d8 Maxime Ripard       2014-07-17  717
> 52c871798ff84b Jean-Francois Moine 2016-04-22  718      ret = set_config(sdev, sconfig, dir, &lli_cfg);
> 52c871798ff84b Jean-Francois Moine 2016-04-22  719      if (ret) {
> 52c871798ff84b Jean-Francois Moine 2016-04-22  720              dev_err(chan2dev(chan), "Invalid DMA configuration\n");
> 52c871798ff84b Jean-Francois Moine 2016-04-22  721              return NULL;
> 52c871798ff84b Jean-Francois Moine 2016-04-22  722      }
> 52c871798ff84b Jean-Francois Moine 2016-04-22  723
> 555859308723d8 Maxime Ripard       2014-07-17  724      txd = kzalloc(sizeof(*txd), GFP_NOWAIT);
> 555859308723d8 Maxime Ripard       2014-07-17  725      if (!txd)
> 555859308723d8 Maxime Ripard       2014-07-17  726              return NULL;
> 555859308723d8 Maxime Ripard       2014-07-17  727
> 555859308723d8 Maxime Ripard       2014-07-17  728      for_each_sg(sgl, sg, sg_len, i) {
> ec31c5c5949275 Samuel Holland      2022-04-24  729              v_lli = dma_pool_alloc(sdev->pool, GFP_DMA32 | GFP_NOWAIT, &p_lli);
> 4fbd804e009ae9 Maxime Ripard       2014-07-30  730              if (!v_lli)
> 4fbd804e009ae9 Maxime Ripard       2014-07-30  731                      goto err_lli_free;
> 555859308723d8 Maxime Ripard       2014-07-17  732
> 52c871798ff84b Jean-Francois Moine 2016-04-22  733              v_lli->len = sg_dma_len(sg);
> 52c871798ff84b Jean-Francois Moine 2016-04-22  734              v_lli->para = NORMAL_WAIT;
> 555859308723d8 Maxime Ripard       2014-07-17  735
> 52c871798ff84b Jean-Francois Moine 2016-04-22  736              if (dir == DMA_MEM_TO_DEV) {
> ec31c5c5949275 Samuel Holland      2022-04-24  737                      sun6i_dma_set_addr(sdev, v_lli,
> ec31c5c5949275 Samuel Holland      2022-04-24  738                                         sg_dma_address(sg),
> ec31c5c5949275 Samuel Holland      2022-04-24  739                                         sconfig->dst_addr);
> 802440bdf3b787 Jernej Skrabec      2019-05-27  740                      v_lli->cfg = lli_cfg;
> 67f34055118cb6 Jernej Skrabec      2019-05-27  741                      sdev->cfg->set_drq(&v_lli->cfg, DRQ_SDRAM, vchan->port);
> 802440bdf3b787 Jernej Skrabec      2019-05-27  742                      sdev->cfg->set_mode(&v_lli->cfg, LINEAR_MODE, IO_MODE);
> 555859308723d8 Maxime Ripard       2014-07-17  743
> 555859308723d8 Maxime Ripard       2014-07-17  744                      dev_dbg(chan2dev(chan),
> 7f5e03e7367293 Vinod Koul          2014-07-28  745                              "%s; chan: %d, dest: %pad, src: %pad, len: %u. flags: 0x%08lx\n",
> 555859308723d8 Maxime Ripard       2014-07-17  746                              __func__, vchan->vc.chan.chan_id,
> 555859308723d8 Maxime Ripard       2014-07-17  747                              &sconfig->dst_addr, &sg_dma_address(sg),
> 555859308723d8 Maxime Ripard       2014-07-17  748                              sg_dma_len(sg), flags);
> 555859308723d8 Maxime Ripard       2014-07-17  749
> 555859308723d8 Maxime Ripard       2014-07-17  750              } else {
> ec31c5c5949275 Samuel Holland      2022-04-24  751                      sun6i_dma_set_addr(sdev, v_lli,
> ec31c5c5949275 Samuel Holland      2022-04-24  752                                         sconfig->src_addr,
> ec31c5c5949275 Samuel Holland      2022-04-24  753                                         sg_dma_address(sg));
> 802440bdf3b787 Jernej Skrabec      2019-05-27  754                      v_lli->cfg = lli_cfg;
> 67f34055118cb6 Jernej Skrabec      2019-05-27  755                      sdev->cfg->set_drq(&v_lli->cfg, vchan->port, DRQ_SDRAM);
> 802440bdf3b787 Jernej Skrabec      2019-05-27  756                      sdev->cfg->set_mode(&v_lli->cfg, IO_MODE, LINEAR_MODE);
> 555859308723d8 Maxime Ripard       2014-07-17  757
> 555859308723d8 Maxime Ripard       2014-07-17  758                      dev_dbg(chan2dev(chan),
> 7f5e03e7367293 Vinod Koul          2014-07-28  759                              "%s; chan: %d, dest: %pad, src: %pad, len: %u. flags: 0x%08lx\n",
> 555859308723d8 Maxime Ripard       2014-07-17  760                              __func__, vchan->vc.chan.chan_id,
> 555859308723d8 Maxime Ripard       2014-07-17  761                              &sg_dma_address(sg), &sconfig->src_addr,
> 555859308723d8 Maxime Ripard       2014-07-17  762                              sg_dma_len(sg), flags);
> 555859308723d8 Maxime Ripard       2014-07-17  763              }
> 555859308723d8 Maxime Ripard       2014-07-17  764
> 555859308723d8 Maxime Ripard       2014-07-17  765              prev = sun6i_dma_lli_add(prev, v_lli, p_lli, txd);
> 555859308723d8 Maxime Ripard       2014-07-17  766      }
> 555859308723d8 Maxime Ripard       2014-07-17  767
> 555859308723d8 Maxime Ripard       2014-07-17  768      dev_dbg(chan2dev(chan), "First: %pad\n", &txd->p_lli);
> 9aa48806edb8c3 Samuel Holland      2022-04-24  769      for (p_lli = txd->p_lli, v_lli = txd->v_lli; v_lli;
> 9aa48806edb8c3 Samuel Holland      2022-04-24  770           p_lli = v_lli->p_lli_next, v_lli = v_lli->v_lli_next)
> 9aa48806edb8c3 Samuel Holland      2022-04-24  771              sun6i_dma_dump_lli(vchan, v_lli, p_lli);
> 555859308723d8 Maxime Ripard       2014-07-17  772
> 555859308723d8 Maxime Ripard       2014-07-17  773      return vchan_tx_prep(&vchan->vc, &txd->vd, flags);
> 555859308723d8 Maxime Ripard       2014-07-17  774
> 4fbd804e009ae9 Maxime Ripard       2014-07-30  775  err_lli_free:
> 9aa48806edb8c3 Samuel Holland      2022-04-24  776      for (p_lli = txd->p_lli, v_lli = txd->v_lli; v_lli;
> 9aa48806edb8c3 Samuel Holland      2022-04-24 @777           p_lli = v_lli->p_lli_next, v_lli = v_lli->v_lli_next)
>                                                                      ^^^^^^^                    ^^^^^^^
> 9aa48806edb8c3 Samuel Holland      2022-04-24  778              dma_pool_free(sdev->pool, v_lli, p_lli);
>                                                                                           ^^^^^
> It's illegal to dereference "v_lli" after passing it to
> dma_pool_free().
>
> 4fbd804e009ae9 Maxime Ripard       2014-07-30  779      kfree(txd);
> 555859308723d8 Maxime Ripard       2014-07-17  780      return NULL;
> 555859308723d8 Maxime Ripard       2014-07-17  781  }
> 555859308723d8 Maxime Ripard       2014-07-17  782
> a90e173f3faf29 Jean-Francois Moine 2016-04-28  783  static struct dma_async_tx_descriptor *sun6i_dma_prep_dma_cyclic(
> a90e173f3faf29 Jean-Francois Moine 2016-04-28  784                                      struct dma_chan *chan,
> a90e173f3faf29 Jean-Francois Moine 2016-04-28  785                                      dma_addr_t buf_addr,
> a90e173f3faf29 Jean-Francois Moine 2016-04-28  786                                      size_t buf_len,
> a90e173f3faf29 Jean-Francois Moine 2016-04-28  787                                      size_t period_len,
> a90e173f3faf29 Jean-Francois Moine 2016-04-28  788                                      enum dma_transfer_direction dir,
> a90e173f3faf29 Jean-Francois Moine 2016-04-28  789                                      unsigned long flags)
> a90e173f3faf29 Jean-Francois Moine 2016-04-28  790  {
> a90e173f3faf29 Jean-Francois Moine 2016-04-28  791      struct sun6i_dma_dev *sdev = to_sun6i_dma_dev(chan->device);
> a90e173f3faf29 Jean-Francois Moine 2016-04-28  792      struct sun6i_vchan *vchan = to_sun6i_vchan(chan);
> a90e173f3faf29 Jean-Francois Moine 2016-04-28  793      struct dma_slave_config *sconfig = &vchan->cfg;
> a90e173f3faf29 Jean-Francois Moine 2016-04-28  794      struct sun6i_dma_lli *v_lli, *prev = NULL;
> a90e173f3faf29 Jean-Francois Moine 2016-04-28  795      struct sun6i_desc *txd;
> a90e173f3faf29 Jean-Francois Moine 2016-04-28  796      dma_addr_t p_lli;
> a90e173f3faf29 Jean-Francois Moine 2016-04-28  797      u32 lli_cfg;
> a90e173f3faf29 Jean-Francois Moine 2016-04-28  798      unsigned int i, periods = buf_len / period_len;
> a90e173f3faf29 Jean-Francois Moine 2016-04-28  799      int ret;
> a90e173f3faf29 Jean-Francois Moine 2016-04-28  800
> a90e173f3faf29 Jean-Francois Moine 2016-04-28  801      ret = set_config(sdev, sconfig, dir, &lli_cfg);
> a90e173f3faf29 Jean-Francois Moine 2016-04-28  802      if (ret) {
> a90e173f3faf29 Jean-Francois Moine 2016-04-28  803              dev_err(chan2dev(chan), "Invalid DMA configuration\n");
> a90e173f3faf29 Jean-Francois Moine 2016-04-28  804              return NULL;
> a90e173f3faf29 Jean-Francois Moine 2016-04-28  805      }
> a90e173f3faf29 Jean-Francois Moine 2016-04-28  806
> a90e173f3faf29 Jean-Francois Moine 2016-04-28  807      txd = kzalloc(sizeof(*txd), GFP_NOWAIT);
> a90e173f3faf29 Jean-Francois Moine 2016-04-28  808      if (!txd)
> a90e173f3faf29 Jean-Francois Moine 2016-04-28  809              return NULL;
> a90e173f3faf29 Jean-Francois Moine 2016-04-28  810
> a90e173f3faf29 Jean-Francois Moine 2016-04-28  811      for (i = 0; i < periods; i++) {
> ec31c5c5949275 Samuel Holland      2022-04-24  812              v_lli = dma_pool_alloc(sdev->pool, GFP_DMA32 | GFP_NOWAIT, &p_lli);
> a90e173f3faf29 Jean-Francois Moine 2016-04-28  813              if (!v_lli) {
> a90e173f3faf29 Jean-Francois Moine 2016-04-28  814                      dev_err(sdev->slave.dev, "Failed to alloc lli memory\n");
> a90e173f3faf29 Jean-Francois Moine 2016-04-28  815                      goto err_lli_free;
> a90e173f3faf29 Jean-Francois Moine 2016-04-28  816              }
> a90e173f3faf29 Jean-Francois Moine 2016-04-28  817
> a90e173f3faf29 Jean-Francois Moine 2016-04-28  818              v_lli->len = period_len;
> a90e173f3faf29 Jean-Francois Moine 2016-04-28  819              v_lli->para = NORMAL_WAIT;
> a90e173f3faf29 Jean-Francois Moine 2016-04-28  820
> a90e173f3faf29 Jean-Francois Moine 2016-04-28  821              if (dir == DMA_MEM_TO_DEV) {
> ec31c5c5949275 Samuel Holland      2022-04-24  822                      sun6i_dma_set_addr(sdev, v_lli,
> ec31c5c5949275 Samuel Holland      2022-04-24  823                                         buf_addr + period_len * i,
> ec31c5c5949275 Samuel Holland      2022-04-24  824                                         sconfig->dst_addr);
> 802440bdf3b787 Jernej Skrabec      2019-05-27  825                      v_lli->cfg = lli_cfg;
> 67f34055118cb6 Jernej Skrabec      2019-05-27  826                      sdev->cfg->set_drq(&v_lli->cfg, DRQ_SDRAM, vchan->port);
> 802440bdf3b787 Jernej Skrabec      2019-05-27  827                      sdev->cfg->set_mode(&v_lli->cfg, LINEAR_MODE, IO_MODE);
> a90e173f3faf29 Jean-Francois Moine 2016-04-28  828              } else {
> ec31c5c5949275 Samuel Holland      2022-04-24  829                      sun6i_dma_set_addr(sdev, v_lli,
> ec31c5c5949275 Samuel Holland      2022-04-24  830                                         sconfig->src_addr,
> ec31c5c5949275 Samuel Holland      2022-04-24  831                                         buf_addr + period_len * i);
> 802440bdf3b787 Jernej Skrabec      2019-05-27  832                      v_lli->cfg = lli_cfg;
> 67f34055118cb6 Jernej Skrabec      2019-05-27  833                      sdev->cfg->set_drq(&v_lli->cfg, vchan->port, DRQ_SDRAM);
> 802440bdf3b787 Jernej Skrabec      2019-05-27  834                      sdev->cfg->set_mode(&v_lli->cfg, IO_MODE, LINEAR_MODE);
> a90e173f3faf29 Jean-Francois Moine 2016-04-28  835              }
> a90e173f3faf29 Jean-Francois Moine 2016-04-28  836
> a90e173f3faf29 Jean-Francois Moine 2016-04-28  837              prev = sun6i_dma_lli_add(prev, v_lli, p_lli, txd);
> a90e173f3faf29 Jean-Francois Moine 2016-04-28  838      }
> a90e173f3faf29 Jean-Francois Moine 2016-04-28  839
> a90e173f3faf29 Jean-Francois Moine 2016-04-28  840      prev->p_lli_next = txd->p_lli;          /* cyclic list */
> a90e173f3faf29 Jean-Francois Moine 2016-04-28  841
> a90e173f3faf29 Jean-Francois Moine 2016-04-28  842      vchan->cyclic = true;
> a90e173f3faf29 Jean-Francois Moine 2016-04-28  843
> a90e173f3faf29 Jean-Francois Moine 2016-04-28  844      return vchan_tx_prep(&vchan->vc, &txd->vd, flags);
> a90e173f3faf29 Jean-Francois Moine 2016-04-28  845
> a90e173f3faf29 Jean-Francois Moine 2016-04-28  846  err_lli_free:
> 9aa48806edb8c3 Samuel Holland      2022-04-24  847      for (p_lli = txd->p_lli, v_lli = txd->v_lli; v_lli;
> 9aa48806edb8c3 Samuel Holland      2022-04-24 @848           p_lli = v_lli->p_lli_next, v_lli = v_lli->v_lli_next)
> 9aa48806edb8c3 Samuel Holland      2022-04-24  849              dma_pool_free(sdev->pool, v_lli, p_lli);
>
> Same.
>
> a90e173f3faf29 Jean-Francois Moine 2016-04-28  850      kfree(txd);
> a90e173f3faf29 Jean-Francois Moine 2016-04-28  851      return NULL;
> a90e173f3faf29 Jean-Francois Moine 2016-04-28  852  }
>
> --
> 0-DAY CI Kernel Test Service
> https://github.com/intel/lkp-tests/wiki
>

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2024-03-26 16:15 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-03-26 10:19 [linux-next:master 1083/1266] drivers/dma/sun6i-dma.c:777 sun6i_dma_prep_slave_sg() error: dereferencing freed memory 'v_lli' kernel test robot
  -- strict thread matches above, loose matches on Subject: below --
2024-03-26 14:53 Dan Carpenter
2024-03-26 16:15 ` Suren Baghdasaryan

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.