From patchwork Mon Jun 15 12:20:45 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Riku Voipio X-Patchwork-Id: 49861 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-wi0-f198.google.com (mail-wi0-f198.google.com [209.85.212.198]) by ip-10-151-82-157.ec2.internal (Postfix) with ESMTPS id 3EF00211FD for ; Mon, 15 Jun 2015 12:27:14 +0000 (UTC) Received: by wibdt2 with SMTP id dt2sf20772686wib.3 for ; Mon, 15 Jun 2015 05:27:13 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:delivered-to:from:to:date :message-id:in-reply-to:references:cc:subject:precedence:list-id :list-unsubscribe:list-archive:list-post:list-help:list-subscribe :errors-to:sender:x-original-sender :x-original-authentication-results:mailing-list; bh=9Oa82KDC1p1DqdIccwLzQxfTO2QCGb6Dje2n+b21xrk=; b=a4r+xG1N5sXRoMRYQE2GwYSQ7pA4KTAPG0uOgIs+xW0Q95ORbwn1mYVQNHHvL5FFfn AkvG0PLIOuxzINkskgFJ5w88pUtAd3aSQDSFt87EnbWsPFBgr1ZsiP2evqU75IrsvRel cLm+W+OBf4SwD5X/RH9sjahdX6OrMpy3owq9hZNmWRGijLlEunTkJY4NJOyoqzlzGBdc JCLHiJe9SvkpSC2WCCGmcnyN17pLmhNHrlOJUAu69qTt7A6c9oCvU2pZgkKuEDtXbQF5 FJ+LOkgHj+ExujPZj9063w/d3CcUG11YitJAf8b2pcB/1TO6e0KbI7gtdk894vlPuGQ9 yp1A== X-Gm-Message-State: ALoCoQlFhk1ChbZWEGeVDGHYbFw7AFKVurc1ahesxC6p6JcZgX5oFAwjgR2MURA4vTsE4dtugqSw X-Received: by 10.180.105.226 with SMTP id gp2mr19350211wib.1.1434371233531; Mon, 15 Jun 2015 05:27:13 -0700 (PDT) MIME-Version: 1.0 X-BeenThere: patchwork-forward@linaro.org Received: by 10.152.205.107 with SMTP id lf11ls811192lac.65.gmail; Mon, 15 Jun 2015 05:27:13 -0700 (PDT) X-Received: by 10.152.87.173 with SMTP id az13mr1480248lab.118.1434371233229; Mon, 15 Jun 2015 05:27:13 -0700 (PDT) Received: from mail-lb0-f170.google.com (mail-lb0-f170.google.com. [209.85.217.170]) by mx.google.com with ESMTPS id z9si10380606lbu.81.2015.06.15.05.27.13 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 15 Jun 2015 05:27:13 -0700 (PDT) Received-SPF: pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.217.170 as permitted sender) client-ip=209.85.217.170; Received: by lbbqq2 with SMTP id qq2so52316225lbb.3 for ; Mon, 15 Jun 2015 05:27:13 -0700 (PDT) X-Received: by 10.112.234.200 with SMTP id ug8mr26550945lbc.117.1434371233092; Mon, 15 Jun 2015 05:27:13 -0700 (PDT) X-Forwarded-To: patchwork-forward@linaro.org X-Forwarded-For: patch@linaro.org patchwork-forward@linaro.org Delivered-To: patch@linaro.org Received: by 10.112.108.230 with SMTP id hn6csp1380812lbb; Mon, 15 Jun 2015 05:27:12 -0700 (PDT) X-Received: by 10.55.16.67 with SMTP id a64mr58461677qkh.31.1434371231716; Mon, 15 Jun 2015 05:27:11 -0700 (PDT) Received: from lists.gnu.org (lists.gnu.org. [208.118.235.17]) by mx.google.com with ESMTPS id o1si12533206qgo.51.2015.06.15.05.27.11 for (version=TLSv1 cipher=RC4-SHA bits=128/128); Mon, 15 Jun 2015 05:27:11 -0700 (PDT) Received-SPF: pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; Received: from localhost ([::1]:33916 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Z4TTq-0004yL-JK for patch@linaro.org; Mon, 15 Jun 2015 08:27:10 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:48436) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Z4TTP-0004dU-Pu for qemu-devel@nongnu.org; Mon, 15 Jun 2015 08:26:44 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Z4TTL-0005Tk-OE for qemu-devel@nongnu.org; Mon, 15 Jun 2015 08:26:43 -0400 Received: from mail-la0-f42.google.com ([209.85.215.42]:32915) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Z4TTL-0005TA-DR for qemu-devel@nongnu.org; Mon, 15 Jun 2015 08:26:39 -0400 Received: by laka10 with SMTP id a10so9016841lak.0 for ; Mon, 15 Jun 2015 05:26:38 -0700 (PDT) X-Received: by 10.112.204.199 with SMTP id la7mr26866149lbc.114.1434370853687; Mon, 15 Jun 2015 05:20:53 -0700 (PDT) Received: from localhost.localdomain (91-157-196-38.elisa-laajakaista.fi. [91.157.196.38]) by mx.google.com with ESMTPSA id bm5sm2683890lbc.45.2015.06.15.05.20.52 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 15 Jun 2015 05:20:52 -0700 (PDT) From: riku.voipio@linaro.org To: qemu-devel@nongnu.org Date: Mon, 15 Jun 2015 15:20:45 +0300 Message-Id: <8be656b87c6bb1b9f8af3ff78094413d71e4443a.1434369586.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.42 Cc: peter.maydell@linaro.org, Alexander Graf Subject: [Qemu-devel] [PULL 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+patch=linaro.org@nongnu.org Sender: qemu-devel-bounces+patch=linaro.org@nongnu.org X-Removed-Original-Auth: Dkim didn't pass. X-Original-Sender: riku.voipio@linaro.org X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.217.170 as permitted sender) smtp.mail=patch+caf_=patchwork-forward=linaro.org@linaro.org Mailing-list: list patchwork-forward@linaro.org; contact patchwork-forward+owners@linaro.org X-Google-Group-Id: 836684582541 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); +}