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