diff options
Diffstat (limited to 'fs/cifs')
-rw-r--r-- | fs/cifs/connect.c | 88 |
1 files changed, 30 insertions, 58 deletions
diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c index 26e1087e081f..58c509e6ac6a 100644 --- a/fs/cifs/connect.c +++ b/fs/cifs/connect.c | |||
@@ -1781,11 +1781,8 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb, | |||
1781 | 1781 | ||
1782 | memset(&volume_info, 0, sizeof(struct smb_vol)); | 1782 | memset(&volume_info, 0, sizeof(struct smb_vol)); |
1783 | if (cifs_parse_mount_options(mount_data, devname, &volume_info)) { | 1783 | if (cifs_parse_mount_options(mount_data, devname, &volume_info)) { |
1784 | kfree(volume_info.UNC); | 1784 | rc = -EINVAL; |
1785 | kfree(volume_info.password); | 1785 | goto out; |
1786 | kfree(volume_info.prepath); | ||
1787 | FreeXid(xid); | ||
1788 | return -EINVAL; | ||
1789 | } | 1786 | } |
1790 | 1787 | ||
1791 | if (volume_info.nullauth) { | 1788 | if (volume_info.nullauth) { |
@@ -1798,11 +1795,8 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb, | |||
1798 | cifserror("No username specified"); | 1795 | cifserror("No username specified"); |
1799 | /* In userspace mount helper we can get user name from alternate | 1796 | /* In userspace mount helper we can get user name from alternate |
1800 | locations such as env variables and files on disk */ | 1797 | locations such as env variables and files on disk */ |
1801 | kfree(volume_info.UNC); | 1798 | rc = -EINVAL; |
1802 | kfree(volume_info.password); | 1799 | goto out; |
1803 | kfree(volume_info.prepath); | ||
1804 | FreeXid(xid); | ||
1805 | return -EINVAL; | ||
1806 | } | 1800 | } |
1807 | 1801 | ||
1808 | if (volume_info.UNCip && volume_info.UNC) { | 1802 | if (volume_info.UNCip && volume_info.UNC) { |
@@ -1821,11 +1815,8 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb, | |||
1821 | 1815 | ||
1822 | if (rc <= 0) { | 1816 | if (rc <= 0) { |
1823 | /* we failed translating address */ | 1817 | /* we failed translating address */ |
1824 | kfree(volume_info.UNC); | 1818 | rc = -EINVAL; |
1825 | kfree(volume_info.password); | 1819 | goto out; |
1826 | kfree(volume_info.prepath); | ||
1827 | FreeXid(xid); | ||
1828 | return -EINVAL; | ||
1829 | } | 1820 | } |
1830 | 1821 | ||
1831 | cFYI(1, ("UNC: %s ip: %s", volume_info.UNC, volume_info.UNCip)); | 1822 | cFYI(1, ("UNC: %s ip: %s", volume_info.UNC, volume_info.UNCip)); |
@@ -1835,20 +1826,14 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb, | |||
1835 | /* BB using ip addr as server name to connect to the | 1826 | /* BB using ip addr as server name to connect to the |
1836 | DFS root below */ | 1827 | DFS root below */ |
1837 | cERROR(1, ("Connecting to DFS root not implemented yet")); | 1828 | cERROR(1, ("Connecting to DFS root not implemented yet")); |
1838 | kfree(volume_info.UNC); | 1829 | rc = -EINVAL; |
1839 | kfree(volume_info.password); | 1830 | goto out; |
1840 | kfree(volume_info.prepath); | ||
1841 | FreeXid(xid); | ||
1842 | return -EINVAL; | ||
1843 | } else /* which servers DFS root would we conect to */ { | 1831 | } else /* which servers DFS root would we conect to */ { |
1844 | cERROR(1, | 1832 | cERROR(1, |
1845 | ("CIFS mount error: No UNC path (e.g. -o " | 1833 | ("CIFS mount error: No UNC path (e.g. -o " |
1846 | "unc=//192.168.1.100/public) specified")); | 1834 | "unc=//192.168.1.100/public) specified")); |
1847 | kfree(volume_info.UNC); | 1835 | rc = -EINVAL; |
1848 | kfree(volume_info.password); | 1836 | goto out; |
1849 | kfree(volume_info.prepath); | ||
1850 | FreeXid(xid); | ||
1851 | return -EINVAL; | ||
1852 | } | 1837 | } |
1853 | 1838 | ||
1854 | /* this is needed for ASCII cp to Unicode converts */ | 1839 | /* this is needed for ASCII cp to Unicode converts */ |
@@ -1860,11 +1845,8 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb, | |||
1860 | if (cifs_sb->local_nls == NULL) { | 1845 | if (cifs_sb->local_nls == NULL) { |
1861 | cERROR(1, ("CIFS mount error: iocharset %s not found", | 1846 | cERROR(1, ("CIFS mount error: iocharset %s not found", |
1862 | volume_info.iocharset)); | 1847 | volume_info.iocharset)); |
1863 | kfree(volume_info.UNC); | 1848 | rc = -ELIBACC; |
1864 | kfree(volume_info.password); | 1849 | goto out; |
1865 | kfree(volume_info.prepath); | ||
1866 | FreeXid(xid); | ||
1867 | return -ELIBACC; | ||
1868 | } | 1850 | } |
1869 | } | 1851 | } |
1870 | 1852 | ||
@@ -1878,11 +1860,8 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb, | |||
1878 | &sin_server6.sin6_addr, | 1860 | &sin_server6.sin6_addr, |
1879 | volume_info.username, &srvTcp); | 1861 | volume_info.username, &srvTcp); |
1880 | } else { | 1862 | } else { |
1881 | kfree(volume_info.UNC); | 1863 | rc = -EINVAL; |
1882 | kfree(volume_info.password); | 1864 | goto out; |
1883 | kfree(volume_info.prepath); | ||
1884 | FreeXid(xid); | ||
1885 | return -EINVAL; | ||
1886 | } | 1865 | } |
1887 | 1866 | ||
1888 | if (srvTcp) { | 1867 | if (srvTcp) { |
@@ -1906,22 +1885,14 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb, | |||
1906 | "Aborting operation")); | 1885 | "Aborting operation")); |
1907 | if (csocket != NULL) | 1886 | if (csocket != NULL) |
1908 | sock_release(csocket); | 1887 | sock_release(csocket); |
1909 | kfree(volume_info.UNC); | 1888 | goto out; |
1910 | kfree(volume_info.password); | ||
1911 | kfree(volume_info.prepath); | ||
1912 | FreeXid(xid); | ||
1913 | return rc; | ||
1914 | } | 1889 | } |
1915 | 1890 | ||
1916 | srvTcp = kzalloc(sizeof(struct TCP_Server_Info), GFP_KERNEL); | 1891 | srvTcp = kzalloc(sizeof(struct TCP_Server_Info), GFP_KERNEL); |
1917 | if (!srvTcp) { | 1892 | if (!srvTcp) { |
1918 | rc = -ENOMEM; | 1893 | rc = -ENOMEM; |
1919 | sock_release(csocket); | 1894 | sock_release(csocket); |
1920 | kfree(volume_info.UNC); | 1895 | goto out; |
1921 | kfree(volume_info.password); | ||
1922 | kfree(volume_info.prepath); | ||
1923 | FreeXid(xid); | ||
1924 | return rc; | ||
1925 | } else { | 1896 | } else { |
1926 | memcpy(&srvTcp->addr.sockAddr, &sin_server, | 1897 | memcpy(&srvTcp->addr.sockAddr, &sin_server, |
1927 | sizeof(struct sockaddr_in)); | 1898 | sizeof(struct sockaddr_in)); |
@@ -1943,11 +1914,7 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb, | |||
1943 | cERROR(1, ("error %d create cifsd thread", rc)); | 1914 | cERROR(1, ("error %d create cifsd thread", rc)); |
1944 | srvTcp->tsk = NULL; | 1915 | srvTcp->tsk = NULL; |
1945 | sock_release(csocket); | 1916 | sock_release(csocket); |
1946 | kfree(volume_info.UNC); | 1917 | goto out; |
1947 | kfree(volume_info.password); | ||
1948 | kfree(volume_info.prepath); | ||
1949 | FreeXid(xid); | ||
1950 | return rc; | ||
1951 | } | 1918 | } |
1952 | wait_for_completion(&cifsd_complete); | 1919 | wait_for_completion(&cifsd_complete); |
1953 | rc = 0; | 1920 | rc = 0; |
@@ -1962,8 +1929,6 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb, | |||
1962 | if (existingCifsSes) { | 1929 | if (existingCifsSes) { |
1963 | pSesInfo = existingCifsSes; | 1930 | pSesInfo = existingCifsSes; |
1964 | cFYI(1, ("Existing smb sess found")); | 1931 | cFYI(1, ("Existing smb sess found")); |
1965 | kfree(volume_info.password); | ||
1966 | /* volume_info.UNC freed at end of function */ | ||
1967 | } else if (!rc) { | 1932 | } else if (!rc) { |
1968 | cFYI(1, ("Existing smb sess not found")); | 1933 | cFYI(1, ("Existing smb sess not found")); |
1969 | pSesInfo = sesInfoAlloc(); | 1934 | pSesInfo = sesInfoAlloc(); |
@@ -1977,8 +1942,11 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb, | |||
1977 | 1942 | ||
1978 | if (!rc) { | 1943 | if (!rc) { |
1979 | /* volume_info.password freed at unmount */ | 1944 | /* volume_info.password freed at unmount */ |
1980 | if (volume_info.password) | 1945 | if (volume_info.password) { |
1981 | pSesInfo->password = volume_info.password; | 1946 | pSesInfo->password = volume_info.password; |
1947 | /* set to NULL to prevent freeing on exit */ | ||
1948 | volume_info.password = NULL; | ||
1949 | } | ||
1982 | if (volume_info.username) | 1950 | if (volume_info.username) |
1983 | strncpy(pSesInfo->userName, | 1951 | strncpy(pSesInfo->userName, |
1984 | volume_info.username, | 1952 | volume_info.username, |
@@ -2000,8 +1968,7 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb, | |||
2000 | up(&pSesInfo->sesSem); | 1968 | up(&pSesInfo->sesSem); |
2001 | if (!rc) | 1969 | if (!rc) |
2002 | atomic_inc(&srvTcp->socketUseCount); | 1970 | atomic_inc(&srvTcp->socketUseCount); |
2003 | } else | 1971 | } |
2004 | kfree(volume_info.password); | ||
2005 | } | 1972 | } |
2006 | 1973 | ||
2007 | /* search for existing tcon to this server share */ | 1974 | /* search for existing tcon to this server share */ |
@@ -2106,9 +2073,8 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb, | |||
2106 | "", cifs_sb->local_nls, | 2073 | "", cifs_sb->local_nls, |
2107 | cifs_sb->mnt_cifs_flags & | 2074 | cifs_sb->mnt_cifs_flags & |
2108 | CIFS_MOUNT_MAP_SPECIAL_CHR); | 2075 | CIFS_MOUNT_MAP_SPECIAL_CHR); |
2109 | kfree(volume_info.UNC); | 2076 | rc = -ENODEV; |
2110 | FreeXid(xid); | 2077 | goto out; |
2111 | return -ENODEV; | ||
2112 | } else { | 2078 | } else { |
2113 | /* BB Do we need to wrap sesSem around | 2079 | /* BB Do we need to wrap sesSem around |
2114 | * this TCon call and Unix SetFS as | 2080 | * this TCon call and Unix SetFS as |
@@ -2231,6 +2197,12 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb, | |||
2231 | (in which case it is not needed anymore) but when new sesion is created | 2197 | (in which case it is not needed anymore) but when new sesion is created |
2232 | the password ptr is put in the new session structure (in which case the | 2198 | the password ptr is put in the new session structure (in which case the |
2233 | password will be freed at unmount time) */ | 2199 | password will be freed at unmount time) */ |
2200 | out: | ||
2201 | /* zero out password before freeing */ | ||
2202 | if (volume_info.password != NULL) { | ||
2203 | memset(volume_info.password, 0, strlen(volume_info.password)); | ||
2204 | kfree(volume_info.password); | ||
2205 | } | ||
2234 | kfree(volume_info.UNC); | 2206 | kfree(volume_info.UNC); |
2235 | kfree(volume_info.prepath); | 2207 | kfree(volume_info.prepath); |
2236 | FreeXid(xid); | 2208 | FreeXid(xid); |