diff options
author | Eric Biggers <ebiggers@google.com> | 2018-01-12 07:30:08 +0300 |
---|---|---|
committer | Theodore Ts'o <tytso@mit.edu> | 2018-01-12 07:30:08 +0300 |
commit | 50c961de59ec841c1185c18457e6dab227f3bbf3 (patch) | |
tree | 3db5eb9b6ffe59dd34ff325810869891b2fed53e /fs/crypto/hooks.c | |
parent | 0eaab5b10621e84868df911dad43d330fa1b9bc8 (diff) | |
download | linux-50c961de59ec841c1185c18457e6dab227f3bbf3.tar.xz |
fscrypt: calculate NUL-padding length in one place only
Currently, when encrypting a filename (either a real filename or a
symlink target) we calculate the amount of NUL-padding twice: once
before encryption and once during encryption in fname_encrypt(). It is
needed before encryption to allocate the needed buffer size as well as
calculate the size the symlink target will take up on-disk before
creating the symlink inode. Calculating the size during encryption as
well is redundant.
Remove this redundancy by always calculating the exact size beforehand,
and making fname_encrypt() just add as much NUL padding as is needed to
fill the output buffer.
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
Diffstat (limited to 'fs/crypto/hooks.c')
-rw-r--r-- | fs/crypto/hooks.c | 7 |
1 files changed, 1 insertions, 6 deletions
diff --git a/fs/crypto/hooks.c b/fs/crypto/hooks.c index 8900e348ba6e..5bf38d94c5d2 100644 --- a/fs/crypto/hooks.c +++ b/fs/crypto/hooks.c @@ -161,7 +161,6 @@ int __fscrypt_encrypt_symlink(struct inode *inode, const char *target, struct qstr iname = { .name = target, .len = len }; struct fscrypt_symlink_data *sd; unsigned int ciphertext_len; - struct fscrypt_str oname; err = fscrypt_require_key(inode); if (err) @@ -178,16 +177,12 @@ int __fscrypt_encrypt_symlink(struct inode *inode, const char *target, ciphertext_len = disk_link->len - sizeof(*sd); sd->len = cpu_to_le16(ciphertext_len); - oname.name = sd->encrypted_path; - oname.len = ciphertext_len; - err = fname_encrypt(inode, &iname, &oname); + err = fname_encrypt(inode, &iname, sd->encrypted_path, ciphertext_len); if (err) { if (!disk_link->name) kfree(sd); return err; } - BUG_ON(oname.len != ciphertext_len); - /* * Null-terminating the ciphertext doesn't make sense, but we still * count the null terminator in the length, so we might as well |