linux/fs/ksmbd/xattr.h
Gustavo A. R. Silva 5224f79096 treewide: Replace zero-length arrays with flexible-array members
There is a regular need in the kernel to provide a way to declare
having a dynamically sized set of trailing elements in a structure.
Kernel code should always use “flexible array members”[1] for these
cases. The older style of one-element or zero-length arrays should
no longer be used[2].

This code was transformed with the help of Coccinelle:
(next-20220214$ spatch --jobs $(getconf _NPROCESSORS_ONLN) --sp-file script.cocci --include-headers --dir . > output.patch)

@@
identifier S, member, array;
type T1, T2;
@@

struct S {
  ...
  T1 member;
  T2 array[
- 0
  ];
};

UAPI and wireless changes were intentionally excluded from this patch
and will be sent out separately.

[1] https://en.wikipedia.org/wiki/Flexible_array_member
[2] https://www.kernel.org/doc/html/v5.16/process/deprecated.html#zero-length-and-one-element-arrays

Link: https://github.com/KSPP/linux/issues/78
Reviewed-by: Kees Cook <keescook@chromium.org>
Signed-off-by: Gustavo A. R. Silva <gustavoars@kernel.org>
2022-02-17 07:00:39 -06:00

123 lines
3.3 KiB
C

/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
* Copyright (C) 2021 Samsung Electronics Co., Ltd.
*/
#ifndef __XATTR_H__
#define __XATTR_H__
/*
* These are on-disk structures to store additional metadata into xattr to
* reproduce windows filesystem semantics. And they are encoded with NDR to
* compatible with samba's xattr meta format. The compatibility with samba
* is important because it can lose the information(file attribute,
* creation time, acls) about the existing files when switching between
* ksmbd and samba.
*/
/*
* Dos attribute flags used for what variable is valid.
*/
enum {
XATTR_DOSINFO_ATTRIB = 0x00000001,
XATTR_DOSINFO_EA_SIZE = 0x00000002,
XATTR_DOSINFO_SIZE = 0x00000004,
XATTR_DOSINFO_ALLOC_SIZE = 0x00000008,
XATTR_DOSINFO_CREATE_TIME = 0x00000010,
XATTR_DOSINFO_CHANGE_TIME = 0x00000020,
XATTR_DOSINFO_ITIME = 0x00000040
};
/*
* Dos attribute structure which is compatible with samba's one.
* Storing it into the xattr named "DOSATTRIB" separately from inode
* allows ksmbd to faithfully reproduce windows filesystem semantics
* on top of a POSIX filesystem.
*/
struct xattr_dos_attrib {
__u16 version; /* version 3 or version 4 */
__u32 flags; /* valid flags */
__u32 attr; /* Dos attribute */
__u32 ea_size; /* EA size */
__u64 size;
__u64 alloc_size;
__u64 create_time; /* File creation time */
__u64 change_time; /* File change time */
__u64 itime; /* Invented/Initial time */
};
/*
* Enumeration is used for computing posix acl hash.
*/
enum {
SMB_ACL_TAG_INVALID = 0,
SMB_ACL_USER,
SMB_ACL_USER_OBJ,
SMB_ACL_GROUP,
SMB_ACL_GROUP_OBJ,
SMB_ACL_OTHER,
SMB_ACL_MASK
};
#define SMB_ACL_READ 4
#define SMB_ACL_WRITE 2
#define SMB_ACL_EXECUTE 1
struct xattr_acl_entry {
int type;
uid_t uid;
gid_t gid;
mode_t perm;
};
/*
* xattr_smb_acl structure is used for computing posix acl hash.
*/
struct xattr_smb_acl {
int count;
int next;
struct xattr_acl_entry entries[];
};
/* 64bytes hash in xattr_ntacl is computed with sha256 */
#define XATTR_SD_HASH_TYPE_SHA256 0x1
#define XATTR_SD_HASH_SIZE 64
/*
* xattr_ntacl is used for storing ntacl and hashes.
* Hash is used for checking valid posix acl and ntacl in xattr.
*/
struct xattr_ntacl {
__u16 version; /* version 4*/
void *sd_buf;
__u32 sd_size;
__u16 hash_type; /* hash type */
__u8 desc[10]; /* posix_acl description */
__u16 desc_len;
__u64 current_time;
__u8 hash[XATTR_SD_HASH_SIZE]; /* 64bytes hash for ntacl */
__u8 posix_acl_hash[XATTR_SD_HASH_SIZE]; /* 64bytes hash for posix acl */
};
/* DOS ATTRIBUITE XATTR PREFIX */
#define DOS_ATTRIBUTE_PREFIX "DOSATTRIB"
#define DOS_ATTRIBUTE_PREFIX_LEN (sizeof(DOS_ATTRIBUTE_PREFIX) - 1)
#define XATTR_NAME_DOS_ATTRIBUTE (XATTR_USER_PREFIX DOS_ATTRIBUTE_PREFIX)
#define XATTR_NAME_DOS_ATTRIBUTE_LEN \
(sizeof(XATTR_USER_PREFIX DOS_ATTRIBUTE_PREFIX) - 1)
/* STREAM XATTR PREFIX */
#define STREAM_PREFIX "DosStream."
#define STREAM_PREFIX_LEN (sizeof(STREAM_PREFIX) - 1)
#define XATTR_NAME_STREAM (XATTR_USER_PREFIX STREAM_PREFIX)
#define XATTR_NAME_STREAM_LEN (sizeof(XATTR_NAME_STREAM) - 1)
/* SECURITY DESCRIPTOR(NTACL) XATTR PREFIX */
#define SD_PREFIX "NTACL"
#define SD_PREFIX_LEN (sizeof(SD_PREFIX) - 1)
#define XATTR_NAME_SD (XATTR_SECURITY_PREFIX SD_PREFIX)
#define XATTR_NAME_SD_LEN \
(sizeof(XATTR_SECURITY_PREFIX SD_PREFIX) - 1)
#endif /* __XATTR_H__ */