Skip to content

Commit 1e73b98

Browse files
authored
feat(NODE-5505): add compiler warnings and cast lengths (#158)
1 parent a16a7ee commit 1e73b98

File tree

2 files changed

+34
-4
lines changed

2 files changed

+34
-4
lines changed

binding.gyp

+8-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,14 @@
1515
'cflags!': [ '-fno-exceptions' ],
1616
'cflags_cc!': [ '-fno-exceptions' ],
1717
'msvs_settings': {
18-
'VCCLCompilerTool': { 'ExceptionHandling': 1 },
18+
'VCCLCompilerTool': {
19+
'ExceptionHandling': 1,
20+
'AdditionalOptions': [
21+
'/w34244',
22+
'/w34267',
23+
'/ZH:SHA_256'
24+
]
25+
},
1926
},
2027
'conditions': [
2128
['OS=="mac"', {

src/win32/kerberos_win32.cc

+26-3
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,14 @@ void KerberosClient::UnwrapData(const CallbackInfo& info) {
7878
});
7979
}
8080

81+
static bool isStringTooLong(const std::string& str) {
82+
return str.length() >= ULONG_MAX;
83+
}
84+
85+
static bool isWStringTooLong(const std::wstring& str) {
86+
return str.length() >= ULONG_MAX;
87+
}
88+
8189
void KerberosClient::WrapData(const CallbackInfo& info) {
8290
auto state = this->state();
8391
std::string challenge = info[0].ToString();
@@ -86,9 +94,13 @@ void KerberosClient::WrapData(const CallbackInfo& info) {
8694
std::string user = ToStringWithNonStringAsEmpty(options["user"]);
8795
int protect = 0; // NOTE: this should be an option
8896

97+
if (isStringTooLong(user)) {
98+
throw Error::New(info.Env(), "User name is too long");
99+
}
100+
89101
KerberosWorker::Run(callback, "kerberos:ClientWrap", [=](KerberosWorker::SetOnFinishedHandler onFinished) {
90102
sspi_result result = auth_sspi_client_wrap(
91-
state.get(), (SEC_CHAR*)challenge.c_str(), (SEC_CHAR*)user.c_str(), user.length(), protect);
103+
state.get(), (SEC_CHAR*)challenge.c_str(), (SEC_CHAR*)user.c_str(), (ULONG)user.length(), protect);
92104

93105
return onFinished([=](KerberosWorker* worker) {
94106
Napi::Env env = worker->Env();
@@ -119,6 +131,17 @@ void InitializeClient(const CallbackInfo& info) {
119131
std::wstring user = ToWStringWithNonStringAsEmpty(options["user"]);
120132
std::wstring domain = ToWStringWithNonStringAsEmpty(options["domain"]);
121133
std::wstring password = ToWStringWithNonStringAsEmpty(options["password"]);
134+
135+
if (isWStringTooLong(user)) {
136+
throw Error::New(info.Env(), "User name is too long");
137+
}
138+
if (isWStringTooLong(domain)) {
139+
throw Error::New(info.Env(), "Domain is too long");
140+
}
141+
if (isWStringTooLong(password)) {
142+
throw Error::New(info.Env(), "Password is too long");
143+
}
144+
122145
Value flags_v = options["flags"];
123146
ULONG gss_flags = flags_v.IsNumber() ? flags_v.As<Number>().Uint32Value() : GSS_C_MUTUAL_FLAG|GSS_C_SEQUENCE_FLAG;
124147
Value mech_oid_v = options["mechOID"];
@@ -131,8 +154,8 @@ void InitializeClient(const CallbackInfo& info) {
131154
KerberosWorker::Run(callback, "kerberos:InitializeClient", [=](KerberosWorker::SetOnFinishedHandler onFinished) {
132155
auto client_state = std::make_shared<sspi_client_state>();
133156
sspi_result result = auth_sspi_client_init(
134-
(WCHAR*)service.c_str(), gss_flags, (WCHAR*)user.c_str(), user.length(),
135-
(WCHAR*)domain.c_str(), domain.length(), (WCHAR*)password.c_str(), password.length(),
157+
(WCHAR*)service.c_str(), gss_flags, (WCHAR*)user.c_str(), (ULONG)user.length(),
158+
(WCHAR*)domain.c_str(), (ULONG)domain.length(), (WCHAR*)password.c_str(), (ULONG)password.length(),
136159
(WCHAR*)mech_oid.c_str(), client_state.get());
137160

138161
return onFinished([=](KerberosWorker* worker) {

0 commit comments

Comments
 (0)