From: Dmitry Volyntsev Date: Thu, 5 Apr 2018 16:06:35 +0000 (+0300) Subject: Fixed crypto update() method after digest() is called. X-Git-Tag: 0.2.1~35 X-Git-Url: http://www.kaiwu.me/postgresql/commit/?a=commitdiff_plain;h=7dcacb40fdc7165b13d1390250714ec53260b394;p=njs.git Fixed crypto update() method after digest() is called. --- diff --git a/njs/njs_crypto.c b/njs/njs_crypto.c index db359e47..c00e2982 100644 --- a/njs/njs_crypto.c +++ b/njs/njs_crypto.c @@ -243,6 +243,12 @@ njs_hash_prototype_update(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, njs_string_get(&args[1], &data); dgst = njs_value_data(&hash->value); + + if (nxt_slow_path(dgst->alg == NULL)) { + njs_error(vm, "Digest already called", NULL); + return NJS_ERROR; + } + dgst->alg->update(&dgst->u, data.start, data.length); vm->retval = args[0]; @@ -504,6 +510,12 @@ njs_hmac_prototype_update(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, njs_string_get(&args[1], &data); ctx = njs_value_data(&hmac->value); + + if (nxt_slow_path(ctx->alg == NULL)) { + njs_error(vm, "Digest already called", NULL); + return NJS_ERROR; + } + ctx->alg->update(&ctx->u, data.start, data.length); vm->retval = args[0]; diff --git a/njs/test/njs_unit_test.c b/njs/test/njs_unit_test.c index 75a76fe5..693dd856 100644 --- a/njs/test/njs_unit_test.c +++ b/njs/test/njs_unit_test.c @@ -9142,6 +9142,10 @@ static njs_unit_test_t njs_test[] = "h.update('A').digest('hex'); h.digest('hex')"), nxt_string("Error: Digest already called") }, + { nxt_string("var h = require('crypto').createHash('sha1');" + "h.update('A').digest('hex'); h.update('B')"), + nxt_string("Error: Digest already called") }, + /* require('crypto').createHash() */ { nxt_string("require('crypto').createHmac('sha1', '')"), @@ -9239,6 +9243,14 @@ static njs_unit_test_t njs_test[] = { nxt_string("var h = require('crypto').createHmac('sha1', [])"), nxt_string("TypeError: key must be a string") }, + { nxt_string("var h = require('crypto').createHmac('sha1', 'secret key');" + "h.update('A').digest('hex'); h.digest('hex')"), + nxt_string("Error: Digest already called") }, + + { nxt_string("var h = require('crypto').createHmac('sha1', 'secret key');" + "h.update('A').digest('hex'); h.update('B')"), + nxt_string("Error: Digest already called") }, + /* setTimeout(). */ { nxt_string("setTimeout()"),