diff options
| author | tb <> | 2024-04-09 13:56:00 +0000 |
|---|---|---|
| committer | tb <> | 2024-04-09 13:56:00 +0000 |
| commit | d21f4bb8cfe84425c9438bfc097f2e11185edce3 (patch) | |
| tree | 2598f4b5ffa3bba1453768c32952e6b075054d7b /src | |
| parent | d0fa5fd25f085379a12d27f262978b3251c3dbf1 (diff) | |
| download | openbsd-d21f4bb8cfe84425c9438bfc097f2e11185edce3.tar.gz openbsd-d21f4bb8cfe84425c9438bfc097f2e11185edce3.tar.bz2 openbsd-d21f4bb8cfe84425c9438bfc097f2e11185edce3.zip | |
Plug leaks in ASN1_TIME_set_string_internal()
This API can be called with s == NULL, in which case the tm_to_*()
functions helpfully allocate a new s and then leak. This is a rather
ugly fix to make portable ASAN regress happy again, the better fix
will be to rewrite the tm_to_*() functions and adjust their callers.
That is more intrusive and will be done in a later pass.
ok bcook jsing
Diffstat (limited to 'src')
| -rw-r--r-- | src/lib/libcrypto/asn1/a_time_tm.c | 23 |
1 files changed, 17 insertions, 6 deletions
diff --git a/src/lib/libcrypto/asn1/a_time_tm.c b/src/lib/libcrypto/asn1/a_time_tm.c index c8eabec08f..16b9df2584 100644 --- a/src/lib/libcrypto/asn1/a_time_tm.c +++ b/src/lib/libcrypto/asn1/a_time_tm.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: a_time_tm.c,v 1.34 2024/04/08 19:57:40 beck Exp $ */ | 1 | /* $OpenBSD: a_time_tm.c,v 1.35 2024/04/09 13:56:00 tb Exp $ */ |
| 2 | /* | 2 | /* |
| 3 | * Copyright (c) 2015 Bob Beck <beck@openbsd.org> | 3 | * Copyright (c) 2015 Bob Beck <beck@openbsd.org> |
| 4 | * | 4 | * |
| @@ -344,21 +344,32 @@ ASN1_time_parse(const char *bytes, size_t len, struct tm *tm, int mode) | |||
| 344 | static int | 344 | static int |
| 345 | ASN1_TIME_set_string_internal(ASN1_TIME *s, const char *str, int mode) | 345 | ASN1_TIME_set_string_internal(ASN1_TIME *s, const char *str, int mode) |
| 346 | { | 346 | { |
| 347 | ASN1_TIME *atime = s; | ||
| 347 | struct tm tm; | 348 | struct tm tm; |
| 348 | int type; | 349 | int type; |
| 350 | int ret = 0; | ||
| 349 | 351 | ||
| 350 | if ((type = ASN1_time_parse(str, strlen(str), &tm, mode)) == -1) | 352 | if ((type = ASN1_time_parse(str, strlen(str), &tm, mode)) == -1) |
| 351 | return (0); | 353 | return (0); |
| 352 | switch(mode) { | 354 | switch (mode) { |
| 353 | case V_ASN1_UTCTIME: | 355 | case V_ASN1_UTCTIME: |
| 354 | return (type == mode && tm_to_utctime(&tm, s) != NULL); | 356 | ret = (type == mode && (atime = tm_to_utctime(&tm, s)) != NULL); |
| 357 | break; | ||
| 355 | case V_ASN1_GENERALIZEDTIME: | 358 | case V_ASN1_GENERALIZEDTIME: |
| 356 | return (type == mode && tm_to_gentime(&tm, s) != NULL); | 359 | ret = (type == mode && (atime = tm_to_gentime(&tm, s)) != NULL); |
| 360 | break; | ||
| 357 | case RFC5280: | 361 | case RFC5280: |
| 358 | return (tm_to_rfc5280_time(&tm, s) != NULL); | 362 | ret = ((atime = tm_to_rfc5280_time(&tm, s)) != NULL); |
| 363 | break; | ||
| 359 | default: | 364 | default: |
| 360 | return (0); | 365 | ret = 0; |
| 366 | break; | ||
| 361 | } | 367 | } |
| 368 | |||
| 369 | if (atime != s) | ||
| 370 | ASN1_TIME_free(atime); | ||
| 371 | |||
| 372 | return ret; | ||
| 362 | } | 373 | } |
| 363 | 374 | ||
| 364 | static ASN1_TIME * | 375 | static ASN1_TIME * |
