diff options
| -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); |
