From patchwork Tue Jun 16 07:06:27 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Riku Voipio X-Patchwork-Id: 484802 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 104C51402A0 for ; Tue, 16 Jun 2015 17:07:26 +1000 (AEST) Received: from localhost ([::1]:38158 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Z4kxw-0005WJ-1Q for incoming@patchwork.ozlabs.org; Tue, 16 Jun 2015 03:07:24 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:60880) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Z4kxD-0004DQ-Pq for qemu-devel@nongnu.org; Tue, 16 Jun 2015 03:06:40 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Z4kxA-0006mY-DT for qemu-devel@nongnu.org; Tue, 16 Jun 2015 03:06:39 -0400 Received: from mail-la0-f54.google.com ([209.85.215.54]:36009) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Z4kxA-0006mI-2K for qemu-devel@nongnu.org; Tue, 16 Jun 2015 03:06:36 -0400 Received: by lacny3 with SMTP id ny3so4782893lac.3 for ; Tue, 16 Jun 2015 00:06:35 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=9Oa82KDC1p1DqdIccwLzQxfTO2QCGb6Dje2n+b21xrk=; b=gsNCeiSRnW8RVNbSpXVQSPCsyV7a9DJefts3cxeaAgttQhwi14mnVy4q/Bd//vgAoy P1Fw/nrfWPwScQv5JYeBrhB92psqMSJWsIirsqbS9m2C5LifKD1Bs6ZC6XMgAnFbVs8H uwyReMiqWqDFqnvwlypDukqtHTYxO/tXGnuBOkXCCJAr8g3UAtWXgUmzbRM88YHpBDUt cWkcQ5rm3wucH6VP+aRGcv32kPfLtDoOfIeGE+rfMFZ3oNpRfPx3ibq3y5IPWfrBDa9P ZGfOzA5vVjwHlDojxQmCM/HBH0+Ahj0/ww0JA9ChaAldL3PGv/Ul/xP+08SrWerKrySE LGGw== X-Gm-Message-State: ALoCoQk3vDh6/T9SScixtbS0zm2VvHo9AF2NdDb0LfL0Z2LeSvR2VJl4OATQZD3wmM8Qda8RN/zD X-Received: by 10.152.42.230 with SMTP id r6mr30910442lal.30.1434438395481; Tue, 16 Jun 2015 00:06:35 -0700 (PDT) Received: from localhost.localdomain (91-157-196-38.elisa-laajakaista.fi. [91.157.196.38]) by mx.google.com with ESMTPSA id wc8sm27104lbb.37.2015.06.16.00.06.34 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 16 Jun 2015 00:06:34 -0700 (PDT) From: riku.voipio@linaro.org To: qemu-devel@nongnu.org Date: Tue, 16 Jun 2015 10:06:27 +0300 Message-Id: <8be656b87c6bb1b9f8af3ff78094413d71e4443a.1434438233.git.riku.voipio@linaro.org> X-Mailer: git-send-email 2.1.4 In-Reply-To: References: X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.85.215.54 Cc: peter.maydell@linaro.org, Alexander Graf Subject: [Qemu-devel] [PULL v2 1/6] linux-user: Allocate thunk size dynamically X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org From: Alexander Graf We store all struct types in an array of static size without ever checking whether we overrun it. Of course some day someone (like me in another, ancient ALSA enabling patch set) will run into the limit without realizing it. So let's make the allocation dynamic. We already know the number of structs that we want to allocate, so we only need to pass the variable into the respective piece of code. Also, to ensure we don't accidently overwrite random memory, add some asserts to sanity check whether a thunk is actually part of our array. Signed-off-by: Alexander Graf Signed-off-by: Riku Voipio --- include/exec/user/thunk.h | 4 +++- linux-user/syscall.c | 3 +++ thunk.c | 16 ++++++++++++---- 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/include/exec/user/thunk.h b/include/exec/user/thunk.h index 87025c3..3b67462 100644 --- a/include/exec/user/thunk.h +++ b/include/exec/user/thunk.h @@ -74,7 +74,7 @@ const argtype *thunk_convert(void *dst, const void *src, const argtype *type_ptr, int to_host); #ifndef NO_THUNK_TYPE_SIZE -extern StructEntry struct_entries[]; +extern StructEntry *struct_entries; int thunk_type_size_array(const argtype *type_ptr, int is_host); int thunk_type_align_array(const argtype *type_ptr, int is_host); @@ -186,4 +186,6 @@ unsigned int target_to_host_bitmask(unsigned int x86_mask, unsigned int host_to_target_bitmask(unsigned int alpha_mask, const bitmask_transtbl * trans_tbl); +void thunk_init(unsigned int max_structs); + #endif diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 1622ad6..f56f3e0 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -3277,6 +3277,7 @@ static abi_long do_ipc(unsigned int call, abi_long first, #define STRUCT_SPECIAL(name) STRUCT_ ## name, enum { #include "syscall_types.h" +STRUCT_MAX }; #undef STRUCT #undef STRUCT_SPECIAL @@ -4879,6 +4880,8 @@ void syscall_init(void) int size; int i; + thunk_init(STRUCT_MAX); + #define STRUCT(name, ...) thunk_register_struct(STRUCT_ ## name, #name, struct_ ## name ## _def); #define STRUCT_SPECIAL(name) thunk_register_struct_direct(STRUCT_ ## name, #name, &struct_ ## name ## _def); #include "syscall_types.h" diff --git a/thunk.c b/thunk.c index 3cca047..f501fd7 100644 --- a/thunk.c +++ b/thunk.c @@ -25,10 +25,8 @@ //#define DEBUG -#define MAX_STRUCTS 128 - -/* XXX: make it dynamic */ -StructEntry struct_entries[MAX_STRUCTS]; +static unsigned int max_struct_entries; +StructEntry *struct_entries; static const argtype *thunk_type_next_ptr(const argtype *type_ptr); @@ -70,6 +68,7 @@ void thunk_register_struct(int id, const char *name, const argtype *types) StructEntry *se; int nb_fields, offset, max_align, align, size, i, j; + assert(id < max_struct_entries); se = struct_entries + id; /* first we count the number of fields */ @@ -117,6 +116,8 @@ void thunk_register_struct_direct(int id, const char *name, const StructEntry *se1) { StructEntry *se; + + assert(id < max_struct_entries); se = struct_entries + id; *se = *se1; se->name = name; @@ -244,6 +245,7 @@ const argtype *thunk_convert(void *dst, const void *src, const argtype *field_types; const int *dst_offsets, *src_offsets; + assert(*type_ptr < max_struct_entries); se = struct_entries + *type_ptr++; if (se->convert[0] != NULL) { /* specific conversion is needed */ @@ -314,3 +316,9 @@ int thunk_type_align_array(const argtype *type_ptr, int is_host) return thunk_type_align(type_ptr, is_host); } #endif /* ndef NO_THUNK_TYPE_SIZE */ + +void thunk_init(unsigned int max_structs) +{ + max_struct_entries = max_structs; + struct_entries = g_new0(StructEntry, max_structs); +}