オープンソース・ソフトウェアの開発とダウンロード

Subversion リポジトリの参照

Diff of /trunk/1.5.x/ccs-patch/fs/sakura_mount.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

trunk/ccs-patch/fs/sakura_mount.c revision 265 by kumaneko, Tue Jun 5 11:19:48 2007 UTC trunk/1.5.x/ccs-patch/fs/sakura_mount.c revision 621 by kumaneko, Sat Oct 27 08:11:13 2007 UTC
# Line 5  Line 5 
5   *   *
6   * Copyright (C) 2005-2007  NTT DATA CORPORATION   * Copyright (C) 2005-2007  NTT DATA CORPORATION
7   *   *
8   * Version: 1.4.1   2007/06/05   * Version: 1.5.2-pre   2007/10/19
9   *   *
10   * This file is applicable to both 2.4.30 and 2.6.11 and later.   * This file is applicable to both 2.4.30 and 2.6.11 and later.
11   * See README.ccs for ChangeLog.   * See README.ccs for ChangeLog.
# Line 55  struct mount_entry { Line 55  struct mount_entry {
55          const struct path_info *dev_name;          const struct path_info *dev_name;
56          const struct path_info *dir_name;          const struct path_info *dir_name;
57          const struct path_info *fs_type;          const struct path_info *fs_type;
58          unsigned int disabled_options; /* Options to forcefully disable.        */          unsigned long flags;
59          unsigned int enabled_options;  /* Options to forcefully enable.         */          bool is_deleted;
         int is_deleted;  
60  };  };
61    
62  /*************************  MOUNT RESTRICTION HANDLER  *************************/  /*************************  MOUNT RESTRICTION HANDLER  *************************/
63    
64  static void ParseMountOptions(char *arg, unsigned int *enabled_options, unsigned int *disabled_options)  #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)
 {  
         char *sp = arg, *cp;  
         unsigned int enable = 0, disable = 0;  
         while ((cp = strsep(&sp, " ,")) != NULL) {  
                 if (strcmp(cp, "rw") == 0)          disable |= MS_RDONLY;  
                 else if (strcmp(cp, "ro") == 0)     enable  |= MS_RDONLY;  
                 else if (strcmp(cp, "suid") == 0)   disable |= MS_NOSUID;  
                 else if (strcmp(cp, "nosuid") == 0) enable  |= MS_NOSUID;  
                 else if (strcmp(cp, "dev") == 0)    disable |= MS_NODEV;  
                 else if (strcmp(cp, "nodev") == 0)  enable  |= MS_NODEV;  
                 else if (strcmp(cp, "exec") == 0)   disable |= MS_NOEXEC;  
                 else if (strcmp(cp, "noexec") == 0) enable  |= MS_NOEXEC;  
                 else if (strcmp(cp, "atime") == 0)      disable |= MS_NOATIME;  
                 else if (strcmp(cp, "noatime") == 0)    enable  |= MS_NOATIME;  
                 else if (strcmp(cp, "diratime") == 0)   disable |= MS_NODIRATIME;  
                 else if (strcmp(cp, "nodiratime") == 0) enable  |= MS_NODIRATIME;  
                 else if (strcmp(cp, "norecurse") == 0)  disable |= MS_REC;  
                 else if (strcmp(cp, "recurse") == 0)    enable  |= MS_REC;  
         }  
         *enabled_options = enable;  
         *disabled_options = disable;  
 }  
   
 static void MakeMountOptions(char *buffer, const int buffer_len, const unsigned int enabled, const unsigned int disabled)  
 {  
         memset(buffer, 0, buffer_len);  
         if (enabled == 0 && disabled == 0) {  
                 snprintf(buffer, buffer_len - 1, "defaults");  
         } else {  
                 snprintf(buffer, buffer_len - 1, "%s%s%s%s%s%s%s",  
                                  enabled & MS_RDONLY     ? "ro "     :     (disabled & MS_RDONLY     ? "rw "        : ""),  
                                  enabled & MS_NOSUID     ? "nosuid " :     (disabled & MS_NOSUID     ? "suid "      : ""),  
                                  enabled & MS_NODEV      ? "nodev "  :     (disabled & MS_NODEV      ? "dev "       : ""),  
                                  enabled & MS_NOEXEC     ? "noexec " :     (disabled & MS_NOEXEC     ? "exec "      : ""),  
                                  enabled & MS_NOATIME    ? "noatime " :    (disabled & MS_NOATIME    ? "atime "     : ""),  
                                  enabled & MS_NODIRATIME ? "nodiratime " : (disabled & MS_NODIRATIME ? "diratime "  : ""),  
                                  enabled & MS_REC        ? "recurse " :    (disabled & MS_REC        ? "norecurse " : ""));  
         }  
 }  
   
65  static void put_filesystem(struct file_system_type *fs)  static void put_filesystem(struct file_system_type *fs)
66  {  {
67          module_put(fs->owner);          module_put(fs->owner);
68  }  }
69    #endif
70    
71  static struct mount_entry *mount_list = NULL;  static struct mount_entry *mount_list = NULL;
72    
73  static int AddMountACL(const char *dev_name, const char *dir_name, const char *fs_type, const unsigned int enable, const unsigned int disable, const int is_delete)  static int AddMountACL(const char *dev_name, const char *dir_name, const char *fs_type, const unsigned long flags, const bool is_delete)
74  {  {
75          struct mount_entry *new_entry, *ptr;          struct mount_entry *new_entry, *ptr;
76          const struct path_info *fs, *dev, *dir;          const struct path_info *fs, *dev, *dir;
77          static DECLARE_MUTEX(lock);          static DECLARE_MUTEX(lock);
78          int error = -ENOMEM;          int error = -ENOMEM;
         if (enable & disable) return -EINVAL; /* options mismatch. */  
79          if ((fs = SaveName(fs_type)) == NULL) return -EINVAL;          if ((fs = SaveName(fs_type)) == NULL) return -EINVAL;
80          if (!dev_name) dev_name = "<NULL>"; /* Map dev_name to "<NULL>" for if no dev_name given. */          if (!dev_name) dev_name = "<NULL>"; /* Map dev_name to "<NULL>" for if no dev_name given. */
81          if (strcmp(fs->name, MOUNT_REMOUNT_KEYWORD) == 0) dev_name = "any"; /* Fix dev_name to "any" for remount permission. */          if (strcmp(fs->name, MOUNT_REMOUNT_KEYWORD) == 0) dev_name = "any"; /* Fix dev_name to "any" for remount permission. */
# Line 128  static int AddMountACL(const char *dev_n Line 87  static int AddMountACL(const char *dev_n
87          if ((dev = SaveName(dev_name)) == NULL || (dir = SaveName(dir_name)) == NULL) return -ENOMEM;          if ((dev = SaveName(dev_name)) == NULL || (dir = SaveName(dir_name)) == NULL) return -ENOMEM;
88          down(&lock);          down(&lock);
89          for (ptr = mount_list; ptr; ptr = ptr->next) {          for (ptr = mount_list; ptr; ptr = ptr->next) {
90                  if (pathcmp(ptr->dev_name, dev) || pathcmp(ptr->dir_name, dir) || pathcmp(ptr->fs_type, fs)) continue;                  if (ptr->flags != flags || pathcmp(ptr->dev_name, dev) || pathcmp(ptr->dir_name, dir) || pathcmp(ptr->fs_type, fs)) continue;
91                    error = 0;
92                  if (is_delete) {                  if (is_delete) {
                         if (ptr->disabled_options != disable || ptr->enabled_options != enable) continue;  
93                          ptr->is_deleted = 1;                          ptr->is_deleted = 1;
                         error = 0;  
94                          goto out;                          goto out;
95                  } else {                  } else {
96                          if (ptr->is_deleted) {                          if (ptr->is_deleted) {
                                 ptr->enabled_options = enable;  
                                 ptr->disabled_options = disable;  
97                                  ptr->is_deleted = 0;                                  ptr->is_deleted = 0;
98                          } else {                                  goto update;
                                 if ((ptr->enabled_options & disable) || (ptr->disabled_options | enable)) {  
                                         error = -EINVAL; goto out; /* options mismatch. */  
                                 }  
                                 if ((ptr->enabled_options & enable) == enable && (ptr->disabled_options & disable) == disable) {  
                                         error = 0; goto out; /* No changes. */  
                                 }  
                                 ptr->enabled_options |= enable;  
                                 ptr->disabled_options |= disable;  
99                          }                          }
100                          error = 0;                          goto out; /* No changes. */
                         goto update;  
101                  }                  }
102          }          }
103          if (is_delete) {          if (is_delete) {
# Line 161  static int AddMountACL(const char *dev_n Line 108  static int AddMountACL(const char *dev_n
108          new_entry->dev_name = dev;          new_entry->dev_name = dev;
109          new_entry->dir_name = dir;          new_entry->dir_name = dir;
110          new_entry->fs_type = fs;          new_entry->fs_type = fs;
111          new_entry->enabled_options = enable;          new_entry->flags = flags;
         new_entry->disabled_options = disable;  
112          mb(); /* Instead of using spinlock. */          mb(); /* Instead of using spinlock. */
113          if ((ptr = mount_list) != NULL) {          if ((ptr = mount_list) != NULL) {
114                  while (ptr->next) ptr = ptr->next; ptr->next = new_entry;                  while (ptr->next) ptr = ptr->next; ptr->next = new_entry;
# Line 174  static int AddMountACL(const char *dev_n Line 120  static int AddMountACL(const char *dev_n
120   update:   update:
121          {          {
122                  struct file_system_type *type = NULL;                  struct file_system_type *type = NULL;
                 char options[64];  
                 MakeMountOptions(options, sizeof(options), ptr->enabled_options, ptr->disabled_options);  
123                  if (strcmp(fs->name, MOUNT_REMOUNT_KEYWORD) == 0) {                  if (strcmp(fs->name, MOUNT_REMOUNT_KEYWORD) == 0) {
124                          printk("%sAllow remount %s with options %s.\n", ccs_log_level, dir->name, options);                          printk("%sAllow remount %s with options 0x%lX.\n", ccs_log_level, dir->name, ptr->flags);
125                  } else if (strcmp(fs->name, MOUNT_BIND_KEYWORD) == 0 || strcmp(fs->name, MOUNT_MOVE_KEYWORD) == 0) {                  } else if (strcmp(fs->name, MOUNT_BIND_KEYWORD) == 0 || strcmp(fs->name, MOUNT_MOVE_KEYWORD) == 0) {
126                          printk("%sAllow mount %s %s %s\n", ccs_log_level, fs->name, dev->name, dir->name);                          printk("%sAllow mount %s %s %s with options 0x%lX\n", ccs_log_level, fs->name, dev->name, dir->name, ptr->flags);
127                  } else if (strcmp(fs->name, MOUNT_MAKE_UNBINDABLE_KEYWORD) == 0 ||                  } else if (strcmp(fs->name, MOUNT_MAKE_UNBINDABLE_KEYWORD) == 0 ||
128                                     strcmp(fs->name, MOUNT_MAKE_PRIVATE_KEYWORD) == 0 ||                                     strcmp(fs->name, MOUNT_MAKE_PRIVATE_KEYWORD) == 0 ||
129                                     strcmp(fs->name, MOUNT_MAKE_SLAVE_KEYWORD) == 0 ||                                     strcmp(fs->name, MOUNT_MAKE_SLAVE_KEYWORD) == 0 ||
130                                     strcmp(fs->name, MOUNT_MAKE_SHARED_KEYWORD) == 0) {                                     strcmp(fs->name, MOUNT_MAKE_SHARED_KEYWORD) == 0) {
131                          printk("%sAllow mount %s %s with options %s.\n", ccs_log_level, fs->name, dir->name, options);                          printk("%sAllow mount %s %s with options 0x%lX.\n", ccs_log_level, fs->name, dir->name, ptr->flags);
132                  } else if ((type = get_fs_type(fs->name)) != NULL && (type->fs_flags & FS_REQUIRES_DEV) != 0) {                  } else if ((type = get_fs_type(fs->name)) != NULL && (type->fs_flags & FS_REQUIRES_DEV) != 0) {
133                          printk("%sAllow mount -t %s %s %s with options %s.\n", ccs_log_level, fs->name, dev->name, dir->name, options);                          printk("%sAllow mount -t %s %s %s with options 0x%lX.\n", ccs_log_level, fs->name, dev->name, dir->name, ptr->flags);
134                  } else {                  } else {
135                          printk("%sAllow mount %s on %s with options %s.\n", ccs_log_level, fs->name, dir->name, options);                          printk("%sAllow mount %s on %s with options 0x%lX.\n", ccs_log_level, fs->name, dir->name, ptr->flags);
136                  }                  }
137                  if (type) put_filesystem(type);                  if (type) put_filesystem(type);
138          }          }
# Line 197  static int AddMountACL(const char *dev_n Line 141  static int AddMountACL(const char *dev_n
141          return error;          return error;
142  }  }
143    
144  int CheckMountPermission(char *dev_name, char *dir_name, char *type, unsigned long *flags)  static int CheckMountPermission2(char *dev_name, char *dir_name, char *type, unsigned long flags)
145  {  {
146          const int is_enforce = CheckCCSEnforce(CCS_SAKURA_RESTRICT_MOUNT);          const bool is_enforce = CheckCCSEnforce(CCS_SAKURA_RESTRICT_MOUNT);
147          int error_flag = 1;          int error = -EPERM;
148          if (!CheckCCSFlags(CCS_SAKURA_RESTRICT_MOUNT)) return 0;          if (!CheckCCSFlags(CCS_SAKURA_RESTRICT_MOUNT)) return 0;
149          if (!type) type = "<NULL>";          if (!type) type = "<NULL>";
150          if ((*flags & MS_MGC_MSK) == MS_MGC_VAL) *flags &= ~MS_MGC_MSK;          if ((flags & MS_MGC_MSK) == MS_MGC_VAL) flags &= ~MS_MGC_MSK;
151          switch (*flags & (MS_REMOUNT | MS_MOVE | MS_BIND)) {          switch (flags & (MS_REMOUNT | MS_MOVE | MS_BIND)) {
152          case MS_REMOUNT:          case MS_REMOUNT:
153          case MS_MOVE:          case MS_MOVE:
154          case MS_BIND:          case MS_BIND:
# Line 212  int CheckMountPermission(char *dev_name, Line 156  int CheckMountPermission(char *dev_name,
156                  break;                  break;
157          default:          default:
158                  printk("SAKURA-ERROR: %s%s%sare given for single mount operation.\n",                  printk("SAKURA-ERROR: %s%s%sare given for single mount operation.\n",
159                             *flags & MS_REMOUNT ? "'remount' " : "",                         flags & MS_REMOUNT ? "'remount' " : "",
160                             *flags & MS_MOVE    ? "'move' " : "",                         flags & MS_MOVE    ? "'move' " : "",
161                             *flags & MS_BIND    ? "'bind' " : "");                         flags & MS_BIND    ? "'bind' " : "");
162                  return -EINVAL;                  return -EINVAL;
163          }          }
164          switch (*flags & (MS_UNBINDABLE | MS_PRIVATE | MS_SLAVE | MS_SHARED)) {          switch (flags & (MS_UNBINDABLE | MS_PRIVATE | MS_SLAVE | MS_SHARED)) {
165          case MS_UNBINDABLE:          case MS_UNBINDABLE:
166          case MS_PRIVATE:          case MS_PRIVATE:
167          case MS_SLAVE:          case MS_SLAVE:
# Line 226  int CheckMountPermission(char *dev_name, Line 170  int CheckMountPermission(char *dev_name,
170                  break;                  break;
171          default:          default:
172                  printk("SAKURA-ERROR: %s%s%s%sare given for single mount operation.\n",                  printk("SAKURA-ERROR: %s%s%s%sare given for single mount operation.\n",
173                             *flags & MS_UNBINDABLE ? "'unbindable' " : "",                         flags & MS_UNBINDABLE ? "'unbindable' " : "",
174                             *flags & MS_PRIVATE    ? "'private' " : "",                         flags & MS_PRIVATE    ? "'private' " : "",
175                             *flags & MS_SLAVE      ? "'slave' " : "",                         flags & MS_SLAVE      ? "'slave' " : "",
176                             *flags & MS_SHARED     ? "'shared' " : "");                         flags & MS_SHARED     ? "'shared' " : "");
177                  return -EINVAL;                  return -EINVAL;
178          }          }
179          if (*flags & MS_REMOUNT) {          if (flags & MS_REMOUNT) {
180                  *flags &= ~MS_REMOUNT;                  error = CheckMountPermission2(dev_name, dir_name, MOUNT_REMOUNT_KEYWORD, flags & ~MS_REMOUNT);
181                  error_flag = CheckMountPermission(dev_name, dir_name, MOUNT_REMOUNT_KEYWORD, flags);          } else if (flags & MS_MOVE) {
182                  *flags |= MS_REMOUNT;                  error = CheckMountPermission2(dev_name, dir_name, MOUNT_MOVE_KEYWORD, flags & ~MS_MOVE);
183          } else if (*flags & MS_MOVE) {          } else if (flags & MS_BIND) {
184                  *flags &= ~MS_MOVE;                  error = CheckMountPermission2(dev_name, dir_name, MOUNT_BIND_KEYWORD, flags & ~MS_BIND);
185                  error_flag = CheckMountPermission(dev_name, dir_name, MOUNT_MOVE_KEYWORD, flags);          } else if (flags & MS_UNBINDABLE) {
186                  *flags |= MS_MOVE;                  error = CheckMountPermission2(dev_name, dir_name, MOUNT_MAKE_UNBINDABLE_KEYWORD, flags & ~MS_UNBINDABLE);
187          } else if (*flags & MS_BIND) {          } else if (flags & MS_PRIVATE) {
188                  *flags &= ~MS_BIND;                  error = CheckMountPermission2(dev_name, dir_name, MOUNT_MAKE_PRIVATE_KEYWORD, flags & ~MS_PRIVATE);
189                  error_flag = CheckMountPermission(dev_name, dir_name, MOUNT_BIND_KEYWORD, flags);          } else if (flags & MS_SLAVE) {
190                  *flags |= MS_BIND;                  error = CheckMountPermission2(dev_name, dir_name, MOUNT_MAKE_SLAVE_KEYWORD, flags & ~MS_SLAVE);
191          } else if (*flags & MS_UNBINDABLE) {          } else if (flags & MS_SHARED) {
192                  *flags &= ~MS_UNBINDABLE;                  error = CheckMountPermission2(dev_name, dir_name, MOUNT_MAKE_SHARED_KEYWORD, flags & ~MS_SHARED);
                 error_flag = CheckMountPermission(dev_name, dir_name, MOUNT_MAKE_UNBINDABLE_KEYWORD, flags);  
                 *flags |= MS_UNBINDABLE;  
         } else if (*flags & MS_PRIVATE) {  
                 *flags &= ~MS_PRIVATE;  
                 error_flag = CheckMountPermission(dev_name, dir_name, MOUNT_MAKE_PRIVATE_KEYWORD, flags);  
                 *flags |= MS_PRIVATE;  
         } else if (*flags & MS_SLAVE) {  
                 *flags &= ~MS_SLAVE;  
                 error_flag = CheckMountPermission(dev_name, dir_name, MOUNT_MAKE_SLAVE_KEYWORD, flags);  
                 *flags |= MS_SLAVE;  
         } else if (*flags & MS_SHARED) {  
                 *flags &= ~MS_SHARED;  
                 error_flag = CheckMountPermission(dev_name, dir_name, MOUNT_MAKE_SHARED_KEYWORD, flags);  
                 *flags |= MS_SHARED;  
193          } else {          } else {
                 goto normal_mount;  
         }  
         if (error_flag) {  
                 if (is_enforce) return -EPERM;  
                 return 0;  
         }  
  normal_mount: ;  
         {  
194                  struct mount_entry *ptr;                  struct mount_entry *ptr;
195                  struct file_system_type *fstype = NULL;                  struct file_system_type *fstype = NULL;
196                  const char *requested_dir_name = NULL;                  const char *requested_dir_name = NULL;
# Line 276  int CheckMountPermission(char *dev_name, Line 198  int CheckMountPermission(char *dev_name,
198                  struct path_info rdev, rdir;                  struct path_info rdev, rdir;
199                  int need_dev = 0;                  int need_dev = 0;
200                                    
201                  if ((requested_dir_name = realpath(dir_name)) == NULL) goto cleanup;                  if ((requested_dir_name = realpath(dir_name)) == NULL) {
202                            error = -ENOENT;
203                            goto cleanup;
204                    }
205                  rdir.name = requested_dir_name;                  rdir.name = requested_dir_name;
206                  fill_path_info(&rdir);                  fill_path_info(&rdir);
207                    
208                  /* Compare fs name. */                  /* Compare fs name. */
209                  if (strcmp(type, MOUNT_REMOUNT_KEYWORD) == 0) {                  if (strcmp(type, MOUNT_REMOUNT_KEYWORD) == 0) {
210                          /* Needn't to resolve dev_name */                          /* Needn't to resolve dev_name */
211                  } else if (strcmp(type, MOUNT_MAKE_UNBINDABLE_KEYWORD) == 0 ||                  } else if (strcmp(type, MOUNT_MAKE_UNBINDABLE_KEYWORD) == 0 ||
212                                     strcmp(type, MOUNT_MAKE_PRIVATE_KEYWORD) == 0 ||                             strcmp(type, MOUNT_MAKE_PRIVATE_KEYWORD) == 0 ||
213                                     strcmp(type, MOUNT_MAKE_SLAVE_KEYWORD) == 0 ||                             strcmp(type, MOUNT_MAKE_SLAVE_KEYWORD) == 0 ||
214                                     strcmp(type, MOUNT_MAKE_SHARED_KEYWORD) == 0) {                             strcmp(type, MOUNT_MAKE_SHARED_KEYWORD) == 0) {
215                          /* Needn't to resolve dev_name */                          /* Needn't to resolve dev_name */
216                  } else if (strcmp(type, MOUNT_BIND_KEYWORD) == 0 || strcmp(type, MOUNT_MOVE_KEYWORD) == 0) {                  } else if (strcmp(type, MOUNT_BIND_KEYWORD) == 0 || strcmp(type, MOUNT_MOVE_KEYWORD) == 0) {
217                          if ((requested_dev_name = realpath(dev_name)) == NULL) goto cleanup;                          if ((requested_dev_name = realpath(dev_name)) == NULL) {
218                                    error = -ENOENT;
219                                    goto cleanup;
220                            }
221                          rdev.name = requested_dev_name;                          rdev.name = requested_dev_name;
222                          fill_path_info(&rdev);                          fill_path_info(&rdev);
223                          need_dev = -1;                          need_dev = -1; /* dev_name is a directory */
224                  } else if ((fstype = get_fs_type(type)) != NULL) {                  } else if ((fstype = get_fs_type(type)) != NULL) {
225                          if (fstype->fs_flags & FS_REQUIRES_DEV) {                          if (fstype->fs_flags & FS_REQUIRES_DEV) {
226                                  if ((requested_dev_name = realpath(dev_name)) == NULL) goto cleanup;                                  if ((requested_dev_name = realpath(dev_name)) == NULL) {
227                                            error = -ENOENT;
228                                            goto cleanup;
229                                    }
230                                  rdev.name = requested_dev_name;                                  rdev.name = requested_dev_name;
231                                  fill_path_info(&rdev);                                  fill_path_info(&rdev);
232                                  need_dev = 1;                                  need_dev = 1; /* dev_name is a block device file */
233                          }                          }
234                  } else {                  } else {
235                            error = -ENODEV;
236                          goto cleanup;                          goto cleanup;
237                  }                  }
238                  for (ptr = mount_list; ptr; ptr = ptr->next) {                  for (ptr = mount_list; ptr; ptr = ptr->next) {
239                          if (ptr->is_deleted) continue;                          if (ptr->is_deleted) continue;
240                                                    
241                            /* Compare options */
242                            if (ptr->flags != flags) continue;
243                            
244                          /* Compare fs name. */                          /* Compare fs name. */
245                          if (strcmp(type, ptr->fs_type->name)) continue;                          if (strcmp(type, ptr->fs_type->name)) continue;
246                                                    
# Line 316  int CheckMountPermission(char *dev_name, Line 251  int CheckMountPermission(char *dev_name,
251                          if (requested_dev_name && PathMatchesToPattern(&rdev, ptr->dev_name) == 0) continue;                          if (requested_dev_name && PathMatchesToPattern(&rdev, ptr->dev_name) == 0) continue;
252                                                    
253                          /* OK. */                          /* OK. */
254                          error_flag = 0;                          error = 0;
                         *flags &= ~ptr->disabled_options;  
                         *flags |= ptr->enabled_options;  
255                                                    
256                          if (need_dev > 0) {                          if (need_dev > 0) {
257                                  printk(KERN_DEBUG "SAKURA-NOTICE: 'mount -t %s %s %s' accepted.\n", type, requested_dev_name, requested_dir_name);                                  printk(KERN_DEBUG "SAKURA-NOTICE: 'mount -t %s %s %s 0x%lX' accepted.\n", type, requested_dev_name, requested_dir_name, flags);
258                          } else if (need_dev < 0) {                          } else if (need_dev < 0) {
259                                  printk(KERN_DEBUG "SAKURA-NOTICE: 'mount %s %s %s' accepted.\n", type, requested_dev_name, requested_dir_name);                                  printk(KERN_DEBUG "SAKURA-NOTICE: 'mount %s %s %s 0x%lX' accepted.\n", type, requested_dev_name, requested_dir_name, flags);
260                          } else if (strcmp(type, MOUNT_REMOUNT_KEYWORD) == 0) {                          } else if (strcmp(type, MOUNT_REMOUNT_KEYWORD) == 0) {
261                                  printk(KERN_DEBUG "SAKURA-NOTICE: 'mount -o remount %s' accepted.\n", requested_dir_name);                                  printk(KERN_DEBUG "SAKURA-NOTICE: 'mount -o remount %s 0x%lX' accepted.\n", requested_dir_name, flags);
262                          } else if (strcmp(type, MOUNT_MAKE_UNBINDABLE_KEYWORD) == 0 ||                          } else if (strcmp(type, MOUNT_MAKE_UNBINDABLE_KEYWORD) == 0 ||
263                                             strcmp(type, MOUNT_MAKE_PRIVATE_KEYWORD) == 0 ||                                     strcmp(type, MOUNT_MAKE_PRIVATE_KEYWORD) == 0 ||
264                                             strcmp(type, MOUNT_MAKE_SLAVE_KEYWORD) == 0 ||                                     strcmp(type, MOUNT_MAKE_SLAVE_KEYWORD) == 0 ||
265                                             strcmp(type, MOUNT_MAKE_SHARED_KEYWORD) == 0) {                                     strcmp(type, MOUNT_MAKE_SHARED_KEYWORD) == 0) {
266                                  printk(KERN_DEBUG "SAKURA-NOTICE: 'mount %s %s' accepted.\n", type, requested_dir_name);                                  printk(KERN_DEBUG "SAKURA-NOTICE: 'mount %s %s 0x%lX' accepted.\n", type, requested_dir_name, flags);
267                          } else {                          } else {
268                                  printk(KERN_DEBUG "SAKURA-NOTICE: 'mount %s on %s' accepted.\n", type, requested_dir_name);                                  printk(KERN_DEBUG "SAKURA-NOTICE: 'mount %s on %s 0x%lX' accepted.\n", type, requested_dir_name, flags);
269                          }                          }
270                          break;                          break;
271                  }                  }
272                  if (error_flag && !is_enforce && CheckCCSAccept(CCS_SAKURA_RESTRICT_MOUNT)) {                  if (error) {
273                          AddMountACL(need_dev ? requested_dev_name : dev_name, requested_dir_name, type, 0, 0, 0);                          const char *realname1 = realpath(dev_name), *realname2 = realpath(dir_name), *exename = GetEXE();
274                            if (strcmp(type, MOUNT_REMOUNT_KEYWORD) == 0) {
275                                    printk("SAKURA-%s: mount -o remount %s 0x%lX (pid=%d:exe=%s): Permission denied.\n", GetMSG(is_enforce), realname2 ? realname2 : dir_name, flags, current->pid, exename);
276                                    if (is_enforce && CheckSupervisor("# %s is requesting\nmount -o remount %s 0x%lX\n", exename, realname2 ? realname2 : dir_name, flags) == 0) error = 0;
277                            } else if (strcmp(type, MOUNT_BIND_KEYWORD) == 0 || strcmp(type, MOUNT_MOVE_KEYWORD) == 0) {
278                                    printk("SAKURA-%s: mount %s %s %s 0x%lX (pid=%d:exe=%s): Permission denied.\n", GetMSG(is_enforce), type, realname1 ? realname1 : dev_name, realname2 ? realname2 : dir_name, flags, current->pid, exename);
279                                    if (is_enforce && CheckSupervisor("# %s is requesting\nmount %s %s %s 0x%lX\n", exename, type, realname1 ? realname1 : dev_name, realname2 ? realname2 : dir_name, flags) == 0) error = 0;
280                            } else if (strcmp(type, MOUNT_MAKE_UNBINDABLE_KEYWORD) == 0 ||
281                                       strcmp(type, MOUNT_MAKE_PRIVATE_KEYWORD) == 0 ||
282                                       strcmp(type, MOUNT_MAKE_SLAVE_KEYWORD) == 0 ||
283                                       strcmp(type, MOUNT_MAKE_SHARED_KEYWORD) == 0) {
284                                    printk("SAKURA-%s: mount %s %s 0x%lX (pid=%d:exe=%s): Permission denied.\n", GetMSG(is_enforce), type, realname2 ? realname2 : dir_name, flags, current->pid, exename);
285                                    if (is_enforce && CheckSupervisor("# %s is requesting\nmount %s %s 0x%lX", exename, type, realname2 ? realname2 : dir_name, flags) == 0) error = 0;
286                            } else {
287                                    printk("SAKURA-%s: mount -t %s %s %s 0x%lX (pid=%d:exe=%s): Permission denied.\n", GetMSG(is_enforce), type, realname1 ? realname1 : dev_name, realname2 ? realname2 : dir_name, flags, current->pid, exename);
288                                    if (is_enforce && CheckSupervisor("# %s is requesting\nmount -t %s %s %s 0x%lX\n", exename, type, realname1 ? realname1 : dev_name, realname2 ? realname2 : dir_name, flags) == 0) error = 0;
289                            }
290                            ccs_free(exename);
291                            ccs_free(realname2);
292                            ccs_free(realname1);
293                    }
294                    if (error && !is_enforce && CheckCCSAccept(CCS_SAKURA_RESTRICT_MOUNT, NULL)) {
295                            AddMountACL(need_dev ? requested_dev_name : dev_name, requested_dir_name, type, flags, 0);
296                          UpdateCounter(CCS_UPDATES_COUNTER_SYSTEM_POLICY);                          UpdateCounter(CCS_UPDATES_COUNTER_SYSTEM_POLICY);
297                  }                  }
298          cleanup:          cleanup:
299                  if (requested_dev_name) ccs_free(requested_dev_name);                  ccs_free(requested_dev_name);
300                  if (requested_dir_name) ccs_free(requested_dir_name);                  ccs_free(requested_dir_name);
301                  if (fstype) put_filesystem(fstype);                  if (fstype) put_filesystem(fstype);
302          }          }
303            if (!is_enforce) error = 0;
304            return error;
305    }
306    
307          if (error_flag) {  /* This is a wrapper to allow use of 1.4.x patch for 1.5.x . */
308                  int error = -EPERM;  int CheckMountPermission(char *dev_name, char *dir_name, char *type, const unsigned long *flags)
309                  const int is_enforce = CheckCCSEnforce(CCS_SAKURA_RESTRICT_MOUNT);  {
310                  const char *realname1 = realpath(dev_name), *realname2 = realpath(dir_name), *exename = GetEXE();          return CheckMountPermission2(dev_name, dir_name, type, *flags);
                 if (strcmp(type, MOUNT_REMOUNT_KEYWORD) == 0) {  
                         printk("SAKURA-%s: mount -o remount %s (pid=%d:exe=%s): Permission denied.\n", GetMSG(is_enforce), realname2 ? realname2 : dir_name, current->pid, exename);  
                         if (is_enforce && CheckSupervisor("# %s is requesting\nmount -o remount %s\n", exename, realname2 ? realname2 : dir_name) == 0) error = 0;  
                 } else if (strcmp(type, MOUNT_BIND_KEYWORD) == 0 || strcmp(type, MOUNT_MOVE_KEYWORD) == 0) {  
                         printk("SAKURA-%s: mount %s %s %s (pid=%d:exe=%s): Permission denied.\n", GetMSG(is_enforce), type, realname1 ? realname1 : dev_name, realname2 ? realname2 : dir_name, current->pid, exename);  
                         if (is_enforce && CheckSupervisor("# %s is requesting\nmount %s %s %s\n", exename, type, realname1 ? realname1 : dev_name, realname2 ? realname2 : dir_name) == 0) error = 0;  
                 } else if (strcmp(type, MOUNT_MAKE_UNBINDABLE_KEYWORD) == 0 ||  
                                    strcmp(type, MOUNT_MAKE_PRIVATE_KEYWORD) == 0 ||  
                                    strcmp(type, MOUNT_MAKE_SLAVE_KEYWORD) == 0 ||  
                                    strcmp(type, MOUNT_MAKE_SHARED_KEYWORD) == 0) {  
                         printk("SAKURA-%s: mount %s %s (pid=%d:exe=%s): Permission denied.\n", GetMSG(is_enforce), type, realname2 ? realname2 : dir_name, current->pid, exename);  
                         if (is_enforce && CheckSupervisor("# %s is requesting\nmount %s %s", exename, type, realname2 ? realname2 : dir_name) == 0) error = 0;  
                 } else {  
                         printk("SAKURA-%s: mount -t %s %s %s (pid=%d:exe=%s): Permission denied.\n", GetMSG(is_enforce), type, realname1 ? realname1 : dev_name, realname2 ? realname2 : dir_name, current->pid, exename);  
                         if (is_enforce && CheckSupervisor("# %s is requesting\nmount -t %s %s %s\n", exename, type, realname1 ? realname1 : dev_name, realname2 ? realname2 : dir_name) == 0) error = 0;  
                 }  
                 if (exename) ccs_free(exename);  
                 if (realname2) ccs_free(realname2);  
                 if (realname1) ccs_free(realname1);  
                 if (is_enforce) return error;  
         }  
         return 0;  
311  }  }
312  EXPORT_SYMBOL(CheckMountPermission);  EXPORT_SYMBOL(CheckMountPermission);
313    
314  int AddMountPolicy(char *data, const int is_delete)  int AddMountPolicy(char *data, const bool is_delete)
315  {  {
316          char *cp, *cp2;          char *cp, *cp2;
317          const char *fs, *dev, *dir;          const char *fs, *dev, *dir;
318          unsigned int enable = 0, disable = 0;          unsigned long flags = 0;
319          cp2 = data; if ((cp = strchr(cp2, ' ')) == NULL) return -EINVAL; *cp = '\0'; dev = cp2;          cp2 = data; if ((cp = strchr(cp2, ' ')) == NULL) return -EINVAL; *cp = '\0'; dev = cp2;
320          cp2 = cp + 1; if ((cp = strchr(cp2, ' ')) == NULL) return -EINVAL; *cp = '\0'; dir = cp2;          cp2 = cp + 1; if ((cp = strchr(cp2, ' ')) == NULL) return -EINVAL; *cp = '\0'; dir = cp2;
321          cp2 = cp + 1;          cp2 = cp + 1; if ((cp = strchr(cp2, ' ')) == NULL) return -EINVAL; *cp = '\0'; fs = cp2;
322          if ((cp = strchr(cp2, ' ')) != NULL) {          flags = simple_strtoul(cp + 1, NULL, 0);
323                  *cp = '\0';          return AddMountACL(dev, dir, fs, flags, is_delete);
                 ParseMountOptions(cp + 1, &enable, &disable);  
         }  
         fs = cp2;  
         return AddMountACL(dev, dir, fs, enable, disable, is_delete);  
324  }  }
325    
326  int ReadMountPolicy(struct io_buffer *head)  int ReadMountPolicy(struct io_buffer *head)
# Line 396  int ReadMountPolicy(struct io_buffer *he Line 328  int ReadMountPolicy(struct io_buffer *he
328          struct mount_entry *ptr = head->read_var2;          struct mount_entry *ptr = head->read_var2;
329          if (!ptr) ptr = mount_list;          if (!ptr) ptr = mount_list;
330          while (ptr) {          while (ptr) {
                 char options[64];  
331                  head->read_var2 = ptr;                  head->read_var2 = ptr;
332                  MakeMountOptions(options, sizeof(options), ptr->enabled_options, ptr->disabled_options);                  if (ptr->is_deleted == 0 && io_printf(head, KEYWORD_ALLOW_MOUNT "%s %s %s 0x%lX\n", ptr->dev_name->name, ptr->dir_name->name, ptr->fs_type->name, ptr->flags)) break;
                 if (ptr->is_deleted == 0 && io_printf(head, KEYWORD_ALLOW_MOUNT "%s %s %s %s\n", ptr->dev_name->name, ptr->dir_name->name, ptr->fs_type->name, options)) break;  
333                  ptr = ptr->next;                  ptr = ptr->next;
334          }          }
335          return ptr ? -ENOMEM : 0;          return ptr ? -ENOMEM : 0;

Legend:
Removed from v.265  
changed lines
  Added in v.621

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26