diff -Naur -X exclude-files ac_cur/arch/um/config.in ac/arch/um/config.in --- ac_cur/arch/um/config.in Sat Aug 4 22:02:06 2001 +++ ac/arch/um/config.in Sun Aug 5 14:20:21 2001 @@ -61,7 +61,7 @@ int ' Default RAM disk size' CONFIG_BLK_DEV_RAM_SIZE 4096 fi dep_bool ' Initial RAM disk (initrd) support' CONFIG_BLK_DEV_INITRD $CONFIG_BLK_DEV_RAM -tristate 'IO memory driver' CONFIG_IOMEM +tristate 'Example IO memory driver' CONFIG_MMAPPER endmenu if [ "$CONFIG_NET" = "y" ]; then diff -Naur -X exclude-files ac_cur/arch/um/defconfig ac/arch/um/defconfig --- ac_cur/arch/um/defconfig Sat Aug 4 22:02:06 2001 +++ ac/arch/um/defconfig Sun Aug 5 14:20:26 2001 @@ -46,7 +46,7 @@ CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_RAM_SIZE=4096 CONFIG_BLK_DEV_INITRD=y -CONFIG_IOMEM=y +# CONFIG_MMAPPER is not set # # Networking options diff -Naur -X exclude-files ac_cur/arch/um/drivers/Makefile ac/arch/um/drivers/Makefile --- ac_cur/arch/um/drivers/Makefile Sat Aug 4 22:02:06 2001 +++ ac/arch/um/drivers/Makefile Sun Aug 5 14:19:35 2001 @@ -31,6 +31,7 @@ CFLAGS_mcast_kern.o := $(CFLAGS) CFLAGS_mconsole_kern.o := $(CFLAGS) CFLAGS_mconsole_user.o := $(USER_CFLAGS) +CFLAGS_mmapper_kern.o := $(CFLAGS) obj-$(CONFIG_STDIO_CONSOLE) += stdio_console.o stdio_console_user.o obj-$(CONFIG_SSL) += ssl.o @@ -43,6 +44,7 @@ obj-$(CONFIG_UML_NET_DAEMON) += daemon_kern.o daemon_user.o obj-$(CONFIG_UML_NET_MCAST) += mcast_user.o mcast_kern.o obj-$(CONFIG_MCONSOLE) += mconsole_kern.o mconsole_user.o +obj-$(CONFIG_MMAPPER) += mmapper_kern.o override CFLAGS = diff -Naur -X exclude-files ac_cur/arch/um/drivers/ubd.c ac/arch/um/drivers/ubd.c --- ac_cur/arch/um/drivers/ubd.c Sat Aug 4 22:01:03 2001 +++ ac/arch/um/drivers/ubd.c Sun Aug 5 14:22:02 2001 @@ -198,17 +198,7 @@ __setup("fake_ide", fake_ide_setup); -static char *ubd_strdup(char *string) -{ - char *new; - - new = kmalloc(strlen(string) + 1, GFP_KERNEL); - if(new == NULL) return(NULL); - strcpy(new, string); - return(new); -} - -static int ubd_setup_common(char *str, int *index_out, int copy_name) +static int ubd_setup_common(char *str, int *index_out) { char *backing_file; int n, sync, perm = O_RDWR; @@ -221,7 +211,7 @@ if(!strcmp(str, "sync")){ sync = 1; - return(1); + return(0); } major = simple_strtoul(str, &end, 0); if(*end != '\0'){ @@ -231,7 +221,7 @@ fake_gendisk.major = major; fake_major = major; printk("Setting extra ubd major number to %d\n", major); - return(1); + return(0); } if(n < '0'){ printk("ubd_setup : index out of range\n"); @@ -261,25 +251,16 @@ *backing_file = '\0'; backing_file++; } - if(copy_name){ - ubd_dev[n].file = ubd_strdup(str); - if(ubd_dev[n].file == NULL) return(0); - if(backing_file != NULL){ - ubd_dev[n].cow.file = ubd_strdup(backing_file); - if(ubd_dev[n].cow.file == NULL) return(0); - } - } - else { - ubd_dev[n].file = str; - ubd_dev[n].cow.file = backing_file; - } + ubd_dev[n].file = str; + ubd_dev[n].cow.file = backing_file; ubd_dev[n].boot_openflags = perm | sync; - return(1); + return(0); } static int ubd_setup(char *str) { - return(ubd_setup_common(str, NULL, 0)); + ubd_setup_common(str, NULL); + return(1); } __setup("ubd", ubd_setup); @@ -388,8 +369,16 @@ { int n, err; - err = ubd_setup_common(str, &n, 1); - if(err != 1) return(-1); + str = uml_strdup(str); + if(str == NULL){ + printk(KERN_ERR "ubd_config failed to strdup string\n"); + return(1); + } + err = ubd_setup_common(str, &n); + if(err){ + kfree(str); + return(-1); + } if(n != -1) ubd_add(n); return(0); } @@ -551,19 +540,23 @@ ubd_dev[n].is_dir = 1; return(0); } - ubd_dev[n].openflags = ubd_dev[n].boot_openflags; - if((ubd_dev[n].count == 0) && (ubd_open_dev(&ubd_dev[n]) < 0)){ - printk(KERN_ERR "ubd%d: Can't open \"%s\": errno = %d\n", n, - ubd_dev[n].file, -ubd_dev[n].fd); - } - if(ubd_dev[n].fd < 0) - return -ENODEV; - file = ubd_dev[n].cow.file ? ubd_dev[n].cow.file : ubd_dev[n].file; - ubd_dev[n].size = file_size(file); - if(ubd_dev[n].size < 0) return(ubd_dev[n].size); - ubd_part[n].start_sect = 0; - ubd_part[n].nr_sects = ubd_dev[n].size / blk_sizes[n]; - sizes[n] = ubd_dev[n].size / BLOCK_SIZE; + if(ubd_dev[n].count == 0){ + ubd_dev[n].openflags = ubd_dev[n].boot_openflags; + if(ubd_open_dev(&ubd_dev[n]) < 0){ + printk(KERN_ERR "ubd%d: Can't open \"%s\": " + "errno = %d\n", n, ubd_dev[n].file, + -ubd_dev[n].fd); + } + if(ubd_dev[n].fd < 0) + return -ENODEV; + file = ubd_dev[n].cow.file ? ubd_dev[n].cow.file : + ubd_dev[n].file; + ubd_dev[n].size = file_size(file); + if(ubd_dev[n].size < 0) return(ubd_dev[n].size); + ubd_part[n].start_sect = 0; + ubd_part[n].nr_sects = ubd_dev[n].size / blk_sizes[n]; + sizes[n] = ubd_dev[n].size / BLOCK_SIZE; + } ubd_dev[n].count++; if ((filp->f_mode & FMODE_WRITE) && ((ubd_dev[n].openflags & ~O_SYNC) == O_RDONLY)){ @@ -633,6 +626,13 @@ strcpy(CURRENT->buffer, "HOSTFS:"); strcat(CURRENT->buffer, ubd_dev[dev].file); end_request(1); + return; + } + if((CURRENT->cmd == WRITE) && + ((ubd_dev[dev].openflags & O_ACCMODE) == O_RDONLY)){ + printk("Write attempted on readonly ubd device %d\n", + dev); + end_request(0); return; } diff -Naur -X exclude-files ac_cur/arch/um/include/user.h ac/arch/um/include/user.h --- ac_cur/arch/um/include/user.h Sat Aug 4 22:01:03 2001 +++ ac/arch/um/include/user.h Sun Aug 5 14:20:33 2001 @@ -11,6 +11,7 @@ extern void schedule(void); extern void *kmalloc(int size, int flags); extern void kfree(void *ptr); +extern int in_aton(char *str); #endif diff -Naur -X exclude-files ac_cur/arch/um/include/user_util.h ac/arch/um/include/user_util.h --- ac_cur/arch/um/include/user_util.h Sat Aug 4 22:01:03 2001 +++ ac/arch/um/include/user_util.h Sun Aug 5 14:20:36 2001 @@ -42,6 +42,7 @@ extern void *brk_start; extern int tracing_pid; +extern int honeypot; extern char host_info[]; diff -Naur -X exclude-files ac_cur/arch/um/kernel/irq_user.c ac/arch/um/kernel/irq_user.c --- ac_cur/arch/um/kernel/irq_user.c Sat Aug 4 22:01:03 2001 +++ ac/arch/um/kernel/irq_user.c Sun Aug 5 14:20:38 2001 @@ -149,8 +149,8 @@ set_handler(SIGVTALRM, (__sighandler_t) alarm_handler, flags | SA_NODEFER | SA_RESTART, SIGUSR1, SIGIO, SIGUSR2, -1); - set_handler(SIGIO, (__sighandler_t) irq_handler, flags, SIGUSR1, - SIGIO, SIGUSR2, -1); + set_handler(SIGIO, (__sighandler_t) irq_handler, flags | SA_RESTART, + SIGUSR1, SIGIO, SIGUSR2, -1); } /* diff -Naur -X exclude-files ac_cur/arch/um/kernel/process.c ac/arch/um/kernel/process.c --- ac_cur/arch/um/kernel/process.c Sat Aug 4 22:01:03 2001 +++ ac/arch/um/kernel/process.c Sun Aug 5 14:20:40 2001 @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include diff -Naur -X exclude-files ac_cur/arch/um/kernel/syscall_user.c ac/arch/um/kernel/syscall_user.c --- ac_cur/arch/um/kernel/syscall_user.c Sat Aug 4 22:01:03 2001 +++ ac/arch/um/kernel/syscall_user.c Sun Aug 5 14:20:44 2001 @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include diff -Naur -X exclude-files ac_cur/arch/um/kernel/trap_user.c ac/arch/um/kernel/trap_user.c --- ac_cur/arch/um/kernel/trap_user.c Sat Aug 4 22:01:03 2001 +++ ac/arch/um/kernel/trap_user.c Sun Aug 5 14:20:46 2001 @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -38,10 +39,14 @@ int debug = 0; int debug_stop = 1; +int honeypot = 0; + static int signal_tramp(void *arg) { int (*proc)(void *); + if(honeypot && munmap((void *) 0xb0000000, 0x10000000)) + panic("Unmapping stack failed"); if(ptrace(PTRACE_TRACEME, 0, 0, 0) < 0) panic("ptrace PTRACE_TRACEME failed"); signal(SIGUSR1, SIG_IGN); @@ -234,6 +239,10 @@ case SIGCHLD: sig = 0; break; + case SIGHUP: + if(pid != external_pid(NULL)) continue; + sig = 0; + break; default: if(debugger_pid != -1){ child_signal(pid, status); diff -Naur -X exclude-files ac_cur/arch/um/kernel/um_arch.c ac/arch/um/kernel/um_arch.c --- ac_cur/arch/um/kernel/um_arch.c Sat Aug 4 22:01:45 2001 +++ ac/arch/um/kernel/um_arch.c Sun Aug 5 14:20:50 2001 @@ -101,6 +101,7 @@ void set_cmdline(char *cmd) { + if(honeypot) return; strcpy(argv1_begin, "["); strncat(argv1_begin, cmd, argv1_end - argv1_begin - strlen("[]")); strcat(argv1_begin, "]"); diff -Naur -X exclude-files ac_cur/include/asm-um/uaccess.h ac/include/asm-um/uaccess.h --- ac_cur/include/asm-um/uaccess.h Sun Aug 5 13:20:23 2001 +++ ac/include/asm-um/uaccess.h Sun Aug 5 14:24:45 2001 @@ -82,7 +82,7 @@ #define __get_user(x, ptr) \ ({ \ - __typeof__(ptr) __private_ptr = ptr; \ + const __typeof__(ptr) __private_ptr = ptr; \ __typeof__(*(__private_ptr)) __private_val; \ int __private_ret = -EFAULT; \ (x) = 0; \ @@ -96,7 +96,7 @@ #define get_user(x, ptr) \ ({ \ - __typeof__((*ptr)) *private_ptr = (ptr); \ + const __typeof__((*ptr)) *private_ptr = (ptr); \ (access_ok(VERIFY_READ, private_ptr, sizeof(x)) ? \ __get_user(x, private_ptr) : ((x) = 0, -EFAULT)); \ })