From 4ae07e7e07cf77f1b7ce06bebf1057bfe4a16c54 Mon Sep 17 00:00:00 2001 From: Samuel Thibault Date: Fri, 9 Mar 2012 01:04:52 +0100 Subject: Use unsigned long for addresses and sizes TODO: remonter formats * i386/include/mach/i386/vm_types.h (vm_offset_t): Define to unsigned long. (signed32_t): Define to signed int. (unsigned32_t): Define to unsigned int. * i386/include/mach/sa/stdarg.h (__va_size): Use sizeof(unsigned long)-1 instead of 3. * include/mach/port.h (mach_port_t): Define to vm_offset_t instead of natural_t. * include/sys/types.h (size_t): Define to unsigned long instead of natural_t. * linux/src/include/asm-i386/posix_types.h (__kernel_size_t): Define to unsigned long. (__kernel_ssize_t): Define to long. * linux/src/include/linux/stddef.h (size_t): Define to unsigned long. * device/dev_pager.c (dev_pager_hash): Cast port to vm_offset_t insted of natural_t. (device_pager_data_request): Fix format. * device/ds_routines.c (ds_no_senders): Fix format. * i386/i386/io_map.c (io_map): Likewise. * i386/i386at/autoconf.c (take_dev_irq): Likewise. * i386/i386at/com.c (comattach): Likewise. * i386/i386at/lpr.c (lprattach): Likewise. * i386/i386at/model_dep.c (mem_size_init, mem_size_init, c_boot_entry): Likewise. * i386/intel/pmap.c (pmap_enter): Likewise. * ipc/ipc_notify.c (ipc_notify_port_deleted, ipc_notify_msg_accepted, ipc_notify_dead_name): Likewise. * ipc/mach_port.c (mach_port_destroy, mach_port_deallocate): Likewise. * kern/ipc_kobject.c (ipc_kobject_destroy): Likewise. * kern/slab.c (kalloc_init): Likewise. * vm/vm_fault.c (vm_fault_page): Likewise. * vm/vm_map.c (vm_map_pmap_enter): Likewise. * xen/block.c (device_read): Likewise. * device/net_io.c (bpf_match): Take unsigned long * instead of unsigned int *. (bpf_do_filter): Make mem unsigned long instead of long. * i386/i386/ktss.c (ktss_init): Cast pointer to unsigned long instead of unsigned. * i386/i386/pcb.c (stack_attach, switch_ktss): Cast pointers to long instead of int. * i386/i386/trap.c (dump_ss): Likewise. * ipc/ipc_hash.c (IH_LOCAL_HASH): Cast object to vm_offset_t. * ipc/mach_msg.c (mach_msg_receive, mach_msg_receive_continue): Cast kmsg to vm_offset_t instead of natural_t. * kern/pc_sample.c (take_pc_sample): Cast to vm_offset_t instead of natural_t. * kern/boot_script.c (sym, arg): Set type of `val' field to long instead of int. (create_task, builtin_symbols, boot_script_parse_line, boot_script_define_function): Cast to long instead of int. * kern/bootstrap.c (bootstrap_create): Likewise. * kern/sched_prim.c (decl_simple_lock_data): Likewise. * kern/printf.c (vsnprintf): Set size type to size_t. * kern/printf.h (vsnprintf): Likewise. * vm/vm_map.h (kentry_data_size): Fix type to vm_size_t. * vm/vm_object.c (vm_object_pmap_protect_by_page): Fix size parameter type to vm_size_t. --- kern/printf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'kern/printf.c') diff --git a/kern/printf.c b/kern/printf.c index 88a527ba..658493cc 100644 --- a/kern/printf.c +++ b/kern/printf.c @@ -601,7 +601,7 @@ snputc(char c, vm_offset_t arg) } int -vsnprintf(char *buf, int size, const char *fmt, va_list args) +vsnprintf(char *buf, size_t size, const char *fmt, va_list args) { struct vsnprintf_cookie cookie = { .buf = buf, .index = 0, .max_len = size }; -- cgit v1.2.3 From d62085e5c5eb47cc2442899b125c799cb90e6d7b Mon Sep 17 00:00:00 2001 From: Samuel Thibault Date: Fri, 6 Apr 2012 21:17:05 +0200 Subject: Do not take address of va_list variable This breaks on x86_64, where it is an array and thus gets bogus results. * ddb/db_output.c (db_printf, kdbprintf): Pass copy of va_list variable instead of its address. * kern/debug.c (panic, log): Likewise. * kern/printf.c (vprintf, iprintf, sprintf, vsnprintf): Likewise. (_doprnt): Take va_list instead of va_list *, fix usage and comment accordingly. * kern/printf.h (_doprnt): Take va_list instead of va_list *. --- ddb/db_output.c | 4 ++-- kern/debug.c | 4 ++-- kern/printf.c | 29 ++++++++++++++++------------- kern/printf.h | 2 +- 4 files changed, 21 insertions(+), 18 deletions(-) (limited to 'kern/printf.c') diff --git a/ddb/db_output.c b/ddb/db_output.c index 57d6856d..3ea2caac 100644 --- a/ddb/db_output.c +++ b/ddb/db_output.c @@ -213,7 +213,7 @@ db_printf(const char *fmt, ...) db_printf_enter(); /* optional multiP serialization */ #endif va_start(listp, fmt); - _doprnt(fmt, &listp, db_id_putc, db_radix, 0); + _doprnt(fmt, listp, db_id_putc, db_radix, 0); va_end(listp); } @@ -225,7 +225,7 @@ kdbprintf(const char *fmt, ...) { va_list listp; va_start(listp, fmt); - _doprnt(fmt, &listp, db_id_putc, db_radix, 0); + _doprnt(fmt, listp, db_id_putc, db_radix, 0); va_end(listp); } diff --git a/kern/debug.c b/kern/debug.c index 65c43fba..09c8ff48 100644 --- a/kern/debug.c +++ b/kern/debug.c @@ -168,7 +168,7 @@ panic(const char *s, ...) #endif printf(": "); va_start(listp, s); - _doprnt(s, &listp, do_cnputc, 0, 0); + _doprnt(s, listp, do_cnputc, 0, 0); va_end(listp); printf("\n"); @@ -203,7 +203,7 @@ log(int level, const char *fmt, ...) level++; #endif va_start(listp, fmt); - _doprnt(fmt, &listp, do_cnputc, 0, 0); + _doprnt(fmt, listp, do_cnputc, 0, 0); va_end(listp); } diff --git a/kern/printf.c b/kern/printf.c index 658493cc..a3a771d0 100644 --- a/kern/printf.c +++ b/kern/printf.c @@ -39,7 +39,10 @@ * FILE *fd; * char *format; * { + * va_list listp; + * va_start(listp, fmt); * _doprnt(format, &args, fd); + * va_end(listp); * } * * would suffice. (This example does not handle the fprintf's "return @@ -165,7 +168,7 @@ void printf_init(void) void _doprnt( register const char *fmt, - va_list *argp, + va_list argp, /* character output routine */ void (*putc)( char, vm_offset_t), int radix, /* default radix - for '%r' */ @@ -248,7 +251,7 @@ void _doprnt( } } else if (c == '*') { - length = va_arg(*argp, int); + length = va_arg(argp, int); c = *++fmt; if (length < 0) { ladjust = !ladjust; @@ -266,7 +269,7 @@ void _doprnt( } } else if (c == '*') { - prec = va_arg(*argp, int); + prec = va_arg(argp, int); c = *++fmt; } } @@ -284,8 +287,8 @@ void _doprnt( boolean_t any; register int i; - u = va_arg(*argp, unsigned long); - p = va_arg(*argp, char *); + u = va_arg(argp, unsigned long); + p = va_arg(argp, char *); base = *p++; printnum(u, base, putc, putc_arg); @@ -333,7 +336,7 @@ void _doprnt( } case 'c': - c = va_arg(*argp, int); + c = va_arg(argp, int); (*putc)(c, putc_arg); break; @@ -345,7 +348,7 @@ void _doprnt( if (prec == -1) prec = 0x7fffffff; /* MAXINT */ - p = va_arg(*argp, char *); + p = va_arg(argp, char *); if (p == (char *)0) p = ""; @@ -428,7 +431,7 @@ void _doprnt( goto print_unsigned; print_signed: - n = va_arg(*argp, long); + n = va_arg(argp, long); if (n >= 0) { u = n; sign_char = plus_sign; @@ -440,7 +443,7 @@ void _doprnt( goto print_num; print_unsigned: - u = va_arg(*argp, unsigned long); + u = va_arg(argp, unsigned long); goto print_num; print_num: @@ -514,7 +517,7 @@ void _doprnt( int vprintf(const char *fmt, va_list listp) { - _doprnt(fmt, &listp, (void (*)( char, vm_offset_t)) cnputc, 16, 0); + _doprnt(fmt, listp, (void (*)( char, vm_offset_t)) cnputc, 16, 0); return 0; } @@ -550,7 +553,7 @@ void iprintf(const char *fmt, ...) } } va_start(listp, fmt); - _doprnt(fmt, &listp, (void (*)( char, vm_offset_t)) cnputc, 16, 0); + _doprnt(fmt, listp, (void (*)( char, vm_offset_t)) cnputc, 16, 0); va_end(listp); } @@ -577,7 +580,7 @@ sprintf(char *buf, const char *fmt, ...) char *start = buf; va_start(listp, fmt); - _doprnt(fmt, &listp, sputc, 16, (vm_offset_t)&buf); + _doprnt(fmt, listp, sputc, 16, (vm_offset_t)&buf); va_end(listp); *buf = 0; @@ -606,7 +609,7 @@ vsnprintf(char *buf, size_t size, const char *fmt, va_list args) struct vsnprintf_cookie cookie = { .buf = buf, .index = 0, .max_len = size }; - _doprnt (fmt, &args, snputc, 16, (vm_offset_t)&cookie); + _doprnt (fmt, args, snputc, 16, (vm_offset_t)&cookie); cookie.buf[cookie.index] = '\0'; return cookie.index; diff --git a/kern/printf.h b/kern/printf.h index fcf2b3b0..8b4e7606 100644 --- a/kern/printf.h +++ b/kern/printf.h @@ -30,7 +30,7 @@ extern void printf_init (void); extern void _doprnt (const char *fmt, - va_list *argp, + va_list argp, void (*putc)(char, vm_offset_t), int radix, vm_offset_t putc_arg); -- cgit v1.2.3