void to_compat_ipc_perm(struct compat_ipc_perm *to, struct ipc64_perm *from) { to->key = from->key; SET_UID(to->uid, from->uid); SET_GID(to->gid, from->gid); SET_UID(to->cuid, from->cuid); SET_GID(to->cgid, from->cgid); to->mode = from->mode; to->seq = from->seq; }
int cp_compat_stat(struct kstat *kbuf, struct compat_stat __user *ubuf) { compat_ino_t ino; typeof(ubuf->st_uid) uid = 0; typeof(ubuf->st_gid) gid = 0; SET_UID(uid, kbuf->uid); SET_GID(gid, kbuf->gid); if (!old_valid_dev(kbuf->dev) || !old_valid_dev(kbuf->rdev)) return -EOVERFLOW; if (kbuf->size >= 0x7fffffff) return -EOVERFLOW; ino = kbuf->ino; if (sizeof(ino) < sizeof(kbuf->ino) && ino != kbuf->ino) return -EOVERFLOW; if (!access_ok(VERIFY_WRITE, ubuf, sizeof(struct compat_stat)) || __put_user (old_encode_dev(kbuf->dev), &ubuf->st_dev) || __put_user (ino, &ubuf->st_ino) || __put_user (kbuf->mode, &ubuf->st_mode) || __put_user (kbuf->nlink, &ubuf->st_nlink) || __put_user (uid, &ubuf->st_uid) || __put_user (gid, &ubuf->st_gid) || __put_user (old_encode_dev(kbuf->rdev), &ubuf->st_rdev) || __put_user (kbuf->size, &ubuf->st_size) || __put_user (kbuf->atime.tv_sec, &ubuf->st_atime) || __put_user (kbuf->atime.tv_nsec, &ubuf->st_atime_nsec) || __put_user (kbuf->mtime.tv_sec, &ubuf->st_mtime) || __put_user (kbuf->mtime.tv_nsec, &ubuf->st_mtime_nsec) || __put_user (kbuf->ctime.tv_sec, &ubuf->st_ctime) || __put_user (kbuf->ctime.tv_nsec, &ubuf->st_ctime_nsec) || __put_user (kbuf->blksize, &ubuf->st_blksize) || __put_user (kbuf->blocks, &ubuf->st_blocks)) return -EFAULT; return 0; }
static int cp_stat64(struct stat64 __user *ubuf, struct kstat *stat) { typeof(ubuf->st_uid) uid = 0; typeof(ubuf->st_gid) gid = 0; SET_UID(uid, stat->uid); SET_GID(gid, stat->gid); if (!access_ok(VERIFY_WRITE, ubuf, sizeof(struct stat64)) || __put_user(huge_encode_dev(stat->dev), &ubuf->st_dev) || __put_user (stat->ino, &ubuf->__st_ino) || __put_user (stat->ino, &ubuf->st_ino) || __put_user (stat->mode, &ubuf->st_mode) || __put_user (stat->nlink, &ubuf->st_nlink) || __put_user (uid, &ubuf->st_uid) || __put_user (gid, &ubuf->st_gid) || __put_user (huge_encode_dev(stat->rdev), &ubuf->st_rdev) || __put_user (stat->size, &ubuf->st_size) || __put_user (stat->atime.tv_sec, &ubuf->st_atime) || __put_user (stat->atime.tv_nsec, &ubuf->st_atime_nsec) || __put_user (stat->mtime.tv_sec, &ubuf->st_mtime) || __put_user (stat->mtime.tv_nsec, &ubuf->st_mtime_nsec) || __put_user (stat->ctime.tv_sec, &ubuf->st_ctime) || __put_user (stat->ctime.tv_nsec, &ubuf->st_ctime_nsec) || __put_user (stat->blksize, &ubuf->st_blksize) || __put_user (stat->blocks, &ubuf->st_blocks)) return -EFAULT; return 0; }
static int cp_compat_stat(struct kstat *stat, struct compat_stat __user *ubuf) { struct compat_stat tmp; if (!old_valid_dev(stat->dev) || !old_valid_dev(stat->rdev)) return -EOVERFLOW; memset(&tmp, 0, sizeof(tmp)); tmp.st_dev = old_encode_dev(stat->dev); tmp.st_ino = stat->ino; if (sizeof(tmp.st_ino) < sizeof(stat->ino) && tmp.st_ino != stat->ino) return -EOVERFLOW; tmp.st_mode = stat->mode; tmp.st_nlink = stat->nlink; if (tmp.st_nlink != stat->nlink) return -EOVERFLOW; SET_UID(tmp.st_uid, stat->uid); SET_GID(tmp.st_gid, stat->gid); tmp.st_rdev = old_encode_dev(stat->rdev); if ((u64) stat->size > MAX_NON_LFS) return -EOVERFLOW; tmp.st_size = stat->size; tmp.st_atime = stat->atime.tv_sec; tmp.st_atime_nsec = stat->atime.tv_nsec; tmp.st_mtime = stat->mtime.tv_sec; tmp.st_mtime_nsec = stat->mtime.tv_nsec; tmp.st_ctime = stat->ctime.tv_sec; tmp.st_ctime_nsec = stat->ctime.tv_nsec; tmp.st_blocks = stat->blocks; tmp.st_blksize = stat->blksize; return copy_to_user(ubuf, &tmp, sizeof(tmp)) ? -EFAULT : 0; }
/* * For backward compatibility? Maybe this should be moved * into arch/i386 instead? */ static int cp_old_stat(struct kstat *stat, struct __old_kernel_stat __user * statbuf) { static int warncount = 5; struct __old_kernel_stat tmp; if (warncount > 0) { warncount--; printk(KERN_WARNING "VFS: Warning: %s using old stat() call. Recompile your binary.\n", current->comm); } else if (warncount < 0) { /* it's laughable, but... */ warncount = 0; } memset(&tmp, 0, sizeof(struct __old_kernel_stat)); tmp.st_dev = old_encode_dev(stat->dev); tmp.st_ino = stat->ino; tmp.st_mode = stat->mode; tmp.st_nlink = stat->nlink; if (tmp.st_nlink != stat->nlink) return -EOVERFLOW; SET_UID(tmp.st_uid, stat->uid); SET_GID(tmp.st_gid, stat->gid); tmp.st_rdev = old_encode_dev(stat->rdev); #if BITS_PER_LONG == 32 if (stat->size > MAX_NON_LFS) return -EOVERFLOW; #endif tmp.st_size = stat->size; tmp.st_atime = stat->atime.tv_sec; tmp.st_mtime = stat->mtime.tv_sec; tmp.st_ctime = stat->ctime.tv_sec; return copy_to_user(statbuf,&tmp,sizeof(tmp)) ? -EFAULT : 0; }
int cp_compat_stat(struct kstat64 *kbuf, struct compat_stat __user *ubuf) { typeof(ubuf->st_uid) uid = 0; typeof(ubuf->st_gid) gid = 0; SET_UID(uid, kbuf->uid); SET_GID(gid, kbuf->gid); if (!old_valid_dev(kbuf->dev) || !old_valid_dev(kbuf->rdev)) return -EOVERFLOW; if (kbuf->size >= 0x7fffffff) return -EOVERFLOW; if (kbuf->ino64 != (u32)kbuf->ino64) return -EOVERFLOW; if (verify_area(VERIFY_WRITE, ubuf, sizeof(struct compat_stat)) || __put_user (old_encode_dev(kbuf->dev), &ubuf->st_dev) || __put_user (kbuf->ino64, &ubuf->st_ino) || __put_user (kbuf->mode, &ubuf->st_mode) || __put_user (kbuf->nlink, &ubuf->st_nlink) || __put_user (uid, &ubuf->st_uid) || __put_user (gid, &ubuf->st_gid) || __put_user (old_encode_dev(kbuf->rdev), &ubuf->st_rdev) || __put_user (kbuf->size, &ubuf->st_size) || __put_user (kbuf->atime.tv_sec, &ubuf->st_atime) || __put_user (kbuf->atime.tv_nsec, &ubuf->st_atime_nsec) || __put_user (kbuf->mtime.tv_sec, &ubuf->st_mtime) || __put_user (kbuf->mtime.tv_nsec, &ubuf->st_mtime_nsec) || __put_user (kbuf->ctime.tv_sec, &ubuf->st_ctime) || __put_user (kbuf->ctime.tv_nsec, &ubuf->st_ctime_nsec) || __put_user (kbuf->blksize, &ubuf->st_blksize) || __put_user (kbuf->blocks, &ubuf->st_blocks)) return -EFAULT; return 0; }
int cp_compat_stat(struct kstat *stat, struct compat_stat *statbuf) { struct compat_stat tmp; if (!new_valid_dev(stat->dev) || !new_valid_dev(stat->rdev)) return -EOVERFLOW; memset(&tmp, 0, sizeof(tmp)); tmp.st_dev = new_encode_dev(stat->dev); tmp.st_ino = stat->ino; tmp.st_mode = stat->mode; tmp.st_nlink = stat->nlink; SET_UID(tmp.st_uid, stat->uid); SET_GID(tmp.st_gid, stat->gid); tmp.st_rdev = new_encode_dev(stat->rdev); tmp.st_size = stat->size; tmp.st_atime = stat->atime.tv_sec; tmp.st_mtime = stat->mtime.tv_sec; tmp.st_ctime = stat->ctime.tv_sec; #ifdef STAT_HAVE_NSEC tmp.st_atime_nsec = stat->atime.tv_nsec; tmp.st_mtime_nsec = stat->mtime.tv_nsec; tmp.st_ctime_nsec = stat->ctime.tv_nsec; #endif tmp.st_blocks = stat->blocks; tmp.st_blksize = stat->blksize; return copy_to_user(statbuf,&tmp,sizeof(tmp)) ? -EFAULT : 0; }
static inline int __put_compat_ipc_perm(struct ipc64_perm *p, struct compat_ipc_perm __user *up) { int err; __compat_uid_t u; __compat_gid_t g; err = __put_user(p->key, &up->key); SET_UID(u, p->uid); err |= __put_user(u, &up->uid); SET_GID(g, p->gid); err |= __put_user(g, &up->gid); SET_UID(u, p->cuid); err |= __put_user(u, &up->cuid); SET_GID(g, p->cgid); err |= __put_user(g, &up->cgid); err |= __put_user(p->mode, &up->mode); err |= __put_user(p->seq, &up->seq); return err; }
static int cp_new_stat(struct kstat *stat, struct stat __user *statbuf) { struct stat tmp; #if BITS_PER_LONG == 32 if (!old_valid_dev(stat->dev) || !old_valid_dev(stat->rdev)) return -EOVERFLOW; #else if (!new_valid_dev(stat->dev) || !new_valid_dev(stat->rdev)) return -EOVERFLOW; #endif memset(&tmp, 0, sizeof(tmp)); #if BITS_PER_LONG == 32 tmp.st_dev = old_encode_dev(stat->dev); #else tmp.st_dev = new_encode_dev(stat->dev); #endif tmp.st_ino = stat->ino; if (sizeof(tmp.st_ino) < sizeof(stat->ino) && tmp.st_ino != stat->ino) return -EOVERFLOW; tmp.st_mode = stat->mode; tmp.st_nlink = stat->nlink; if (tmp.st_nlink != stat->nlink) return -EOVERFLOW; SET_UID(tmp.st_uid, stat->uid); SET_GID(tmp.st_gid, stat->gid); #if BITS_PER_LONG == 32 tmp.st_rdev = old_encode_dev(stat->rdev); #else tmp.st_rdev = new_encode_dev(stat->rdev); #endif #if BITS_PER_LONG == 32 if (stat->size > MAX_NON_LFS) return -EOVERFLOW; #endif tmp.st_size = stat->size; tmp.st_atime = stat->atime.tv_sec; tmp.st_mtime = stat->mtime.tv_sec; tmp.st_ctime = stat->ctime.tv_sec; #ifdef STAT_HAVE_NSEC tmp.st_atime_nsec = stat->atime.tv_nsec; tmp.st_mtime_nsec = stat->mtime.tv_nsec; tmp.st_ctime_nsec = stat->ctime.tv_nsec; #endif tmp.st_blocks = stat->blocks; tmp.st_blksize = stat->blksize; scribe_data_non_det(); return copy_to_user(statbuf,&tmp,sizeof(tmp)) ? -EFAULT : 0; }
static int cp_compat_stat(struct kstat *stat, struct compat_stat __user *ubuf) { compat_ino_t ino = stat->ino; typeof(ubuf->st_uid) uid = 0; typeof(ubuf->st_gid) gid = 0; int err; SET_UID(uid, stat->uid); SET_GID(gid, stat->gid); if ((u64) stat->size > MAX_NON_LFS || !old_valid_dev(stat->dev) || !old_valid_dev(stat->rdev)) return -EOVERFLOW; if (sizeof(ino) < sizeof(stat->ino) && ino != stat->ino) return -EOVERFLOW; if (clear_user(ubuf, sizeof(*ubuf))) return -EFAULT; err = __put_user(old_encode_dev(stat->dev), &ubuf->st_dev); err |= __put_user(ino, &ubuf->st_ino); err |= __put_user(stat->mode, &ubuf->st_mode); err |= __put_user(stat->nlink, &ubuf->st_nlink); err |= __put_user(uid, &ubuf->st_uid); err |= __put_user(gid, &ubuf->st_gid); err |= __put_user(old_encode_dev(stat->rdev), &ubuf->st_rdev); err |= __put_user(stat->size, &ubuf->st_size); err |= __put_user(stat->atime.tv_sec, &ubuf->st_atime); err |= __put_user(stat->atime.tv_nsec, &ubuf->st_atime_nsec); err |= __put_user(stat->mtime.tv_sec, &ubuf->st_mtime); err |= __put_user(stat->mtime.tv_nsec, &ubuf->st_mtime_nsec); err |= __put_user(stat->ctime.tv_sec, &ubuf->st_ctime); err |= __put_user(stat->ctime.tv_nsec, &ubuf->st_ctime_nsec); err |= __put_user(stat->blksize, &ubuf->st_blksize); err |= __put_user(stat->blocks, &ubuf->st_blocks); return err; }
static int cp_new_stat(struct kstat *stat, struct stat __user *statbuf) { struct stat tmp; if (!valid_dev(stat->dev) || !valid_dev(stat->rdev)) return -EOVERFLOW; #if BITS_PER_LONG == 32 if (stat->size > MAX_NON_LFS) return -EOVERFLOW; #endif INIT_STRUCT_STAT_PADDING(tmp); tmp.st_dev = encode_dev(stat->dev); tmp.st_ino = stat->ino; if (sizeof(tmp.st_ino) < sizeof(stat->ino) && tmp.st_ino != stat->ino) return -EOVERFLOW; tmp.st_mode = stat->mode; tmp.st_nlink = stat->nlink; if (tmp.st_nlink != stat->nlink) return -EOVERFLOW; SET_UID(tmp.st_uid, from_kuid_munged(current_user_ns(), stat->uid)); SET_GID(tmp.st_gid, from_kgid_munged(current_user_ns(), stat->gid)); tmp.st_rdev = encode_dev(stat->rdev); tmp.st_size = stat->size; tmp.st_atime = stat->atime.tv_sec; tmp.st_mtime = stat->mtime.tv_sec; tmp.st_ctime = stat->ctime.tv_sec; #ifdef STAT_HAVE_NSEC tmp.st_atime_nsec = stat->atime.tv_nsec; tmp.st_mtime_nsec = stat->mtime.tv_nsec; tmp.st_ctime_nsec = stat->ctime.tv_nsec; #endif tmp.st_blocks = stat->blocks; tmp.st_blksize = stat->blksize; return copy_to_user(statbuf,&tmp,sizeof(tmp)) ? -EFAULT : 0; }
static int smb_fill_super(struct super_block *sb, void *raw_data, int silent) { struct smb_sb_info *server; struct smb_mount_data_kernel *mnt; struct smb_mount_data *oldmnt; struct inode *root_inode; struct smb_fattr root; int ver; void *mem; if (!raw_data) goto out_no_data; oldmnt = (struct smb_mount_data *) raw_data; ver = oldmnt->version; if (ver != SMB_MOUNT_OLDVERSION && cpu_to_be32(ver) != SMB_MOUNT_ASCII) goto out_wrong_data; sb->s_flags |= MS_NODIRATIME; sb->s_blocksize = 1024; /* Eh... Is this correct? */ sb->s_blocksize_bits = 10; sb->s_magic = SMB_SUPER_MAGIC; sb->s_op = &smb_sops; sb->s_time_gran = 100; server = smb_kmalloc(sizeof(struct smb_sb_info), GFP_KERNEL); if (!server) goto out_no_server; sb->s_fs_info = server; memset(server, 0, sizeof(struct smb_sb_info)); server->super_block = sb; server->mnt = NULL; server->sock_file = NULL; init_waitqueue_head(&server->conn_wq); init_MUTEX(&server->sem); INIT_LIST_HEAD(&server->entry); INIT_LIST_HEAD(&server->xmitq); INIT_LIST_HEAD(&server->recvq); server->conn_error = 0; server->conn_pid = 0; server->state = CONN_INVALID; /* no connection yet */ server->generation = 0; /* Allocate the global temp buffer and some superblock helper structs */ /* FIXME: move these to the smb_sb_info struct */ VERBOSE("alloc chunk = %d\n", sizeof(struct smb_ops) + sizeof(struct smb_mount_data_kernel)); mem = smb_kmalloc(sizeof(struct smb_ops) + sizeof(struct smb_mount_data_kernel), GFP_KERNEL); if (!mem) goto out_no_mem; server->ops = mem; smb_install_null_ops(server->ops); server->mnt = mem + sizeof(struct smb_ops); /* Setup NLS stuff */ server->remote_nls = NULL; server->local_nls = NULL; mnt = server->mnt; memset(mnt, 0, sizeof(struct smb_mount_data_kernel)); strlcpy(mnt->codepage.local_name, CONFIG_NLS_DEFAULT, SMB_NLS_MAXNAMELEN); strlcpy(mnt->codepage.remote_name, SMB_NLS_REMOTE, SMB_NLS_MAXNAMELEN); mnt->ttl = SMB_TTL_DEFAULT; if (ver == SMB_MOUNT_OLDVERSION) { mnt->version = oldmnt->version; SET_UID(mnt->uid, oldmnt->uid); SET_GID(mnt->gid, oldmnt->gid); mnt->file_mode = (oldmnt->file_mode & S_IRWXUGO) | S_IFREG; mnt->dir_mode = (oldmnt->dir_mode & S_IRWXUGO) | S_IFDIR; mnt->flags = (oldmnt->file_mode >> 9) | SMB_MOUNT_UID | SMB_MOUNT_GID | SMB_MOUNT_FMODE | SMB_MOUNT_DMODE; } else {
int difference_direntrylist() { int ndiffs; /* Number of differences found */ struct direntry* entry_prev; /* Pointer to iterate through previous direntrylist */ struct direntry* entry_cur; /* Pointer to iterate through current direntry list */ ndiffs = 0; // Populate the curdir list with entries in directory right now exploredir(curdir, (const char*)full_path); /* Global variable: full_path */ // No differences if there is no entries in the directory if (curdir->count == 0 && prevdir->count == 0) { return 0; } entry_prev = prevdir->head; while (entry_prev != NULL) { if ((entry_cur = find_direntry(curdir, entry_prev)) != NULL && !IS_CHECKED(entry_prev->mask)) { // Permissions if (entry_prev->attrs.st_mode != entry_cur->attrs.st_mode) { SET_MODIFIED(entry_prev->mask); SET_PERM(entry_prev->mask); ndiffs++; } // UID if (entry_prev->attrs.st_uid != entry_cur->attrs.st_uid) { SET_MODIFIED(entry_prev->mask); SET_UID(entry_prev->mask); ndiffs++; } // GID if (entry_prev->attrs.st_gid != entry_cur->attrs.st_gid) { SET_MODIFIED(entry_prev->mask); SET_GID(entry_prev->mask); ndiffs++; } // Size if (entry_prev->attrs.st_size != entry_cur->attrs.st_size) { SET_MODIFIED(entry_prev->mask); SET_SIZE(entry_prev->mask); ndiffs++; } // Access time if (entry_prev->attrs.st_atime != entry_cur->attrs.st_atime) { SET_MODIFIED(entry_prev->mask); SET_LAT(entry_prev->mask); ndiffs++; } // Modified time if (entry_prev->attrs.st_mtime != entry_cur->attrs.st_mtime) { SET_MODIFIED(entry_prev->mask); SET_LMT(entry_prev->mask); ndiffs++; } // File status time if (entry_prev->attrs.st_ctime != entry_cur->attrs.st_ctime) { SET_MODIFIED(entry_prev->mask); SET_LFST(entry_prev->mask); ndiffs++; } // Show that the entries have been checked for differences // and not to check them again SET_CHECKED(entry_prev->mask); SET_CHECKED(entry_cur->mask); } else { // If a previous entry cannot be found in the current directory, // it was removed SET_REMOVED(entry_prev->mask); ndiffs++; } entry_prev = entry_prev->next; } // Now check for any entries that have been added to the monitored // directory entry_cur = curdir->head; while (entry_cur != NULL) { if (!IS_CHECKED(entry_cur->mask)) { SET_ADDED(entry_cur->mask); ndiffs++; } entry_cur = entry_cur->next; } return ndiffs; }