diff options
author | miod <> | 2014-05-15 21:07:10 +0000 |
---|---|---|
committer | miod <> | 2014-05-15 21:07:10 +0000 |
commit | 2e447a2a0b77b6aa9627ba1c455ce9c3b4c8ace7 (patch) | |
tree | 9fcab74eb7b14bf3b8728465d8f8ef2f7589164c /src | |
parent | ce07241b92b5b1b9d60acb439c3d18e00a563d55 (diff) | |
download | openbsd-2e447a2a0b77b6aa9627ba1c455ce9c3b4c8ace7.tar.gz openbsd-2e447a2a0b77b6aa9627ba1c455ce9c3b4c8ace7.tar.bz2 openbsd-2e447a2a0b77b6aa9627ba1c455ce9c3b4c8ace7.zip |
Fix memory leaks upon failure.
ok beck@
Diffstat (limited to 'src')
-rw-r--r-- | src/lib/libcrypto/asn1/asn_mime.c | 42 | ||||
-rw-r--r-- | src/lib/libcrypto/asn1/asn_pack.c | 24 | ||||
-rw-r--r-- | src/lib/libssl/src/crypto/asn1/asn_mime.c | 42 | ||||
-rw-r--r-- | src/lib/libssl/src/crypto/asn1/asn_pack.c | 24 |
4 files changed, 78 insertions, 54 deletions
diff --git a/src/lib/libcrypto/asn1/asn_mime.c b/src/lib/libcrypto/asn1/asn_mime.c index b30c366561..6ea47dacf8 100644 --- a/src/lib/libcrypto/asn1/asn_mime.c +++ b/src/lib/libcrypto/asn1/asn_mime.c | |||
@@ -825,11 +825,12 @@ static MIME_HEADER * | |||
825 | mime_hdr_new(char *name, char *value) | 825 | mime_hdr_new(char *name, char *value) |
826 | { | 826 | { |
827 | MIME_HEADER *mhdr; | 827 | MIME_HEADER *mhdr; |
828 | char *tmpname, *tmpval, *p; | 828 | char *tmpname = NULL, *tmpval = NULL, *p; |
829 | int c; | 829 | int c; |
830 | |||
830 | if (name) { | 831 | if (name) { |
831 | if (!(tmpname = BUF_strdup(name))) | 832 | if (!(tmpname = BUF_strdup(name))) |
832 | return NULL; | 833 | goto err; |
833 | for (p = tmpname; *p; p++) { | 834 | for (p = tmpname; *p; p++) { |
834 | c = (unsigned char)*p; | 835 | c = (unsigned char)*p; |
835 | if (isupper(c)) { | 836 | if (isupper(c)) { |
@@ -837,11 +838,10 @@ mime_hdr_new(char *name, char *value) | |||
837 | *p = c; | 838 | *p = c; |
838 | } | 839 | } |
839 | } | 840 | } |
840 | } else | 841 | } |
841 | tmpname = NULL; | ||
842 | if (value) { | 842 | if (value) { |
843 | if (!(tmpval = BUF_strdup(value))) | 843 | if (!(tmpval = BUF_strdup(value))) |
844 | return NULL; | 844 | goto err; |
845 | for (p = tmpval; *p; p++) { | 845 | for (p = tmpval; *p; p++) { |
846 | c = (unsigned char)*p; | 846 | c = (unsigned char)*p; |
847 | if (isupper(c)) { | 847 | if (isupper(c)) { |
@@ -849,32 +849,34 @@ mime_hdr_new(char *name, char *value) | |||
849 | *p = c; | 849 | *p = c; |
850 | } | 850 | } |
851 | } | 851 | } |
852 | } else tmpval = NULL; | ||
853 | mhdr = malloc(sizeof(MIME_HEADER)); | ||
854 | if (!mhdr) { | ||
855 | OPENSSL_free(tmpname); | ||
856 | return NULL; | ||
857 | } | 852 | } |
853 | mhdr = malloc(sizeof(MIME_HEADER)); | ||
854 | if (!mhdr) | ||
855 | goto err; | ||
858 | mhdr->name = tmpname; | 856 | mhdr->name = tmpname; |
859 | mhdr->value = tmpval; | 857 | mhdr->value = tmpval; |
860 | if (!(mhdr->params = sk_MIME_PARAM_new(mime_param_cmp))) { | 858 | if (!(mhdr->params = sk_MIME_PARAM_new(mime_param_cmp))) { |
861 | free(mhdr); | 859 | free(mhdr); |
862 | return NULL; | 860 | goto err; |
863 | } | 861 | } |
864 | return mhdr; | 862 | return mhdr; |
863 | err: | ||
864 | free(tmpname); | ||
865 | free(tmpval); | ||
866 | return NULL; | ||
865 | } | 867 | } |
866 | 868 | ||
867 | static int | 869 | static int |
868 | mime_hdr_addparam(MIME_HEADER *mhdr, char *name, char *value) | 870 | mime_hdr_addparam(MIME_HEADER *mhdr, char *name, char *value) |
869 | { | 871 | { |
870 | char *tmpname, *tmpval, *p; | 872 | char *tmpname = NULL, *tmpval = NULL, *p; |
871 | int c; | 873 | int c; |
872 | MIME_PARAM *mparam; | 874 | MIME_PARAM *mparam; |
873 | 875 | ||
874 | if (name) { | 876 | if (name) { |
875 | tmpname = BUF_strdup(name); | 877 | tmpname = BUF_strdup(name); |
876 | if (!tmpname) | 878 | if (!tmpname) |
877 | return 0; | 879 | goto err; |
878 | for (p = tmpname; *p; p++) { | 880 | for (p = tmpname; *p; p++) { |
879 | c = (unsigned char)*p; | 881 | c = (unsigned char)*p; |
880 | if (isupper(c)) { | 882 | if (isupper(c)) { |
@@ -882,22 +884,24 @@ mime_hdr_addparam(MIME_HEADER *mhdr, char *name, char *value) | |||
882 | *p = c; | 884 | *p = c; |
883 | } | 885 | } |
884 | } | 886 | } |
885 | } else | 887 | } |
886 | tmpname = NULL; | ||
887 | if (value) { | 888 | if (value) { |
888 | tmpval = BUF_strdup(value); | 889 | tmpval = BUF_strdup(value); |
889 | if (!tmpval) | 890 | if (!tmpval) |
890 | return 0; | 891 | goto err; |
891 | } else | 892 | } |
892 | tmpval = NULL; | ||
893 | /* Parameter values are case sensitive so leave as is */ | 893 | /* Parameter values are case sensitive so leave as is */ |
894 | mparam = malloc(sizeof(MIME_PARAM)); | 894 | mparam = malloc(sizeof(MIME_PARAM)); |
895 | if (!mparam) | 895 | if (!mparam) |
896 | return 0; | 896 | goto err; |
897 | mparam->param_name = tmpname; | 897 | mparam->param_name = tmpname; |
898 | mparam->param_value = tmpval; | 898 | mparam->param_value = tmpval; |
899 | sk_MIME_PARAM_push(mhdr->params, mparam); | 899 | sk_MIME_PARAM_push(mhdr->params, mparam); |
900 | return 1; | 900 | return 1; |
901 | err: | ||
902 | free(tmpname); | ||
903 | free(tmpval); | ||
904 | return 0; | ||
901 | } | 905 | } |
902 | 906 | ||
903 | static int | 907 | static int |
diff --git a/src/lib/libcrypto/asn1/asn_pack.c b/src/lib/libcrypto/asn1/asn_pack.c index 8eb39e6a9b..7f46e1100d 100644 --- a/src/lib/libcrypto/asn1/asn_pack.c +++ b/src/lib/libcrypto/asn1/asn_pack.c | |||
@@ -137,22 +137,26 @@ ASN1_pack_string(void *obj, i2d_of_void *i2d, ASN1_STRING **oct) | |||
137 | ASN1err(ASN1_F_ASN1_PACK_STRING,ERR_R_MALLOC_FAILURE); | 137 | ASN1err(ASN1_F_ASN1_PACK_STRING,ERR_R_MALLOC_FAILURE); |
138 | return NULL; | 138 | return NULL; |
139 | } | 139 | } |
140 | if (oct) | ||
141 | *oct = octmp; | ||
142 | } else | 140 | } else |
143 | octmp = *oct; | 141 | octmp = *oct; |
144 | 142 | ||
145 | if (!(octmp->length = i2d(obj, NULL))) { | 143 | if (!(octmp->length = i2d(obj, NULL))) { |
146 | ASN1err(ASN1_F_ASN1_PACK_STRING,ASN1_R_ENCODE_ERROR); | 144 | ASN1err(ASN1_F_ASN1_PACK_STRING,ASN1_R_ENCODE_ERROR); |
147 | return NULL; | 145 | goto err; |
148 | } | 146 | } |
149 | if (!(p = malloc (octmp->length))) { | 147 | if (!(p = malloc (octmp->length))) { |
150 | ASN1err(ASN1_F_ASN1_PACK_STRING,ERR_R_MALLOC_FAILURE); | 148 | ASN1err(ASN1_F_ASN1_PACK_STRING,ERR_R_MALLOC_FAILURE); |
151 | return NULL; | 149 | goto err; |
152 | } | 150 | } |
153 | octmp->data = p; | 151 | octmp->data = p; |
154 | i2d (obj, &p); | 152 | i2d (obj, &p); |
153 | if (oct) | ||
154 | *oct = octmp; | ||
155 | return octmp; | 155 | return octmp; |
156 | err: | ||
157 | if (!oct || octmp != *oct) | ||
158 | ASN1_STRING_free(octmp); | ||
159 | return NULL; | ||
156 | } | 160 | } |
157 | 161 | ||
158 | #endif | 162 | #endif |
@@ -169,8 +173,6 @@ ASN1_item_pack(void *obj, const ASN1_ITEM *it, ASN1_STRING **oct) | |||
169 | ASN1err(ASN1_F_ASN1_ITEM_PACK, ERR_R_MALLOC_FAILURE); | 173 | ASN1err(ASN1_F_ASN1_ITEM_PACK, ERR_R_MALLOC_FAILURE); |
170 | return NULL; | 174 | return NULL; |
171 | } | 175 | } |
172 | if (oct) | ||
173 | *oct = octmp; | ||
174 | } else | 176 | } else |
175 | octmp = *oct; | 177 | octmp = *oct; |
176 | 178 | ||
@@ -181,13 +183,19 @@ ASN1_item_pack(void *obj, const ASN1_ITEM *it, ASN1_STRING **oct) | |||
181 | 183 | ||
182 | if (!(octmp->length = ASN1_item_i2d(obj, &octmp->data, it))) { | 184 | if (!(octmp->length = ASN1_item_i2d(obj, &octmp->data, it))) { |
183 | ASN1err(ASN1_F_ASN1_ITEM_PACK, ASN1_R_ENCODE_ERROR); | 185 | ASN1err(ASN1_F_ASN1_ITEM_PACK, ASN1_R_ENCODE_ERROR); |
184 | return NULL; | 186 | goto err; |
185 | } | 187 | } |
186 | if (!octmp->data) { | 188 | if (!octmp->data) { |
187 | ASN1err(ASN1_F_ASN1_ITEM_PACK, ERR_R_MALLOC_FAILURE); | 189 | ASN1err(ASN1_F_ASN1_ITEM_PACK, ERR_R_MALLOC_FAILURE); |
188 | return NULL; | 190 | goto err; |
189 | } | 191 | } |
192 | if (oct) | ||
193 | *oct = octmp; | ||
190 | return octmp; | 194 | return octmp; |
195 | err: | ||
196 | if (!oct || octmp != *oct) | ||
197 | ASN1_STRING_free(octmp); | ||
198 | return NULL; | ||
191 | } | 199 | } |
192 | 200 | ||
193 | /* Extract an ASN1 object from an ASN1_STRING */ | 201 | /* Extract an ASN1 object from an ASN1_STRING */ |
diff --git a/src/lib/libssl/src/crypto/asn1/asn_mime.c b/src/lib/libssl/src/crypto/asn1/asn_mime.c index b30c366561..6ea47dacf8 100644 --- a/src/lib/libssl/src/crypto/asn1/asn_mime.c +++ b/src/lib/libssl/src/crypto/asn1/asn_mime.c | |||
@@ -825,11 +825,12 @@ static MIME_HEADER * | |||
825 | mime_hdr_new(char *name, char *value) | 825 | mime_hdr_new(char *name, char *value) |
826 | { | 826 | { |
827 | MIME_HEADER *mhdr; | 827 | MIME_HEADER *mhdr; |
828 | char *tmpname, *tmpval, *p; | 828 | char *tmpname = NULL, *tmpval = NULL, *p; |
829 | int c; | 829 | int c; |
830 | |||
830 | if (name) { | 831 | if (name) { |
831 | if (!(tmpname = BUF_strdup(name))) | 832 | if (!(tmpname = BUF_strdup(name))) |
832 | return NULL; | 833 | goto err; |
833 | for (p = tmpname; *p; p++) { | 834 | for (p = tmpname; *p; p++) { |
834 | c = (unsigned char)*p; | 835 | c = (unsigned char)*p; |
835 | if (isupper(c)) { | 836 | if (isupper(c)) { |
@@ -837,11 +838,10 @@ mime_hdr_new(char *name, char *value) | |||
837 | *p = c; | 838 | *p = c; |
838 | } | 839 | } |
839 | } | 840 | } |
840 | } else | 841 | } |
841 | tmpname = NULL; | ||
842 | if (value) { | 842 | if (value) { |
843 | if (!(tmpval = BUF_strdup(value))) | 843 | if (!(tmpval = BUF_strdup(value))) |
844 | return NULL; | 844 | goto err; |
845 | for (p = tmpval; *p; p++) { | 845 | for (p = tmpval; *p; p++) { |
846 | c = (unsigned char)*p; | 846 | c = (unsigned char)*p; |
847 | if (isupper(c)) { | 847 | if (isupper(c)) { |
@@ -849,32 +849,34 @@ mime_hdr_new(char *name, char *value) | |||
849 | *p = c; | 849 | *p = c; |
850 | } | 850 | } |
851 | } | 851 | } |
852 | } else tmpval = NULL; | ||
853 | mhdr = malloc(sizeof(MIME_HEADER)); | ||
854 | if (!mhdr) { | ||
855 | OPENSSL_free(tmpname); | ||
856 | return NULL; | ||
857 | } | 852 | } |
853 | mhdr = malloc(sizeof(MIME_HEADER)); | ||
854 | if (!mhdr) | ||
855 | goto err; | ||
858 | mhdr->name = tmpname; | 856 | mhdr->name = tmpname; |
859 | mhdr->value = tmpval; | 857 | mhdr->value = tmpval; |
860 | if (!(mhdr->params = sk_MIME_PARAM_new(mime_param_cmp))) { | 858 | if (!(mhdr->params = sk_MIME_PARAM_new(mime_param_cmp))) { |
861 | free(mhdr); | 859 | free(mhdr); |
862 | return NULL; | 860 | goto err; |
863 | } | 861 | } |
864 | return mhdr; | 862 | return mhdr; |
863 | err: | ||
864 | free(tmpname); | ||
865 | free(tmpval); | ||
866 | return NULL; | ||
865 | } | 867 | } |
866 | 868 | ||
867 | static int | 869 | static int |
868 | mime_hdr_addparam(MIME_HEADER *mhdr, char *name, char *value) | 870 | mime_hdr_addparam(MIME_HEADER *mhdr, char *name, char *value) |
869 | { | 871 | { |
870 | char *tmpname, *tmpval, *p; | 872 | char *tmpname = NULL, *tmpval = NULL, *p; |
871 | int c; | 873 | int c; |
872 | MIME_PARAM *mparam; | 874 | MIME_PARAM *mparam; |
873 | 875 | ||
874 | if (name) { | 876 | if (name) { |
875 | tmpname = BUF_strdup(name); | 877 | tmpname = BUF_strdup(name); |
876 | if (!tmpname) | 878 | if (!tmpname) |
877 | return 0; | 879 | goto err; |
878 | for (p = tmpname; *p; p++) { | 880 | for (p = tmpname; *p; p++) { |
879 | c = (unsigned char)*p; | 881 | c = (unsigned char)*p; |
880 | if (isupper(c)) { | 882 | if (isupper(c)) { |
@@ -882,22 +884,24 @@ mime_hdr_addparam(MIME_HEADER *mhdr, char *name, char *value) | |||
882 | *p = c; | 884 | *p = c; |
883 | } | 885 | } |
884 | } | 886 | } |
885 | } else | 887 | } |
886 | tmpname = NULL; | ||
887 | if (value) { | 888 | if (value) { |
888 | tmpval = BUF_strdup(value); | 889 | tmpval = BUF_strdup(value); |
889 | if (!tmpval) | 890 | if (!tmpval) |
890 | return 0; | 891 | goto err; |
891 | } else | 892 | } |
892 | tmpval = NULL; | ||
893 | /* Parameter values are case sensitive so leave as is */ | 893 | /* Parameter values are case sensitive so leave as is */ |
894 | mparam = malloc(sizeof(MIME_PARAM)); | 894 | mparam = malloc(sizeof(MIME_PARAM)); |
895 | if (!mparam) | 895 | if (!mparam) |
896 | return 0; | 896 | goto err; |
897 | mparam->param_name = tmpname; | 897 | mparam->param_name = tmpname; |
898 | mparam->param_value = tmpval; | 898 | mparam->param_value = tmpval; |
899 | sk_MIME_PARAM_push(mhdr->params, mparam); | 899 | sk_MIME_PARAM_push(mhdr->params, mparam); |
900 | return 1; | 900 | return 1; |
901 | err: | ||
902 | free(tmpname); | ||
903 | free(tmpval); | ||
904 | return 0; | ||
901 | } | 905 | } |
902 | 906 | ||
903 | static int | 907 | static int |
diff --git a/src/lib/libssl/src/crypto/asn1/asn_pack.c b/src/lib/libssl/src/crypto/asn1/asn_pack.c index 8eb39e6a9b..7f46e1100d 100644 --- a/src/lib/libssl/src/crypto/asn1/asn_pack.c +++ b/src/lib/libssl/src/crypto/asn1/asn_pack.c | |||
@@ -137,22 +137,26 @@ ASN1_pack_string(void *obj, i2d_of_void *i2d, ASN1_STRING **oct) | |||
137 | ASN1err(ASN1_F_ASN1_PACK_STRING,ERR_R_MALLOC_FAILURE); | 137 | ASN1err(ASN1_F_ASN1_PACK_STRING,ERR_R_MALLOC_FAILURE); |
138 | return NULL; | 138 | return NULL; |
139 | } | 139 | } |
140 | if (oct) | ||
141 | *oct = octmp; | ||
142 | } else | 140 | } else |
143 | octmp = *oct; | 141 | octmp = *oct; |
144 | 142 | ||
145 | if (!(octmp->length = i2d(obj, NULL))) { | 143 | if (!(octmp->length = i2d(obj, NULL))) { |
146 | ASN1err(ASN1_F_ASN1_PACK_STRING,ASN1_R_ENCODE_ERROR); | 144 | ASN1err(ASN1_F_ASN1_PACK_STRING,ASN1_R_ENCODE_ERROR); |
147 | return NULL; | 145 | goto err; |
148 | } | 146 | } |
149 | if (!(p = malloc (octmp->length))) { | 147 | if (!(p = malloc (octmp->length))) { |
150 | ASN1err(ASN1_F_ASN1_PACK_STRING,ERR_R_MALLOC_FAILURE); | 148 | ASN1err(ASN1_F_ASN1_PACK_STRING,ERR_R_MALLOC_FAILURE); |
151 | return NULL; | 149 | goto err; |
152 | } | 150 | } |
153 | octmp->data = p; | 151 | octmp->data = p; |
154 | i2d (obj, &p); | 152 | i2d (obj, &p); |
153 | if (oct) | ||
154 | *oct = octmp; | ||
155 | return octmp; | 155 | return octmp; |
156 | err: | ||
157 | if (!oct || octmp != *oct) | ||
158 | ASN1_STRING_free(octmp); | ||
159 | return NULL; | ||
156 | } | 160 | } |
157 | 161 | ||
158 | #endif | 162 | #endif |
@@ -169,8 +173,6 @@ ASN1_item_pack(void *obj, const ASN1_ITEM *it, ASN1_STRING **oct) | |||
169 | ASN1err(ASN1_F_ASN1_ITEM_PACK, ERR_R_MALLOC_FAILURE); | 173 | ASN1err(ASN1_F_ASN1_ITEM_PACK, ERR_R_MALLOC_FAILURE); |
170 | return NULL; | 174 | return NULL; |
171 | } | 175 | } |
172 | if (oct) | ||
173 | *oct = octmp; | ||
174 | } else | 176 | } else |
175 | octmp = *oct; | 177 | octmp = *oct; |
176 | 178 | ||
@@ -181,13 +183,19 @@ ASN1_item_pack(void *obj, const ASN1_ITEM *it, ASN1_STRING **oct) | |||
181 | 183 | ||
182 | if (!(octmp->length = ASN1_item_i2d(obj, &octmp->data, it))) { | 184 | if (!(octmp->length = ASN1_item_i2d(obj, &octmp->data, it))) { |
183 | ASN1err(ASN1_F_ASN1_ITEM_PACK, ASN1_R_ENCODE_ERROR); | 185 | ASN1err(ASN1_F_ASN1_ITEM_PACK, ASN1_R_ENCODE_ERROR); |
184 | return NULL; | 186 | goto err; |
185 | } | 187 | } |
186 | if (!octmp->data) { | 188 | if (!octmp->data) { |
187 | ASN1err(ASN1_F_ASN1_ITEM_PACK, ERR_R_MALLOC_FAILURE); | 189 | ASN1err(ASN1_F_ASN1_ITEM_PACK, ERR_R_MALLOC_FAILURE); |
188 | return NULL; | 190 | goto err; |
189 | } | 191 | } |
192 | if (oct) | ||
193 | *oct = octmp; | ||
190 | return octmp; | 194 | return octmp; |
195 | err: | ||
196 | if (!oct || octmp != *oct) | ||
197 | ASN1_STRING_free(octmp); | ||
198 | return NULL; | ||
191 | } | 199 | } |
192 | 200 | ||
193 | /* Extract an ASN1 object from an ASN1_STRING */ | 201 | /* Extract an ASN1 object from an ASN1_STRING */ |