src: free memory before re-setting URLHost value

Fixes: https://github.com/nodejs/node/issues/18302

PR-URL: https://github.com/nodejs/node/pull/18357
Reviewed-By: Tiancheng "Timothy" Gu <timothygu99@gmail.com>
Reviewed-By: Anatoli Papirovski <apapirovski@mac.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: Tobias Nießen <tniessen@tnie.de>
pull/17054/merge
Ivan Filenko 2018-01-24 01:42:40 +03:00 committed by Ruben Bridgewater
parent ccf64e5f22
commit 36fd25fa05
No known key found for this signature in database
GPG Key ID: F07496B3EB3C1762
1 changed files with 13 additions and 6 deletions

View File

@ -92,6 +92,16 @@ class URLHost {
Value value_;
HostType type_ = HostType::H_FAILED;
inline void Reset() {
using string = std::string;
switch (type_) {
case HostType::H_DOMAIN: value_.domain.~string(); break;
case HostType::H_OPAQUE: value_.opaque.~string(); break;
default: break;
}
type_ = HostType::H_FAILED;
}
// Setting the string members of the union with = is brittle because
// it relies on them being initialized to a state that requires no
// destruction of old data.
@ -101,23 +111,20 @@ class URLHost {
// These helpers are the easiest solution but we might want to consider
// just not forcing strings into an union.
inline void SetOpaque(std::string&& string) {
Reset();
type_ = HostType::H_OPAQUE;
new(&value_.opaque) std::string(std::move(string));
}
inline void SetDomain(std::string&& string) {
Reset();
type_ = HostType::H_DOMAIN;
new(&value_.domain) std::string(std::move(string));
}
};
URLHost::~URLHost() {
using string = std::string;
switch (type_) {
case HostType::H_DOMAIN: value_.domain.~string(); break;
case HostType::H_OPAQUE: value_.opaque.~string(); break;
default: break;
}
Reset();
}
#define ARGS(XX) \