19
19
#include " CNNICHashWhitelist.inc"
20
20
21
21
#include < errno.h>
22
+ #include < limits.h> // INT_MAX
22
23
#include < math.h>
23
24
#include < stdlib.h>
24
25
#include < string.h>
@@ -4737,12 +4738,12 @@ class PBKDF2Request : public AsyncWrap {
4737
4738
PBKDF2Request (Environment* env,
4738
4739
Local<Object> object,
4739
4740
const EVP_MD* digest,
4740
- ssize_t passlen,
4741
+ int passlen,
4741
4742
char * pass,
4742
- ssize_t saltlen,
4743
+ int saltlen,
4743
4744
char * salt,
4744
- ssize_t iter,
4745
- ssize_t keylen)
4745
+ int iter,
4746
+ int keylen)
4746
4747
: AsyncWrap(env, object, AsyncWrap::PROVIDER_CRYPTO),
4747
4748
digest_ (digest),
4748
4749
error_(0 ),
@@ -4771,31 +4772,31 @@ class PBKDF2Request : public AsyncWrap {
4771
4772
return digest_;
4772
4773
}
4773
4774
4774
- inline ssize_t passlen () const {
4775
+ inline int passlen () const {
4775
4776
return passlen_;
4776
4777
}
4777
4778
4778
4779
inline char * pass () const {
4779
4780
return pass_;
4780
4781
}
4781
4782
4782
- inline ssize_t saltlen () const {
4783
+ inline int saltlen () const {
4783
4784
return saltlen_;
4784
4785
}
4785
4786
4786
4787
inline char * salt () const {
4787
4788
return salt_;
4788
4789
}
4789
4790
4790
- inline ssize_t keylen () const {
4791
+ inline int keylen () const {
4791
4792
return keylen_;
4792
4793
}
4793
4794
4794
4795
inline char * key () const {
4795
4796
return key_;
4796
4797
}
4797
4798
4798
- inline ssize_t iter () const {
4799
+ inline int iter () const {
4799
4800
return iter_;
4800
4801
}
4801
4802
@@ -4828,13 +4829,13 @@ class PBKDF2Request : public AsyncWrap {
4828
4829
private:
4829
4830
const EVP_MD* digest_;
4830
4831
int error_;
4831
- ssize_t passlen_;
4832
+ int passlen_;
4832
4833
char * pass_;
4833
- ssize_t saltlen_;
4834
+ int saltlen_;
4834
4835
char * salt_;
4835
- ssize_t keylen_;
4836
+ int keylen_;
4836
4837
char * key_;
4837
- ssize_t iter_;
4838
+ int iter_;
4838
4839
};
4839
4840
4840
4841
@@ -4891,10 +4892,11 @@ void PBKDF2(const FunctionCallbackInfo<Value>& args) {
4891
4892
const char * type_error = nullptr ;
4892
4893
char * pass = nullptr ;
4893
4894
char * salt = nullptr ;
4894
- ssize_t passlen = -1 ;
4895
- ssize_t saltlen = -1 ;
4896
- double keylen = -1 ;
4897
- ssize_t iter = -1 ;
4895
+ int passlen = -1 ;
4896
+ int saltlen = -1 ;
4897
+ double raw_keylen = -1 ;
4898
+ int keylen = -1 ;
4899
+ int iter = -1 ;
4898
4900
PBKDF2Request* req = nullptr ;
4899
4901
Local<Object> obj;
4900
4902
@@ -4946,12 +4948,15 @@ void PBKDF2(const FunctionCallbackInfo<Value>& args) {
4946
4948
goto err;
4947
4949
}
4948
4950
4949
- keylen = args[3 ]->NumberValue ();
4950
- if (keylen < 0 || isnan (keylen) || isinf (keylen)) {
4951
+ raw_keylen = args[3 ]->NumberValue ();
4952
+ if (raw_keylen < 0.0 || isnan (raw_keylen) || isinf (raw_keylen) ||
4953
+ raw_keylen > INT_MAX) {
4951
4954
type_error = " Bad key length" ;
4952
4955
goto err;
4953
4956
}
4954
4957
4958
+ keylen = static_cast <int >(raw_keylen);
4959
+
4955
4960
if (args[4 ]->IsString ()) {
4956
4961
node::Utf8Value digest_name (env->isolate (), args[4 ]);
4957
4962
digest = EVP_get_digestbyname (*digest_name);
@@ -4974,7 +4979,7 @@ void PBKDF2(const FunctionCallbackInfo<Value>& args) {
4974
4979
saltlen,
4975
4980
salt,
4976
4981
iter,
4977
- static_cast < ssize_t >( keylen) );
4982
+ keylen);
4978
4983
4979
4984
if (args[5 ]->IsFunction ()) {
4980
4985
obj->Set (env->ondone_string (), args[5 ]);
0 commit comments