source: rtems/cpukit/libcsupport/src/sup_fs_check_permissions.c

Last change on this file was bcef89f2, checked in by Sebastian Huber <sebastian.huber@…>, on 05/19/23 at 06:18:25

Update company name

The embedded brains GmbH & Co. KG is the legal successor of embedded
brains GmbH.

  • Property mode set to 100644
File size: 3.8 KB
Line 
1/* SPDX-License-Identifier: BSD-2-Clause */
2
3/**
4 *  @file
5 *
6 *  @brief RTEMS File System Permissions Check Support
7 *  @ingroup LibIOInternal
8 */
9
10/*
11 * Copyright (c) 2012 embedded brains GmbH & Co. KG
12 *
13 * Redistribution and use in source and binary forms, with or without
14 * modification, are permitted provided that the following conditions
15 * are met:
16 * 1. Redistributions of source code must retain the above copyright
17 *    notice, this list of conditions and the following disclaimer.
18 * 2. Redistributions in binary form must reproduce the above copyright
19 *    notice, this list of conditions and the following disclaimer in the
20 *    documentation and/or other materials provided with the distribution.
21 *
22 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
23 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
26 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
27 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
28 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
29 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
30 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
31 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32 * POSSIBILITY OF SUCH DAMAGE.
33 */
34
35#ifdef HAVE_CONFIG_H
36#include "config.h"
37#endif
38
39#include <sys/stat.h>
40
41#include <rtems/libio_.h>
42
43#define RTEMS_FS_USR_SHIFT 6
44#define RTEMS_FS_GRP_SHIFT 3
45#define RTEMS_FS_OTH_SHIFT 0
46
47RTEMS_STATIC_ASSERT(
48  (RTEMS_FS_PERMS_READ << RTEMS_FS_USR_SHIFT) == S_IRUSR,
49  S_IRUSR
50);
51RTEMS_STATIC_ASSERT(
52  (RTEMS_FS_PERMS_READ << RTEMS_FS_GRP_SHIFT) == S_IRGRP,
53  S_IRGRP
54);
55RTEMS_STATIC_ASSERT(
56  (RTEMS_FS_PERMS_READ << RTEMS_FS_OTH_SHIFT) == S_IROTH,
57  S_IROTH
58);
59
60RTEMS_STATIC_ASSERT(
61  (RTEMS_FS_PERMS_WRITE << RTEMS_FS_USR_SHIFT) == S_IWUSR,
62  S_IWUSR
63);
64RTEMS_STATIC_ASSERT(
65  (RTEMS_FS_PERMS_WRITE << RTEMS_FS_GRP_SHIFT) == S_IWGRP,
66  S_IWGRP
67);
68RTEMS_STATIC_ASSERT(
69  (RTEMS_FS_PERMS_WRITE << RTEMS_FS_OTH_SHIFT) == S_IWOTH,
70  S_IWOTH
71);
72
73RTEMS_STATIC_ASSERT(
74  (RTEMS_FS_PERMS_EXEC << RTEMS_FS_USR_SHIFT) == S_IXUSR,
75  S_IXUSR
76);
77RTEMS_STATIC_ASSERT(
78  (RTEMS_FS_PERMS_EXEC << RTEMS_FS_GRP_SHIFT) == S_IXGRP,
79  S_IXGRP
80);
81RTEMS_STATIC_ASSERT(
82  (RTEMS_FS_PERMS_EXEC << RTEMS_FS_OTH_SHIFT) == S_IXOTH,
83  S_IXOTH
84);
85
86static bool equals_supplementary_group(
87  const rtems_user_env_t *uenv,
88  gid_t object_gid
89)
90{
91  size_t i;
92
93  for (i = 0; i < uenv->ngroups; ++i) {
94    if (uenv->groups[i] == object_gid) {
95      return true;
96    }
97  }
98
99  return false;
100}
101
102bool rtems_filesystem_check_access(
103  int flags,
104  mode_t object_mode,
105  uid_t object_uid,
106  gid_t object_gid
107)
108{
109  const rtems_user_env_t *uenv = rtems_current_user_env_get();
110  mode_t access_flags = flags & RTEMS_FS_PERMS_RWX;
111  uid_t task_uid = uenv->euid;
112
113  if (task_uid == 0 || task_uid == object_uid) {
114    access_flags <<= RTEMS_FS_USR_SHIFT;
115  } else {
116    gid_t task_gid = uenv->egid;
117
118    if (
119      task_gid == 0
120        || task_gid == object_gid
121        || equals_supplementary_group(uenv, object_gid)
122    ) {
123      access_flags <<= RTEMS_FS_GRP_SHIFT;
124    } else {
125      access_flags <<= RTEMS_FS_OTH_SHIFT;
126    }
127  }
128
129  return (access_flags & object_mode) == access_flags;
130}
131
132bool rtems_filesystem_eval_path_check_access(
133  rtems_filesystem_eval_path_context_t *ctx,
134  int eval_flags,
135  mode_t node_mode,
136  uid_t node_uid,
137  gid_t node_gid
138)
139{
140  bool access_ok = rtems_filesystem_check_access(
141    eval_flags,
142    node_mode,
143    node_uid,
144    node_gid
145  );
146
147  if (!access_ok) {
148    rtems_filesystem_eval_path_error(ctx, EACCES);
149  }
150
151  return access_ok;
152}
Note: See TracBrowser for help on using the repository browser.