• Russell King's avatar
    crypto: caam - fix DMA API mapping leak · 3d5a2db6
    Russell King authored
    caamhash contains this weird code:
    
    	src_nents = sg_count(req->src, req->nbytes);
    	dma_map_sg(jrdev, req->src, src_nents ? : 1, DMA_TO_DEVICE);
    	...
    	edesc->src_nents = src_nents;
    
    sg_count() returns zero when sg_nents_for_len() returns zero or one.
    This means we don't need to use a hardware scatterlist.  However,
    setting src_nents to zero causes problems when we unmap:
    
    	if (edesc->src_nents)
    		dma_unmap_sg_chained(dev, req->src, edesc->src_nents,
    				     DMA_TO_DEVICE, edesc->chained);
    
    as zero here means that we have no entries to unmap.  This causes us
    to leak DMA mappings, where we map one scatterlist entry and then
    fail to unmap it.
    
    This can be fixed in two ways: either by writing the number of entries
    that were requested of dma_map_sg(), or by reworking the "no SG
    required" case.
    
    We adopt the re-work solution here - we replace sg_count() with
    sg_nents_for_len(), so src_nents now contains the real number of
    scatterlist entries, and we then change the test for using the
    hardware scatterlist to src_nents > 1 rather than just non-zero.
    
    This change passes my sshd, openssl tests hashing /bin and tcrypt
    tests.
    Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
    Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
    3d5a2db6
caamhash.c 58 KB