#include "dazuko_linux26.h"
#include "dazuko_core.h"
#include "dazuko_linux26_device_def.h"
#include <linux/config.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/vermagic.h>
#include <linux/security.h>
#include <linux/namei.h>
#include <linux/dcache.h>
#include <linux/mount.h>
#include <linux/devfs_fs_kernel.h>
#include <linux/device.h>
#include <linux/suspend.h>
#include <asm/uaccess.h>
Go to the source code of this file.
Defines | |
#define | DAZUKO_DM 0 |
#define | CHROOT_EVENT_STRING "chroot:" |
#define | CHROOT_EVENT_LENGTH 7 |
Functions | |
char * | __d_path (struct dentry *, struct vfsmount *, struct dentry *, struct vfsmount *, char *, int) |
ssize_t | linux_dazuko_device_read (struct file *, char __user *, size_t, loff_t *) |
ssize_t | linux_dazuko_device_write (struct file *, const char __user *, size_t, loff_t *) |
int | linux_dazuko_device_open (struct inode *, struct file *) |
int | linux_dazuko_device_ioctl (struct inode *inode, struct file *file, unsigned int cmd, unsigned long param) |
int | linux_dazuko_device_release (struct inode *, struct file *) |
static int | dazuko_sys_generic (struct inode *inode, int mask, struct nameidata *nd) |
int | dazuko_register_security (const char *name, struct security_operations *ops) |
int | dazuko_unregister_security (const char *name, struct security_operations *ops) |
void | xp_init_mutex (struct xp_mutex *mutex) |
void | xp_down (struct xp_mutex *mutex) |
void | xp_up (struct xp_mutex *mutex) |
void | xp_destroy_mutex (struct xp_mutex *mutex) |
void | xp_init_rwlock (struct xp_rwlock *rwlock) |
void | xp_write_lock (struct xp_rwlock *rwlock) |
void | xp_write_unlock (struct xp_rwlock *rwlock) |
void | xp_read_lock (struct xp_rwlock *rlock) |
void | xp_read_unlock (struct xp_rwlock *rlock) |
void | xp_destroy_rwlock (struct xp_rwlock *rwlock) |
int | xp_init_queue (struct xp_queue *queue) |
int | xp_wait_until_condition (struct xp_queue *queue, int(*cfunction)(void *), void *cparam, int allow_interrupt) |
int | xp_notify (struct xp_queue *queue) |
int | xp_destroy_queue (struct xp_queue *queue) |
void * | xp_malloc (size_t size) |
int | xp_free (void *ptr) |
int | xp_copyin (const void *user_src, void *kernel_dest, size_t size) |
int | xp_copyout (const void *kernel_src, void *user_dest, size_t size) |
int | xp_verify_user_writable (const void *user_ptr, size_t size) |
int | xp_verify_user_readable (const void *user_ptr, size_t size) |
int | xp_is_absolute_path (const char *path) |
int | xp_atomic_set (struct xp_atomic *atomic, int value) |
int | xp_atomic_inc (struct xp_atomic *atomic) |
int | xp_atomic_dec (struct xp_atomic *atomic) |
int | xp_atomic_read (struct xp_atomic *atomic) |
static int | dazuko_get_full_filename (struct xp_file_struct *xfs) |
static int | dazuko_fill_file_struct_cleanup (struct dazuko_file_struct *dfs) |
int | xp_fill_file_struct (struct dazuko_file_struct *dfs) |
static int | dazuko_file_struct_cleanup (struct dazuko_file_struct **dfs) |
static int | check_parent (struct task_struct *parent, struct task_struct *child) |
int | xp_id_compare (struct xp_daemon_id *id1, struct xp_daemon_id *id2, int check_related) |
int | xp_id_free (struct xp_daemon_id *id) |
xp_daemon_id * | xp_id_copy (struct xp_daemon_id *id) |
int | xp_set_event_properties (struct event_properties *event_p, struct xp_daemon_id *xp_id) |
int | xp_init_cache (unsigned long ttl) |
int | xp_sys_hook () |
int | xp_sys_unhook () |
int | xp_print (const char *fmt,...) |
ssize_t | linux_dazuko_device_read (struct file *file, char *buffer, size_t length, loff_t *pos) |
ssize_t | linux_dazuko_device_write (struct file *file, const char *buffer, size_t length, loff_t *pos) |
static int __init | linux_dazuko_init (void) |
static void __exit | linux_dazuko_exit (void) |
MODULE_AUTHOR ("H+BEDV Datentechnik GmbH <linux_support@antivir.de>") | |
MODULE_DESCRIPTION ("allow 3rd-party file access control") | |
MODULE_LICENSE ("GPL") | |
MODULE_INFO (vermagic, VERMAGIC_STRING) | |
security_initcall (linux_dazuko_init) | |
module_exit (linux_dazuko_exit) | |
Variables | |
static struct class_simple * | dazuko_class = NULL |
static struct vfsmount * | orig_rootmnt = NULL |
static struct dentry * | orig_root = NULL |
static int | dev_major = -1 |
security_operations | dazuko_security_ops |
security_operations | dazuko_register_security_ops |
static struct security_operations | dazuko_security_default_ops |
static int | secondary_register = 0 |
static struct file_operations | fops |
|
Definition at line 47 of file dazuko_linux26.c. Referenced by dazuko_get_full_filename(), and xp_is_absolute_path(). |
|
Definition at line 46 of file dazuko_linux26.c. Referenced by dazuko_get_full_filename(), and xp_is_absolute_path(). |
|
Definition at line 42 of file dazuko_linux26.c. |
|
|
|
Definition at line 581 of file dazuko_linux26.c. References NULL. 00582 { 00583 struct task_struct *ts = child; 00584 00585 if (parent == NULL || child == NULL) 00586 return -1; 00587 00588 while (1) 00589 { 00590 if (ts == parent) 00591 return 0; 00592 00593 if (ts->parent == NULL) 00594 break; 00595 00596 if (ts == ts->parent) 00597 break; 00598 00599 ts = ts->parent; 00600 } 00601 00602 return -1; 00603 }
|
|
Definition at line 555 of file dazuko_linux26.c. References NULL, and xp_free(). 00556 { 00557 if (dfs == NULL) 00558 return 0; 00559 00560 if (*dfs == NULL) 00561 return 0; 00562 00563 if ((*dfs)->extra_data) 00564 { 00565 if ((*dfs)->extra_data->free_full_filename) 00566 xp_free((*dfs)->extra_data->full_filename); 00567 00568 xp_free((*dfs)->extra_data); 00569 } 00570 00571 xp_free(*dfs); 00572 00573 *dfs = NULL; 00574 00575 return 0; 00576 }
|
|
Definition at line 488 of file dazuko_linux26.c. References xp_file_struct::buffer, xp_file_struct::dentry, xp_file_struct::dput_dentry, dazuko_file_struct::extra_data, xp_file_struct::free_page_buffer, xp_file_struct::mntput_vfsmount, NULL, and xp_file_struct::vfsmount. 00489 { 00490 if (dfs == NULL) 00491 return 0; 00492 00493 if (dfs->extra_data == NULL) 00494 return 0; 00495 00496 if (dfs->extra_data->free_page_buffer) 00497 { 00498 free_page((unsigned long)dfs->extra_data->buffer); 00499 dfs->extra_data->free_page_buffer = 0; 00500 } 00501 00502 if (dfs->extra_data->dput_dentry) 00503 { 00504 dput(dfs->extra_data->dentry); 00505 dfs->extra_data->dput_dentry = 0; 00506 } 00507 00508 if (dfs->extra_data->mntput_vfsmount) 00509 { 00510 mntput(dfs->extra_data->vfsmount); 00511 dfs->extra_data->mntput_vfsmount = 0; 00512 } 00513 00514 return 0; 00515 }
|
|
Definition at line 381 of file dazuko_linux26.c. References __d_path(), xp_file_struct::buffer, CHROOT_EVENT_LENGTH, CHROOT_EVENT_STRING, dazuko_get_filename_length(), xp_file_struct::dentry, xp_file_struct::dput_dentry, xp_file_struct::free_full_filename, xp_file_struct::free_page_buffer, xp_file_struct::full_filename, xp_file_struct::full_filename_length, xp_file_struct::inode, xp_file_struct::mntput_vfsmount, xp_file_struct::nd, NULL, orig_root, orig_rootmnt, xp_file_struct::vfsmount, and xp_malloc(). 00382 { 00383 struct vfsmount *rootmnt; 00384 struct dentry *root; 00385 char *temp; 00386 #ifdef USE_CHROOT 00387 int chrooted = 0; 00388 #endif 00389 00390 if (xfs == NULL) 00391 return 0; 00392 00393 if (xfs->inode == NULL) 00394 return 0; 00395 00396 #ifndef DAZUKO_FIST 00397 if (S_ISDIR(xfs->inode->i_mode)) 00398 return 0; 00399 #endif 00400 00401 if (xfs->nd == NULL || xfs->free_full_filename) 00402 return 0; 00403 00404 if (xfs->nd->mnt == NULL || xfs->nd->dentry == NULL) 00405 return 0; 00406 00407 /* check if we need to allocate a buffer */ 00408 if (!xfs->free_page_buffer) 00409 { 00410 /* get pre-requisites for d_path function */ 00411 xfs->buffer = (char *)__get_free_page(GFP_USER); 00412 00413 /* make sure we got a page */ 00414 if (xfs->buffer == NULL) 00415 return 0; 00416 00417 /* the buffer will need to be freed */ 00418 xfs->free_page_buffer = 1; 00419 } 00420 00421 /* make sure we don't already have a vfsmount */ 00422 if (!xfs->mntput_vfsmount) 00423 { 00424 xfs->vfsmount = mntget(xfs->nd->mnt); 00425 00426 /* the vfsmount will need to be put back */ 00427 xfs->mntput_vfsmount = 1; 00428 } 00429 00430 /* make sure we don't already have a dentry */ 00431 if (!xfs->dput_dentry) 00432 { 00433 xfs->dentry = dget(xfs->nd->dentry); 00434 00435 /* the dentry will need to be put back */ 00436 xfs->dput_dentry = 1; 00437 } 00438 00439 rootmnt = mntget(orig_rootmnt); 00440 root = dget(orig_root); 00441 00442 #ifdef USE_CHROOT 00443 temp = d_path(xfs->dentry, xfs->vfsmount, xfs->buffer, PAGE_SIZE); 00444 00445 if (orig_root != current->fs->root) 00446 chrooted = 1; 00447 #else 00448 spin_lock(&dcache_lock); 00449 temp = __d_path(xfs->dentry, xfs->vfsmount, root, rootmnt, xfs->buffer, PAGE_SIZE); 00450 spin_unlock(&dcache_lock); 00451 #endif 00452 00453 dput(root); 00454 mntput(rootmnt); 00455 00456 /* make sure we really got a new filename */ 00457 if (temp == NULL) 00458 return 0; 00459 00460 xfs->full_filename_length = dazuko_get_filename_length(temp); 00461 00462 #ifdef USE_CHROOT 00463 if (chrooted) 00464 xfs->full_filename_length += CHROOT_EVENT_LENGTH; 00465 #endif 00466 xfs->full_filename = (char *)xp_malloc(xfs->full_filename_length + 1); 00467 if (xfs->full_filename == NULL) 00468 return 0; 00469 00470 /* the char array will need to be freed */ 00471 xfs->free_full_filename = 1; 00472 00473 #ifdef USE_CHROOT 00474 if (chrooted) 00475 { 00476 memcpy(xfs->full_filename, CHROOT_EVENT_STRING, CHROOT_EVENT_LENGTH + 1); 00477 memcpy(xfs->full_filename + CHROOT_EVENT_LENGTH, temp, xfs->full_filename_length - CHROOT_EVENT_LENGTH + 1); 00478 } 00479 else 00480 #endif 00481 memcpy(xfs->full_filename, temp, xfs->full_filename_length + 1); 00482 00483 /* we have a filename with the full path */ 00484 00485 return 1; 00486 }
|
|
Definition at line 687 of file dazuko_linux26.c. References dazuko_security_default_ops, dazuko_security_ops, NULL, XP_ERROR_FAULT, and XP_ERROR_PERMISSION. 00688 { 00689 char *daz_p; 00690 char *ext_p; 00691 char *def_p; 00692 char *end_p; 00693 void **ext_func_p; 00694 void **def_func_p; 00695 void **daz_func_p; 00696 void *ext_func; 00697 void *def_func; 00698 void *daz_func; 00699 int error = 0; 00700 00701 if (name == NULL || ops == NULL) 00702 return XP_ERROR_PERMISSION; 00703 00704 /* basic allignment checking (there should only be function 00705 * pointers in this structure) 00706 */ 00707 if (sizeof(struct security_operations) % sizeof(void *) != 0) 00708 return XP_ERROR_FAULT; 00709 00710 /* first check if all requested hooks are available */ 00711 00712 /* note: ops is filled with default functions for functions 00713 * that were specified with NULL 00714 */ 00715 00716 #ifdef NO_CAPABILITIES 00717 /* we have do do an extra check if there are no capabilities 00718 * because we never hooked these functions (see dazuko_linux26_lsm.h) 00719 */ 00720 00721 if (lsm_capability_compare(ops, &dazuko_security_default_ops) != 0) 00722 return XP_ERROR_PERMISSION; 00723 #endif 00724 00725 ext_p = (char *)ops; 00726 def_p = (char *)&dazuko_security_default_ops; 00727 daz_p = (char *)&dazuko_security_ops; 00728 end_p = daz_p + sizeof(dazuko_security_ops); 00729 00730 while (daz_p < end_p) 00731 { 00732 daz_func_p = (void **)daz_p; 00733 ext_func_p = (void **)ext_p; 00734 def_func_p = (void **)def_p; 00735 00736 daz_func = *daz_func_p; 00737 ext_func = *ext_func_p; 00738 def_func = *def_func_p; 00739 00740 if (ext_func != def_func && daz_func != NULL) 00741 { 00742 error = 1; 00743 break; 00744 } 00745 00746 daz_p += sizeof(void *); 00747 ext_p += sizeof(void *); 00748 def_p += sizeof(void *); 00749 } 00750 00751 if (error) 00752 { 00753 /* some requested hooks are not available */ 00754 00755 return XP_ERROR_PERMISSION; 00756 } 00757 00758 /* install the requested hooks */ 00759 00760 ext_p = (char *)ops; 00761 def_p = (char *)&dazuko_security_default_ops; 00762 daz_p = (char *)&dazuko_security_ops; 00763 end_p = daz_p + sizeof(dazuko_security_ops); 00764 00765 while (daz_p < end_p) 00766 { 00767 daz_func_p = (void **)daz_p; 00768 ext_func_p = (void **)ext_p; 00769 def_func_p = (void **)def_p; 00770 00771 daz_func = *daz_func_p; 00772 ext_func = *ext_func_p; 00773 def_func = *def_func_p; 00774 00775 if (ext_func != def_func && daz_func == NULL) 00776 { 00777 *daz_func_p = ext_func; 00778 } 00779 00780 daz_p += sizeof(void *); 00781 ext_p += sizeof(void *); 00782 def_p += sizeof(void *); 00783 } 00784 00785 return 0; 00786 }
|
|
Definition at line 846 of file dazuko_linux26.c. References dazuko_bzero(), dazuko_check_access(), dazuko_file_struct_cleanup(), DAZUKO_ON_EXEC, DAZUKO_ON_OPEN, dazuko_process_access(), xp_daemon_id::file, xp_file_struct::inode, xp_file_struct::nd, NULL, xp_daemon_id::pid, XP_ERROR_PERMISSION, xp_free(), and xp_malloc(). Referenced by xp_sys_hook(). 00848 { 00849 struct dazuko_file_struct *dfs = NULL; 00850 int error = 0; 00851 int check_error = 0; 00852 struct event_properties event_p; 00853 struct xp_daemon_id xp_id; 00854 struct slot_list *sl = NULL; 00855 #ifndef DAZUKO_FIST 00856 int event = DAZUKO_ON_OPEN; 00857 int daemon_is_allowed = 1; 00858 #endif 00859 00860 dazuko_bzero(&event_p, sizeof(event_p)); 00861 00862 #ifdef DAZUKO_FIST 00863 if (inode == NULL || nd == NULL) 00864 return XP_ERROR_PERMISSION; 00865 #else 00866 if ((mask & MAY_EXEC) != 0) 00867 { 00868 event = DAZUKO_ON_EXEC; 00869 daemon_is_allowed = 0; 00870 } 00871 else 00872 { 00873 /* mask == 0 is passed in when a file is created */ 00874 if (mask == 0 || (mask & (MAY_WRITE|MAY_APPEND)) != 0) 00875 { 00876 if ((mask & MAY_READ) != 0) 00877 { 00878 event_p.flags = O_RDWR; 00879 } 00880 else 00881 { 00882 event_p.flags = O_WRONLY; 00883 } 00884 00885 event_p.set_flags = 1; 00886 } 00887 else if ((mask & MAY_READ) != 0) 00888 { 00889 event_p.flags = O_RDONLY; 00890 event_p.set_flags = 1; 00891 } 00892 } 00893 #endif 00894 00895 xp_id.pid = current->pid; 00896 xp_id.file = NULL; 00897 xp_id.current_p = current; 00898 xp_id.files = current->files; 00899 00900 check_error = dazuko_check_access(event, daemon_is_allowed, &xp_id, &sl); 00901 00902 if (!check_error) 00903 { 00904 event_p.mode = inode->i_mode; 00905 event_p.set_mode = 1; 00906 event_p.pid = current->pid; 00907 event_p.set_pid = 1; 00908 event_p.uid = current->uid; 00909 event_p.set_uid = 1; 00910 00911 dfs = (struct dazuko_file_struct *)xp_malloc(sizeof(struct dazuko_file_struct)); 00912 if (dfs != NULL) 00913 { 00914 dazuko_bzero(dfs, sizeof(struct dazuko_file_struct)); 00915 00916 dfs->extra_data = (struct xp_file_struct *)xp_malloc(sizeof(struct xp_file_struct)); 00917 if (dfs->extra_data != NULL) 00918 { 00919 dazuko_bzero(dfs->extra_data, sizeof(struct xp_file_struct)); 00920 00921 dfs->extra_data->nd = nd; 00922 dfs->extra_data->inode = inode; 00923 00924 error = dazuko_process_access(event, dfs, &event_p, sl); 00925 } 00926 else 00927 { 00928 xp_free(dfs); 00929 dfs = NULL; 00930 } 00931 00932 dazuko_file_struct_cleanup(&dfs); 00933 } 00934 } 00935 00936 if (error) 00937 return XP_ERROR_PERMISSION; 00938 00939 return 0; 00940 }
|
|
Definition at line 788 of file dazuko_linux26.c. References dazuko_security_default_ops, dazuko_security_ops, NULL, XP_ERROR_FAULT, and XP_ERROR_PERMISSION. 00789 { 00790 char *daz_p; 00791 char *ext_p; 00792 char *def_p; 00793 char *end_p; 00794 void **ext_func_p; 00795 void **def_func_p; 00796 void **daz_func_p; 00797 void *ext_func; 00798 void *def_func; 00799 void *daz_func; 00800 00801 if (name == NULL || ops == NULL) 00802 return XP_ERROR_PERMISSION; 00803 00804 /* basic allignment checking (there should only be function 00805 * pointers in this structure) 00806 */ 00807 if (sizeof(struct security_operations) % sizeof(void *) != 0) 00808 return XP_ERROR_FAULT; 00809 00810 /* first check if all requested hooks are available */ 00811 00812 ext_p = (char *)ops; 00813 def_p = (char *)&dazuko_security_default_ops; 00814 daz_p = (char *)&dazuko_security_ops; 00815 end_p = daz_p + sizeof(dazuko_security_ops); 00816 00817 while (daz_p < end_p) 00818 { 00819 daz_func_p = (void **)daz_p; 00820 ext_func_p = (void **)ext_p; 00821 def_func_p = (void **)def_p; 00822 00823 daz_func = *daz_func_p; 00824 ext_func = *ext_func_p; 00825 def_func = *def_func_p; 00826 00827 if (ext_func != def_func && daz_func == ext_func) 00828 { 00829 *daz_func_p = NULL; 00830 } 00831 00832 daz_p += sizeof(void *); 00833 ext_p += sizeof(void *); 00834 def_p += sizeof(void *); 00835 } 00836 00837 return 0; 00838 }
|
|
|
|
|
|
Definition at line 1137 of file dazuko_linux26.c. References dazuko_bzero(), dazuko_snprintf(), dev_major, DPRINT, xp_copyout(), XP_ERROR_FAULT, XP_ERROR_INVALID, XP_ERROR_NODEVICE, and xp_print(). 01138 { 01139 /* Reading from the dazuko device simply 01140 * returns the device number. This is to 01141 * help out the daemon. */ 01142 01143 char tmp[20]; 01144 size_t dev_major_len; 01145 01146 DPRINT(("dazuko: linux_dazuko_device_read() [%d]\n", current->pid)); 01147 01148 if (*pos != 0) 01149 return 0; 01150 01151 if (dev_major < 0) 01152 return XP_ERROR_NODEVICE; 01153 01154 /* print dev_major to a string 01155 * and get length (with terminator) */ 01156 dazuko_bzero(tmp, sizeof(tmp)); 01157 01158 dev_major_len = dazuko_snprintf(tmp, sizeof(tmp), "%d", dev_major) + 1; 01159 01160 if (tmp[sizeof(tmp)-1] != 0) 01161 { 01162 xp_print("dazuko: failing device_read, device number overflow for dameon %d (dev_major=%d)\n", current->pid, dev_major); 01163 return XP_ERROR_FAULT; 01164 } 01165 01166 if (length < dev_major_len) 01167 return XP_ERROR_INVALID; 01168 01169 /* copy dev_major string to userspace */ 01170 if (xp_copyout(tmp, buffer, dev_major_len) != 0) 01171 return XP_ERROR_FAULT; 01172 01173 *pos += dev_major_len; 01174 01175 return dev_major_len; 01176 }
|
|
|
|
|
|
Definition at line 1178 of file dazuko_linux26.c. References dazuko_handle_user_request(), xp_daemon_id::file, xp_daemon_id::pid, xp_copyin(), XP_ERROR_FAULT, and XP_ERROR_INTERRUPT. 01179 { 01180 struct xp_daemon_id xp_id; 01181 char tmpbuffer[32]; 01182 int size; 01183 01184 size = length; 01185 if (length >= sizeof(tmpbuffer)) 01186 size = sizeof(tmpbuffer) -1; 01187 01188 /* copy request pointer string to kernelspace */ 01189 if (xp_copyin(buffer, tmpbuffer, size) != 0) 01190 return XP_ERROR_FAULT; 01191 01192 tmpbuffer[size] = 0; 01193 01194 xp_id.pid = current->pid; 01195 xp_id.file = file; 01196 xp_id.current_p = current; 01197 xp_id.files = current->files; 01198 01199 if (dazuko_handle_user_request(tmpbuffer, &xp_id) == 0) 01200 return size; 01201 01202 return XP_ERROR_INTERRUPT; 01203 }
|
|
|
|
Definition at line 1259 of file dazuko_linux26.c. References dazuko_exit(). 01260 { 01261 dazuko_exit(); 01262 }
|
|
Definition at line 1254 of file dazuko_linux26.c. References dazuko_init(). 01255 { 01256 return dazuko_init(); 01257 }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Definition at line 281 of file dazuko_linux26.c. References xp_atomic::atomic. 00282 { 00283 atomic_dec(&(atomic->atomic)); 00284 return 0; 00285 }
|
|
Definition at line 275 of file dazuko_linux26.c. References xp_atomic::atomic. 00276 { 00277 atomic_inc(&(atomic->atomic)); 00278 return 0; 00279 }
|
|
Definition at line 287 of file dazuko_linux26.c. References xp_atomic::atomic. 00288 { 00289 return atomic_read(&(atomic->atomic)); 00290 }
|
|
Definition at line 269 of file dazuko_linux26.c. References xp_atomic::atomic. 00270 { 00271 atomic_set(&(atomic->atomic), value); 00272 return 0; 00273 }
|
|
Definition at line 227 of file dazuko_linux26.c. 00228 {
00229 return copy_from_user(kernel_dest, user_src, size);
00230 }
|
|
Definition at line 232 of file dazuko_linux26.c. 00233 {
00234 return copy_to_user(user_dest, kernel_src, size);
00235 }
|
|
Definition at line 120 of file dazuko_linux26.c. 00121 { 00122 }
|
|
Definition at line 208 of file dazuko_linux26.c. 00209 {
00210 return 0;
00211 }
|
|
Definition at line 152 of file dazuko_linux26.c. 00153 { 00154 }
|
|
Definition at line 110 of file dazuko_linux26.c. References xp_mutex::mutex. 00111 { 00112 down(&(mutex->mutex)); 00113 }
|
|
|
Definition at line 221 of file dazuko_linux26.c. 00222 {
00223 kfree(ptr);
00224 return 0;
00225 }
|
|
Definition at line 605 of file dazuko_linux26.c. References check_parent, DAZUKO_CHILD, DAZUKO_DIFFERENT, DAZUKO_SAME, DAZUKO_SUSPICIOUS, xp_daemon_id::file, NULL, and xp_daemon_id::pid. 00606 { 00607 if (id1 == NULL || id2 == NULL) 00608 return DAZUKO_DIFFERENT; 00609 00610 /* if file's are available and they match, 00611 * then we say that the id's match 00612 * ("file" is only used to unregister daemons and 00613 * here we allow other processes to do this) 00614 * Note: this is a Linux-only "hack" */ 00615 if (id1->file != NULL && id1->file == id2->file) 00616 return DAZUKO_SAME; 00617 00618 if (id1->pid == id2->pid && id1->current_p == id2->current_p && id1->files == id2->files) 00619 return DAZUKO_SAME; 00620 00621 if (check_related) 00622 { 00623 if (check_parent(id1->current_p, id2->current_p) == 0) 00624 { 00625 return DAZUKO_CHILD; 00626 } 00627 else if (id1->pid == id2->pid || id1->current_p == id2->current_p || id1->files == id2->files) 00628 { 00629 return DAZUKO_SUSPICIOUS; 00630 } 00631 } 00632 00633 return DAZUKO_DIFFERENT; 00634 }
|
|
Definition at line 643 of file dazuko_linux26.c. References xp_daemon_id::file, NULL, xp_daemon_id::pid, and xp_malloc(). 00644 { 00645 struct xp_daemon_id *ptr; 00646 00647 if (id == NULL) 00648 return NULL; 00649 00650 ptr = (struct xp_daemon_id *)xp_malloc(sizeof(struct xp_daemon_id)); 00651 00652 if (ptr != NULL) 00653 { 00654 ptr->pid = id->pid; 00655 ptr->file = id->file; 00656 ptr->current_p = id->current_p; 00657 ptr->files = id->files; 00658 } 00659 00660 return ptr; 00661 }
|
|
Definition at line 636 of file dazuko_linux26.c. References xp_free(). 00637 { 00638 xp_free(id); 00639 00640 return 0; 00641 }
|
|
Definition at line 677 of file dazuko_linux26.c. 00678 {
00679 return -1;
00680 }
|
|
Definition at line 105 of file dazuko_linux26.c. References xp_mutex::mutex. 00106 { 00107 init_MUTEX(&(mutex->mutex)); 00108 }
|
|
Definition at line 159 of file dazuko_linux26.c. References xp_queue::queue. 00160 { 00161 init_waitqueue_head(&(queue->queue)); 00162 return 0; 00163 }
|
|
Definition at line 127 of file dazuko_linux26.c. References xp_rwlock::rwlock. 00128 { 00129 rwlock_init(&(rwlock->rwlock)); 00130 }
|
|
Definition at line 250 of file dazuko_linux26.c. References CHROOT_EVENT_LENGTH, CHROOT_EVENT_STRING, and dazuko_get_filename_length(). 00251 { 00252 if (path[0] == '/') 00253 return 1; 00254 00255 #ifdef USE_CHROOT 00256 if (dazuko_get_filename_length(path) >= CHROOT_EVENT_LENGTH) 00257 { 00258 if (memcmp(CHROOT_EVENT_STRING, path, CHROOT_EVENT_LENGTH) == 0) 00259 return 1; 00260 } 00261 #endif 00262 00263 return 0; 00264 }
|
|
Definition at line 216 of file dazuko_linux26.c. 00217 {
00218 return kmalloc(size, GFP_ATOMIC);
00219 }
|
|
Definition at line 202 of file dazuko_linux26.c. References xp_queue::queue. 00203 { 00204 wake_up(&(queue->queue)); 00205 return 0; 00206 }
|
|
Definition at line 1099 of file dazuko_linux26.c. References dazuko_get_filename_length(), NULL, xp_free(), and xp_malloc(). 01100 { 01101 va_list args; 01102 char *p; 01103 size_t size = 1024; 01104 int length; 01105 01106 p = (char *)xp_malloc(size); 01107 if (p == NULL) 01108 return -1; 01109 01110 length = dazuko_get_filename_length(KERN_INFO); 01111 01112 memcpy(p, KERN_INFO, length); 01113 01114 va_start(args, fmt); 01115 vsnprintf(p + length, size - length, fmt, args); 01116 va_end(args); 01117 01118 p[size-1] = 0; 01119 01120 printk(p); 01121 01122 xp_free(p); 01123 01124 return 0; 01125 }
|
|
Definition at line 142 of file dazuko_linux26.c. References xp_rwlock::rwlock. 00143 { 00144 read_lock(&(rlock->rwlock)); 00145 }
|
|
Definition at line 147 of file dazuko_linux26.c. References xp_rwlock::rwlock. 00148 { 00149 read_unlock(&(rlock->rwlock)); 00150 }
|
|
Definition at line 666 of file dazuko_linux26.c. References xp_daemon_id::pid.
|
|
Definition at line 942 of file dazuko_linux26.c. References dazuko_class, DAZUKO_DM, dazuko_register_security_ops, dazuko_security_default_ops, dazuko_security_ops, dazuko_sys_generic(), dev_major, DEVICE_NAME, fops, NULL, orig_root, orig_rootmnt, secondary_register, XP_ERROR_INVALID, and xp_print(). 00943 { 00944 #ifndef DAZUKO_FIST 00945 #ifndef NO_STACKING_SUPPORT 00946 struct security_operations dummy_ops; 00947 int got_dummy = 0; 00948 #endif 00949 00950 /* Make sure we have a valid task_struct. */ 00951 00952 if (current == NULL) 00953 { 00954 xp_print("dazuko: panic (current == NULL)\n"); 00955 return -1; 00956 } 00957 if (current->fs == NULL) 00958 { 00959 xp_print("dazuko: panic (current->fs == NULL)\n"); 00960 return -1; 00961 } 00962 if (current->fs->root == NULL) 00963 { 00964 xp_print("dazuko: panic (current->fs->root == NULL)\n"); 00965 return -1; 00966 } 00967 if (current->fs->rootmnt == NULL) 00968 { 00969 xp_print("dazuko: panic (current->fs->rootmnt == NULL)\n"); 00970 return -1; 00971 } 00972 00973 00974 #ifdef USE_CHROOT 00975 xp_print("dazuko: info: using chroot events for chroot'd processes\n"); 00976 #endif 00977 #if defined(CONFIG_SMP) && defined(WITH_LOCAL_DPATH) 00978 xp_print("dazuko: warning: using local __dpath() dangerous for SMP kernels\n"); 00979 #endif 00980 #endif 00981 00982 /* Grab the current root. This is assumed to be the real. 00983 * If it is not the real root, we could have problems 00984 * looking up filenames. */ 00985 00986 read_lock(¤t->fs->lock); 00987 orig_rootmnt = current->fs->rootmnt; 00988 orig_root = current->fs->root; 00989 read_unlock(¤t->fs->lock); 00990 00991 #ifndef DAZUKO_FIST 00992 #ifdef NO_STACKING_SUPPORT 00993 memset(&dazuko_security_ops, 0, sizeof(dazuko_security_ops)); 00994 dazuko_security_ops.inode_permission = dazuko_sys_generic; 00995 00996 if (register_security(&dazuko_security_ops) != 0) 00997 { 00998 if (mod_reg_security(DEVICE_NAME, &dazuko_security_ops) != 0) 00999 { 01000 xp_print("dazuko: failed to register\n"); 01001 return XP_ERROR_INVALID; 01002 } 01003 01004 secondary_register = 1; 01005 xp_print("dazuko: warning: registered as secondary module\n"); 01006 } 01007 #else 01008 /* grab security defaults if we can */ 01009 01010 memset(&dazuko_security_default_ops, 0, sizeof(dazuko_security_default_ops)); 01011 01012 memset(&dummy_ops, 0, sizeof(dummy_ops)); 01013 if (register_security(&dummy_ops) == 0) 01014 { 01015 memcpy(&dazuko_security_default_ops, &dummy_ops, sizeof(dazuko_security_default_ops)); 01016 unregister_security(&dummy_ops); 01017 01018 got_dummy = 1; 01019 } 01020 01021 /* register with the security manager */ 01022 01023 memset(&dazuko_security_ops, 0, sizeof(dazuko_security_ops)); 01024 dazuko_security_ops.inode_permission = dazuko_sys_generic; 01025 01026 if (!got_dummy || register_security(&dazuko_register_security_ops) != 0) 01027 { 01028 /* register as secondary, but with no stacking support */ 01029 if (mod_reg_security(DEVICE_NAME, &dazuko_security_ops) != 0) 01030 { 01031 xp_print("dazuko: failed to register\n"); 01032 return XP_ERROR_INVALID; 01033 } 01034 01035 secondary_register = 1; 01036 xp_print("dazuko: warning: registered as secondary module\n"); 01037 } 01038 #endif 01039 #endif 01040 01041 dev_major = register_chrdev(DAZUKO_DM, DEVICE_NAME, &fops); 01042 if (dev_major < 0) 01043 { 01044 xp_print("dazuko: unable to register device, err=%d\n", dev_major); 01045 return dev_major; 01046 } 01047 01048 devfs_mk_cdev(MKDEV(dev_major, 0), S_IFCHR | S_IRUSR | S_IWUSR, DEVICE_NAME); 01049 01050 #ifdef USE_CLASS 01051 dazuko_class = class_create(THIS_MODULE, "dazuko"); 01052 #ifdef CLASS_class_device_create_2_6_15 01053 class_device_create(dazuko_class, NULL, MKDEV(dev_major, 0), NULL, "dazuko"); 01054 #else 01055 class_device_create(dazuko_class, MKDEV(dev_major, 0), NULL, "dazuko"); 01056 #endif 01057 #else 01058 dazuko_class = class_simple_create(THIS_MODULE, "dazuko"); 01059 class_simple_device_add(dazuko_class, MKDEV(dev_major, 0), NULL, "dazuko"); 01060 #endif 01061 01062 return 0; 01063 }
|
|
Definition at line 1065 of file dazuko_linux26.c. References dazuko_class, dazuko_register_security_ops, dazuko_security_ops, dev_major, DEVICE_NAME, and secondary_register. 01066 { 01067 unregister_chrdev(dev_major, DEVICE_NAME); 01068 01069 devfs_remove(DEVICE_NAME); 01070 01071 #ifdef USE_CLASS 01072 class_device_destroy(dazuko_class, MKDEV(dev_major, 0)); 01073 class_destroy(dazuko_class); 01074 #else 01075 class_simple_device_remove(MKDEV(dev_major, 0)); 01076 class_simple_destroy(dazuko_class); 01077 #endif 01078 01079 #ifndef DAZUKO_FIST 01080 #ifdef NO_STACKING_SUPPORT 01081 if (secondary_register) 01082 mod_unreg_security(DEVICE_NAME, &dazuko_security_ops); 01083 else 01084 unregister_security(&dazuko_security_ops); 01085 #else 01086 if (secondary_register) 01087 mod_unreg_security(DEVICE_NAME, &dazuko_security_ops); 01088 else 01089 unregister_security(&dazuko_register_security_ops); 01090 #endif 01091 #endif 01092 01093 return 0; 01094 }
|
|
Definition at line 115 of file dazuko_linux26.c. References xp_mutex::mutex. 00116 { 00117 up(&(mutex->mutex)); 00118 }
|
|
Definition at line 242 of file dazuko_linux26.c. 00243 {
00244 return 0;
00245 }
|
|
Definition at line 237 of file dazuko_linux26.c. 00238 {
00239 return 0;
00240 }
|
|
Definition at line 165 of file dazuko_linux26.c. References xp_queue::queue, wait_event, and wait_event_interruptible. 00166 { 00167 /* wait until cfunction(cparam) != 0 (condition is true) */ 00168 int ret = 0; 00169 00170 if (allow_interrupt) 00171 { 00172 while (1) 00173 { 00174 ret = wait_event_interruptible(queue->queue, cfunction(cparam) != 0); 00175 00176 #ifdef USE_SUSPEND2 00177 if (try_todo_list() == 0) 00178 break; 00179 #elif defined (USE_TRYTOFREEZEVOID) 00180 if (try_to_freeze() == 0) 00181 break; 00182 #else 00183 if (current->flags & PF_FREEZE) 00184 { 00185 refrigerator(PF_FREEZE); 00186 } 00187 else 00188 { 00189 break; 00190 } 00191 #endif 00192 } 00193 } 00194 else 00195 { 00196 wait_event(queue->queue, cfunction(cparam) != 0); 00197 } 00198 00199 return ret; 00200 }
|
|
Definition at line 132 of file dazuko_linux26.c. References xp_rwlock::rwlock. 00133 { 00134 write_lock(&(rwlock->rwlock)); 00135 }
|
|
Definition at line 137 of file dazuko_linux26.c. References xp_rwlock::rwlock. 00138 { 00139 write_unlock(&(rwlock->rwlock)); 00140 }
|
|
Definition at line 63 of file dazuko_linux26.c. Referenced by xp_sys_hook(), and xp_sys_unhook(). |
|
Referenced by xp_sys_hook(), and xp_sys_unhook(). |
|
Definition at line 76 of file dazuko_linux26.c. Referenced by dazuko_register_security(), dazuko_unregister_security(), and xp_sys_hook(). |
|
Referenced by dazuko_register_security(), dazuko_unregister_security(), xp_sys_hook(), and xp_sys_unhook(). |
|
Definition at line 68 of file dazuko_linux26.c. |
|
Initial value: { .owner = THIS_MODULE, .read = linux_dazuko_device_read, .write = linux_dazuko_device_write, .ioctl = linux_dazuko_device_ioctl, .open = linux_dazuko_device_open, .release = linux_dazuko_device_release, } Definition at line 93 of file dazuko_linux26.c. |
|
Definition at line 67 of file dazuko_linux26.c. |
|
Definition at line 66 of file dazuko_linux26.c. Referenced by dazuko_get_full_filename(), and xp_sys_hook(). |
|
Definition at line 79 of file dazuko_linux26.c. Referenced by xp_sys_hook(), and xp_sys_unhook(). |