Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge branch 'linus' of git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6

Pull crypto fix from Herbert Xu:
"This fixes a bug in the RSA self-test that may cause crashes on some
architectures such as SPARC"

* 'linus' of git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6:
crypto: testmgr - Use kmalloc memory for RSA input

+22 -5
+22 -5
crypto/testmgr.c
··· 1776 1776 static int do_test_rsa(struct crypto_akcipher *tfm, 1777 1777 struct akcipher_testvec *vecs) 1778 1778 { 1779 + char *xbuf[XBUFSIZE]; 1779 1780 struct akcipher_request *req; 1780 1781 void *outbuf_enc = NULL; 1781 1782 void *outbuf_dec = NULL; ··· 1785 1784 int err = -ENOMEM; 1786 1785 struct scatterlist src, dst, src_tab[2]; 1787 1786 1787 + if (testmgr_alloc_buf(xbuf)) 1788 + return err; 1789 + 1788 1790 req = akcipher_request_alloc(tfm, GFP_KERNEL); 1789 1791 if (!req) 1790 - return err; 1792 + goto free_xbuf; 1791 1793 1792 1794 init_completion(&result.completion); 1793 1795 ··· 1808 1804 if (!outbuf_enc) 1809 1805 goto free_req; 1810 1806 1807 + if (WARN_ON(vecs->m_size > PAGE_SIZE)) 1808 + goto free_all; 1809 + 1810 + memcpy(xbuf[0], vecs->m, vecs->m_size); 1811 + 1811 1812 sg_init_table(src_tab, 2); 1812 - sg_set_buf(&src_tab[0], vecs->m, 8); 1813 - sg_set_buf(&src_tab[1], vecs->m + 8, vecs->m_size - 8); 1813 + sg_set_buf(&src_tab[0], xbuf[0], 8); 1814 + sg_set_buf(&src_tab[1], xbuf[0] + 8, vecs->m_size - 8); 1814 1815 sg_init_one(&dst, outbuf_enc, out_len_max); 1815 1816 akcipher_request_set_crypt(req, src_tab, &dst, vecs->m_size, 1816 1817 out_len_max); ··· 1834 1825 goto free_all; 1835 1826 } 1836 1827 /* verify that encrypted message is equal to expected */ 1837 - if (memcmp(vecs->c, sg_virt(req->dst), vecs->c_size)) { 1828 + if (memcmp(vecs->c, outbuf_enc, vecs->c_size)) { 1838 1829 pr_err("alg: rsa: encrypt test failed. Invalid output\n"); 1839 1830 err = -EINVAL; 1840 1831 goto free_all; ··· 1849 1840 err = -ENOMEM; 1850 1841 goto free_all; 1851 1842 } 1852 - sg_init_one(&src, vecs->c, vecs->c_size); 1843 + 1844 + if (WARN_ON(vecs->c_size > PAGE_SIZE)) 1845 + goto free_all; 1846 + 1847 + memcpy(xbuf[0], vecs->c, vecs->c_size); 1848 + 1849 + sg_init_one(&src, xbuf[0], vecs->c_size); 1853 1850 sg_init_one(&dst, outbuf_dec, out_len_max); 1854 1851 init_completion(&result.completion); 1855 1852 akcipher_request_set_crypt(req, &src, &dst, vecs->c_size, out_len_max); ··· 1882 1867 kfree(outbuf_enc); 1883 1868 free_req: 1884 1869 akcipher_request_free(req); 1870 + free_xbuf: 1871 + testmgr_free_buf(xbuf); 1885 1872 return err; 1886 1873 } 1887 1874