diff options
Diffstat (limited to 'xen/arch/x86/setup.c')
-rw-r--r-- | xen/arch/x86/setup.c | 69 |
1 files changed, 37 insertions, 32 deletions
diff --git a/xen/arch/x86/setup.c b/xen/arch/x86/setup.c index 96d49203ca..0e010e2724 100644 --- a/xen/arch/x86/setup.c +++ b/xen/arch/x86/setup.c @@ -111,8 +111,7 @@ char acpi_param[10] = ""; static void parse_acpi_param(char *s) { /* Save the parameter so it can be propagated to domain0. */ - strncpy(acpi_param, s, sizeof(acpi_param)); - acpi_param[sizeof(acpi_param)-1] = '\0'; + safe_strcpy(acpi_param, s); /* Interpret the parameter for use within Xen. */ if ( !strcmp(s, "off") ) @@ -749,22 +748,22 @@ void __init __start_xen(multiboot_info_t *mbi) if ( (cmdline = strchr(cmdline, ' ')) != NULL ) { while ( *cmdline == ' ' ) cmdline++; - strcpy(dom0_cmdline, cmdline); + safe_strcpy(dom0_cmdline, cmdline); } - cmdline = dom0_cmdline; - /* Append any extra parameters. */ - if ( skip_ioapic_setup && !strstr(cmdline, "noapic") ) - strcat(cmdline, " noapic"); + if ( skip_ioapic_setup && !strstr(dom0_cmdline, "noapic") ) + safe_strcat(dom0_cmdline, " noapic"); if ( acpi_skip_timer_override && - !strstr(cmdline, "acpi_skip_timer_override") ) - strcat(cmdline, " acpi_skip_timer_override"); - if ( (strlen(acpi_param) != 0) && !strstr(cmdline, "acpi=") ) + !strstr(dom0_cmdline, "acpi_skip_timer_override") ) + safe_strcat(dom0_cmdline, " acpi_skip_timer_override"); + if ( (strlen(acpi_param) != 0) && !strstr(dom0_cmdline, "acpi=") ) { - strcat(cmdline, " acpi="); - strcat(cmdline, acpi_param); + safe_strcat(dom0_cmdline, " acpi="); + safe_strcat(dom0_cmdline, acpi_param); } + + cmdline = dom0_cmdline; } if ( (initrdidx > 0) && (initrdidx < mbi->mods_count) ) @@ -801,49 +800,55 @@ void __init __start_xen(multiboot_info_t *mbi) startup_cpu_idle_loop(); } -void arch_get_xen_caps(xen_capabilities_info_t info) +void arch_get_xen_caps(xen_capabilities_info_t *info) { - char *p = info; int major = xen_major_version(); int minor = xen_minor_version(); + char s[32]; + + (*info)[0] = '\0'; #if defined(CONFIG_X86_32) && !defined(CONFIG_X86_PAE) - p += sprintf(p, "xen-%d.%d-x86_32 ", major, minor); + snprintf(s, sizeof(s), "xen-%d.%d-x86_32 ", major, minor); + safe_strcat(*info, s); if ( hvm_enabled ) - p += sprintf(p, "hvm-%d.%d-x86_32 ", major, minor); + { + snprintf(s, sizeof(s), "hvm-%d.%d-x86_32 ", major, minor); + safe_strcat(*info, s); + } #elif defined(CONFIG_X86_32) && defined(CONFIG_X86_PAE) - p += sprintf(p, "xen-%d.%d-x86_32p ", major, minor); + snprintf(s, sizeof(s), "xen-%d.%d-x86_32p ", major, minor); + safe_strcat(*info, s); if ( hvm_enabled ) { - p += sprintf(p, "hvm-%d.%d-x86_32 ", major, minor); - p += sprintf(p, "hvm-%d.%d-x86_32p ", major, minor); + snprintf(s, sizeof(s), "hvm-%d.%d-x86_32 ", major, minor); + safe_strcat(*info, s); + snprintf(s, sizeof(s), "hvm-%d.%d-x86_32p ", major, minor); + safe_strcat(*info, s); } #elif defined(CONFIG_X86_64) - p += sprintf(p, "xen-%d.%d-x86_64 ", major, minor); + snprintf(s, sizeof(s), "xen-%d.%d-x86_64 ", major, minor); + safe_strcat(*info, s); #ifdef CONFIG_COMPAT - p += sprintf(p, "xen-%d.%d-x86_32p ", major, minor); + snprintf(s, sizeof(s), "xen-%d.%d-x86_32p ", major, minor); + safe_strcat(*info, s); #endif if ( hvm_enabled ) { - p += sprintf(p, "hvm-%d.%d-x86_32 ", major, minor); - p += sprintf(p, "hvm-%d.%d-x86_32p ", major, minor); - p += sprintf(p, "hvm-%d.%d-x86_64 ", major, minor); + snprintf(s, sizeof(s), "hvm-%d.%d-x86_32 ", major, minor); + safe_strcat(*info, s); + snprintf(s, sizeof(s), "hvm-%d.%d-x86_32p ", major, minor); + safe_strcat(*info, s); + snprintf(s, sizeof(s), "hvm-%d.%d-x86_64 ", major, minor); + safe_strcat(*info, s); } -#else - - p++; - #endif - - *(p-1) = 0; - - BUG_ON((p - info) > sizeof(xen_capabilities_info_t)); } /* |