diff options
| author | miod <> | 2014-05-15 21:07:10 +0000 |
|---|---|---|
| committer | miod <> | 2014-05-15 21:07:10 +0000 |
| commit | 446a5507054fd1f8200498a3795f2d9a37fb8f34 (patch) | |
| tree | 9fcab74eb7b14bf3b8728465d8f8ef2f7589164c /src/lib/libc | |
| parent | f5a495c15695b031f1a31b854e8a388610bd925b (diff) | |
| download | openbsd-446a5507054fd1f8200498a3795f2d9a37fb8f34.tar.gz openbsd-446a5507054fd1f8200498a3795f2d9a37fb8f34.tar.bz2 openbsd-446a5507054fd1f8200498a3795f2d9a37fb8f34.zip | |
Fix memory leaks upon failure.
ok beck@
Diffstat (limited to '')
| -rw-r--r-- | src/lib/libcrypto/asn1/asn_mime.c | 42 | ||||
| -rw-r--r-- | src/lib/libcrypto/asn1/asn_pack.c | 24 |
2 files changed, 39 insertions, 27 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 */ |
