summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authormiod <>2014-05-15 21:07:10 +0000
committermiod <>2014-05-15 21:07:10 +0000
commit2e447a2a0b77b6aa9627ba1c455ce9c3b4c8ace7 (patch)
tree9fcab74eb7b14bf3b8728465d8f8ef2f7589164c /src
parentce07241b92b5b1b9d60acb439c3d18e00a563d55 (diff)
downloadopenbsd-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.c42
-rw-r--r--src/lib/libcrypto/asn1/asn_pack.c24
-rw-r--r--src/lib/libssl/src/crypto/asn1/asn_mime.c42
-rw-r--r--src/lib/libssl/src/crypto/asn1/asn_pack.c24
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 *
825mime_hdr_new(char *name, char *value) 825mime_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;
863err:
864 free(tmpname);
865 free(tmpval);
866 return NULL;
865} 867}
866 868
867static int 869static int
868mime_hdr_addparam(MIME_HEADER *mhdr, char *name, char *value) 870mime_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;
901err:
902 free(tmpname);
903 free(tmpval);
904 return 0;
901} 905}
902 906
903static int 907static 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;
156err:
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;
195err:
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 *
825mime_hdr_new(char *name, char *value) 825mime_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;
863err:
864 free(tmpname);
865 free(tmpval);
866 return NULL;
865} 867}
866 868
867static int 869static int
868mime_hdr_addparam(MIME_HEADER *mhdr, char *name, char *value) 870mime_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;
901err:
902 free(tmpname);
903 free(tmpval);
904 return 0;
901} 905}
902 906
903static int 907static 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;
156err:
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;
195err:
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 */