@@ -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+
8189void 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