vim-patch:9.1.1778: sha256() treats empty blob and null blob differently

Problem:  sha256() treats empty blob and null blob differently
          (after 9.1.1774).
Solution: Handle null blob the same as empty blob (zeertzjq).

closes: vim/vim#18341

2f3b7ea19a
This commit is contained in:
zeertzjq
2025-09-21 06:23:05 +08:00
parent 39a21d749d
commit a5955e5cc5
2 changed files with 14 additions and 15 deletions

View File

@@ -7197,11 +7197,9 @@ static void f_sha256(typval_T *argvars, typval_T *rettv, EvalFuncData fptr)
if (argvars[0].v_type == VAR_BLOB) { if (argvars[0].v_type == VAR_BLOB) {
blob_T *blob = argvars[0].vval.v_blob; blob_T *blob = argvars[0].vval.v_blob;
if (blob != NULL) { const uint8_t *p = blob != NULL ? (uint8_t *)blob->bv_ga.ga_data : (uint8_t *)"";
const uint8_t *p = (uint8_t *)blob->bv_ga.ga_data; int len = blob != NULL ? blob->bv_ga.ga_len : 0;
int len = blob->bv_ga.ga_len;
rettv->vval.v_string = xstrdup(sha256_bytes(p, (size_t)len, NULL, 0)); rettv->vval.v_string = xstrdup(sha256_bytes(p, (size_t)len, NULL, 0));
}
} else { } else {
const char *p = tv_get_string(&argvars[0]); const char *p = tv_get_string(&argvars[0]);
const char *hash = sha256_bytes((const uint8_t *)p, strlen(p), NULL, 0); const char *hash = sha256_bytes((const uint8_t *)p, strlen(p), NULL, 0);

View File

@@ -5,24 +5,25 @@ source check.vim
CheckFunction sha256 CheckFunction sha256
function Test_sha256() function Test_sha256()
" test for empty string: " tests for string:
" empty string
call assert_equal('e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855', sha256("")) call assert_equal('e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855', sha256(""))
" null string
"'test for 1 char: call assert_equal('e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855', sha256(v:_null_string))
" string with 1 char
call assert_equal('ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb', sha256("a")) call assert_equal('ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb', sha256("a"))
" " string with 3 chars
"test for 3 chars:
call assert_equal('ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad', "abc"->sha256()) call assert_equal('ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad', "abc"->sha256())
" string containing meta char
" test for contains meta char:
call assert_equal('807eff6267f3f926a21d234f7b0cf867a86f47e07a532f15e8cc39ed110ca776', sha256("foo\nbar")) call assert_equal('807eff6267f3f926a21d234f7b0cf867a86f47e07a532f15e8cc39ed110ca776', sha256("foo\nbar"))
" string containing non-ascii char
" test for contains non-ascii char:
call assert_equal('5f78c33274e43fa9de5659265c1d917e25c03722dcb0b8d27db8d5feaa813953', sha256("\xde\xad\xbe\xef")) call assert_equal('5f78c33274e43fa9de5659265c1d917e25c03722dcb0b8d27db8d5feaa813953', sha256("\xde\xad\xbe\xef"))
" test for blob: " tests for blob:
" empty blob " empty blob
call assert_equal('e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855', sha256(0z)) call assert_equal('e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855', sha256(0z))
" null blob
call assert_equal('e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855', sha256(v:_null_blob))
" blob with single byte " blob with single byte
call assert_equal('ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb', sha256(0z61)) call assert_equal('ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb', sha256(0z61))
" blob with "abc" " blob with "abc"