diff options
author | Jesper Juhl <jesper.juhl@gmail.com> | 2008-01-20 19:58:04 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-01-20 23:31:42 -0500 |
commit | 61e44b4815063a5cc31242d3669d5f87beeaa45f (patch) | |
tree | 248cfe70b039ca1b8a13865d5992e33b0b0ad1ae /net/irda/af_irda.c | |
parent | cecbb63967b4f36701b9412a12377e8fe006a93b (diff) |
[IrDA]: af_irda memory leak fixes
Here goes an IrDA patch against your latest net-2.6 tree.
This patch fixes some af_irda memory leaks. It also checks for
irias_new_obect() return value.
Signed-off-by: Jesper Juhl <jesper.juhl@gmail.com>
Signed-off-by: Samuel Ortiz <samuel@sortiz.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/irda/af_irda.c')
-rw-r--r-- | net/irda/af_irda.c | 30 |
1 files changed, 27 insertions, 3 deletions
diff --git a/net/irda/af_irda.c b/net/irda/af_irda.c index d5e4dd75200b..07dfa7fdd2a0 100644 --- a/net/irda/af_irda.c +++ b/net/irda/af_irda.c | |||
@@ -802,12 +802,18 @@ static int irda_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) | |||
802 | } | 802 | } |
803 | #endif /* CONFIG_IRDA_ULTRA */ | 803 | #endif /* CONFIG_IRDA_ULTRA */ |
804 | 804 | ||
805 | self->ias_obj = irias_new_object(addr->sir_name, jiffies); | ||
806 | if (self->ias_obj == NULL) | ||
807 | return -ENOMEM; | ||
808 | |||
805 | err = irda_open_tsap(self, addr->sir_lsap_sel, addr->sir_name); | 809 | err = irda_open_tsap(self, addr->sir_lsap_sel, addr->sir_name); |
806 | if (err < 0) | 810 | if (err < 0) { |
811 | kfree(self->ias_obj->name); | ||
812 | kfree(self->ias_obj); | ||
807 | return err; | 813 | return err; |
814 | } | ||
808 | 815 | ||
809 | /* Register with LM-IAS */ | 816 | /* Register with LM-IAS */ |
810 | self->ias_obj = irias_new_object(addr->sir_name, jiffies); | ||
811 | irias_add_integer_attrib(self->ias_obj, "IrDA:TinyTP:LsapSel", | 817 | irias_add_integer_attrib(self->ias_obj, "IrDA:TinyTP:LsapSel", |
812 | self->stsap_sel, IAS_KERNEL_ATTR); | 818 | self->stsap_sel, IAS_KERNEL_ATTR); |
813 | irias_insert_object(self->ias_obj); | 819 | irias_insert_object(self->ias_obj); |
@@ -1825,7 +1831,7 @@ static int irda_setsockopt(struct socket *sock, int level, int optname, | |||
1825 | struct irda_ias_set *ias_opt; | 1831 | struct irda_ias_set *ias_opt; |
1826 | struct ias_object *ias_obj; | 1832 | struct ias_object *ias_obj; |
1827 | struct ias_attrib * ias_attr; /* Attribute in IAS object */ | 1833 | struct ias_attrib * ias_attr; /* Attribute in IAS object */ |
1828 | int opt; | 1834 | int opt, free_ias = 0; |
1829 | 1835 | ||
1830 | IRDA_DEBUG(2, "%s(%p)\n", __FUNCTION__, self); | 1836 | IRDA_DEBUG(2, "%s(%p)\n", __FUNCTION__, self); |
1831 | 1837 | ||
@@ -1881,11 +1887,20 @@ static int irda_setsockopt(struct socket *sock, int level, int optname, | |||
1881 | /* Create a new object */ | 1887 | /* Create a new object */ |
1882 | ias_obj = irias_new_object(ias_opt->irda_class_name, | 1888 | ias_obj = irias_new_object(ias_opt->irda_class_name, |
1883 | jiffies); | 1889 | jiffies); |
1890 | if (ias_obj == NULL) { | ||
1891 | kfree(ias_opt); | ||
1892 | return -ENOMEM; | ||
1893 | } | ||
1894 | free_ias = 1; | ||
1884 | } | 1895 | } |
1885 | 1896 | ||
1886 | /* Do we have the attribute already ? */ | 1897 | /* Do we have the attribute already ? */ |
1887 | if(irias_find_attrib(ias_obj, ias_opt->irda_attrib_name)) { | 1898 | if(irias_find_attrib(ias_obj, ias_opt->irda_attrib_name)) { |
1888 | kfree(ias_opt); | 1899 | kfree(ias_opt); |
1900 | if (free_ias) { | ||
1901 | kfree(ias_obj->name); | ||
1902 | kfree(ias_obj); | ||
1903 | } | ||
1889 | return -EINVAL; | 1904 | return -EINVAL; |
1890 | } | 1905 | } |
1891 | 1906 | ||
@@ -1904,6 +1919,11 @@ static int irda_setsockopt(struct socket *sock, int level, int optname, | |||
1904 | if(ias_opt->attribute.irda_attrib_octet_seq.len > | 1919 | if(ias_opt->attribute.irda_attrib_octet_seq.len > |
1905 | IAS_MAX_OCTET_STRING) { | 1920 | IAS_MAX_OCTET_STRING) { |
1906 | kfree(ias_opt); | 1921 | kfree(ias_opt); |
1922 | if (free_ias) { | ||
1923 | kfree(ias_obj->name); | ||
1924 | kfree(ias_obj); | ||
1925 | } | ||
1926 | |||
1907 | return -EINVAL; | 1927 | return -EINVAL; |
1908 | } | 1928 | } |
1909 | /* Add an octet sequence attribute */ | 1929 | /* Add an octet sequence attribute */ |
@@ -1932,6 +1952,10 @@ static int irda_setsockopt(struct socket *sock, int level, int optname, | |||
1932 | break; | 1952 | break; |
1933 | default : | 1953 | default : |
1934 | kfree(ias_opt); | 1954 | kfree(ias_opt); |
1955 | if (free_ias) { | ||
1956 | kfree(ias_obj->name); | ||
1957 | kfree(ias_obj); | ||
1958 | } | ||
1935 | return -EINVAL; | 1959 | return -EINVAL; |
1936 | } | 1960 | } |
1937 | irias_insert_object(ias_obj); | 1961 | irias_insert_object(ias_obj); |