Commit 2cbadadc authored by Eric Biggers's avatar Eric Biggers Committed by Theodore Ts'o

fscrypt: define fscrypt_fname_alloc_buffer() to be for presented names

Previously fscrypt_fname_alloc_buffer() was used to allocate buffers for
both presented (decrypted or encoded) and encrypted filenames.  That was
confusing, because it had to allocate the worst-case size for either,
e.g. including NUL-padding even when it was meaningless.

But now that fscrypt_setup_filename() no longer calls it, it is only
used in the ->get_link() and ->readdir() paths, which specifically want
a buffer for presented filenames.  Therefore, switch the behavior over
to allocating the buffer for presented filenames only.
Signed-off-by: default avatarEric Biggers <ebiggers@google.com>
Signed-off-by: default avatarTheodore Ts'o <tytso@mit.edu>
parent 50c961de
...@@ -204,37 +204,36 @@ u32 fscrypt_fname_encrypted_size(const struct inode *inode, u32 ilen) ...@@ -204,37 +204,36 @@ u32 fscrypt_fname_encrypted_size(const struct inode *inode, u32 ilen)
EXPORT_SYMBOL(fscrypt_fname_encrypted_size); EXPORT_SYMBOL(fscrypt_fname_encrypted_size);
/** /**
* fscrypt_fname_crypto_alloc_obuff() - * fscrypt_fname_alloc_buffer - allocate a buffer for presented filenames
* *
* Allocates an output buffer that is sufficient for the crypto operation * Allocate a buffer that is large enough to hold any decrypted or encoded
* specified by the context and the direction. * filename (null-terminated), for the given maximum encrypted filename length.
*
* Return: 0 on success, -errno on failure
*/ */
int fscrypt_fname_alloc_buffer(const struct inode *inode, int fscrypt_fname_alloc_buffer(const struct inode *inode,
u32 ilen, struct fscrypt_str *crypto_str) u32 max_encrypted_len,
struct fscrypt_str *crypto_str)
{ {
u32 olen = fscrypt_fname_encrypted_size(inode, ilen);
const u32 max_encoded_len = const u32 max_encoded_len =
max_t(u32, BASE64_CHARS(FSCRYPT_FNAME_MAX_UNDIGESTED_SIZE), max_t(u32, BASE64_CHARS(FSCRYPT_FNAME_MAX_UNDIGESTED_SIZE),
1 + BASE64_CHARS(sizeof(struct fscrypt_digested_name))); 1 + BASE64_CHARS(sizeof(struct fscrypt_digested_name)));
u32 max_presented_len;
crypto_str->len = olen; max_presented_len = max(max_encoded_len, max_encrypted_len);
olen = max(olen, max_encoded_len);
/* crypto_str->name = kmalloc(max_presented_len + 1, GFP_NOFS);
* Allocated buffer can hold one more character to null-terminate the if (!crypto_str->name)
* string
*/
crypto_str->name = kmalloc(olen + 1, GFP_NOFS);
if (!(crypto_str->name))
return -ENOMEM; return -ENOMEM;
crypto_str->len = max_presented_len;
return 0; return 0;
} }
EXPORT_SYMBOL(fscrypt_fname_alloc_buffer); EXPORT_SYMBOL(fscrypt_fname_alloc_buffer);
/** /**
* fscrypt_fname_crypto_free_buffer() - * fscrypt_fname_free_buffer - free the buffer for presented filenames
* *
* Frees the buffer allocated for crypto operation. * Free the buffer allocated by fscrypt_fname_alloc_buffer().
*/ */
void fscrypt_fname_free_buffer(struct fscrypt_str *crypto_str) void fscrypt_fname_free_buffer(struct fscrypt_str *crypto_str)
{ {
......
...@@ -140,7 +140,7 @@ static inline u32 fscrypt_fname_encrypted_size(const struct inode *inode, ...@@ -140,7 +140,7 @@ static inline u32 fscrypt_fname_encrypted_size(const struct inode *inode,
} }
static inline int fscrypt_fname_alloc_buffer(const struct inode *inode, static inline int fscrypt_fname_alloc_buffer(const struct inode *inode,
u32 ilen, u32 max_encrypted_len,
struct fscrypt_str *crypto_str) struct fscrypt_str *crypto_str)
{ {
return -EOPNOTSUPP; return -EOPNOTSUPP;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment