From patchwork Wed Aug 7 10:49:37 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Damijan Skvarc X-Patchwork-Id: 1143458 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=openvswitch.org (client-ip=140.211.169.12; helo=mail.linuxfoundation.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="cSdqxBK8"; dkim-atps=neutral Received: from mail.linuxfoundation.org (mail.linuxfoundation.org [140.211.169.12]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 463Svc0msQz9sNk for ; Wed, 7 Aug 2019 20:50:20 +1000 (AEST) Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id B6795F0D; Wed, 7 Aug 2019 10:49:47 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@mail.linuxfoundation.org Received: from smtp1.linuxfoundation.org (smtp1.linux-foundation.org [172.17.192.35]) by mail.linuxfoundation.org (Postfix) with ESMTPS id C7C4AEE7 for ; Wed, 7 Aug 2019 10:49:45 +0000 (UTC) X-Greylist: whitelisted by SQLgrey-1.7.6 Received: from mail-ed1-f66.google.com (mail-ed1-f66.google.com [209.85.208.66]) by smtp1.linuxfoundation.org (Postfix) with ESMTPS id 8251782D for ; Wed, 7 Aug 2019 10:49:44 +0000 (UTC) Received: by mail-ed1-f66.google.com with SMTP id w20so85760161edd.2 for ; Wed, 07 Aug 2019 03:49:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=b3aDYH6ocu3hIGd9w8UG+7L5Fk8w45I3jyMzpnIdmQU=; b=cSdqxBK8WF8K4y90l+J4Cto1ciGp59xbxbCGjZLzduWEFv3FulrDg5CM7jFpRN+ucV EusaqXAP5X+e2nEshjlPljNiOygdr02uMw38WBow0251P9x4fBbJz+gmIskZxaTNhiMJ pvYTV1PLLSjEoqXlgu7IBYGnmLDiv3Ls32GYVhpXHhPWORqVtdHTJH1vy6IIXDMyFzn3 tlHo2cwsCKbQMXwehDSlcxATr61SkyDPZ2Ur9Cf527jfyfM5xru210k9noes8uNbeIjR 3pWR6XyGbrj0FF/jVWUH58ORMrOSf1lM5VZRYsKNGIX23MXkdYziymELfIHSG5kD2k4Z nRrg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=b3aDYH6ocu3hIGd9w8UG+7L5Fk8w45I3jyMzpnIdmQU=; b=WldpkTVq0mi9mmycLMvIxv3OVJMnVCMFVc9WAdcnigqIvkyqxBpHwxfbkiDsx4evjM Ek0dalahqSpkytLnSllNp2wZ5IwbUAzdJzqxRIugQeF5oCYqMc9wiXD7mSQEgtWF/Yik U3vWXr9D+/SnaC/jVqbqZPfVkcv2RlQNcdHCg1gOiYPe2OJLEUKJxQ8gohUhtyZhtJuU pIYV7BiUFJNs8ipIzKm69kIVKW1E5phSvL/J+FV8AOkL0aLQ0A/gncpd4PMf1MHOUgr4 cBGUwmiiNmqvCOVkZuEhyxg6Iqw+DyHFKaHUKVMJztBQazT7FN4xIckhT8jHqZOCqxKq FhRg== X-Gm-Message-State: APjAAAUr1ewK8qKjuYJUn+ezl1XkK6KPzxFff3iQ852PJjRD8WNc6iFo gmAgy8w6qOt2K4PruFt5c9gWFpGV X-Google-Smtp-Source: APXvYqxeXRjagiIksL17yIj09o4f7dTjM/su4wEcAczT+YIABNauHrAtfjOaCZ3RkkbLC0VjQ3NQ5Q== X-Received: by 2002:a50:b875:: with SMTP id k50mr8981685ede.232.1565174982705; Wed, 07 Aug 2019 03:49:42 -0700 (PDT) Received: from damijan-PC.i-tech.local (mail.i-tech.si. [89.212.78.105]) by smtp.gmail.com with ESMTPSA id w13sm15117241eji.22.2019.08.07.03.49.41 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 07 Aug 2019 03:49:42 -0700 (PDT) From: Damijan Skvarc To: dev@openvswitch.org Date: Wed, 7 Aug 2019 12:49:37 +0200 Message-Id: <1565174977-9439-1-git-send-email-damjan.skvarc@gmail.com> X-Mailer: git-send-email 2.7.4 X-Spam-Status: No, score=-2.0 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, FREEMAIL_FROM, RCVD_IN_DNSWL_NONE autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on smtp1.linux-foundation.org Subject: [ovs-dev] [PATCH ovn] logical-fields: fix memory leak while initializing ovnfield_by_name X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.12 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: ovs-dev-bounces@openvswitch.org Errors-To: ovs-dev-bounces@openvswitch.org ovnfield_by_name is a hash table, intended to quicky find ovn_field by name from a list of supported ovn_fields. This hash table is initialized in ovn_init_symtab() function based on ovn_fields const array. In case ovn_init_symtab() function is called multiple times then hash table is reinitialized multiple times without deallocating previously allocated memory. This is actually what happens in ovn_controller by initializing lflow.symtab and ofctrl.symtab tables. Since ovnfield_by_name is initialized twice with same values I have introduced a flag indicating ovnfield_by_name is already initialized or not and based on this flag hash table is prevented to be initialized multiple times. Note that currently ovn_fields array is constituted from one single entry and thus searching a list of one entry by using helper hash table is somehow useless. Memory leak could be solved by simply removing ovnfield_by_name table and do a linear search through a list of single entry. However I want to keep previous functionality in case ovn_fields array will be extended somewhen in the future. Signed-off-by: Damijan Skvarc --- lib/logical-fields.c | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/lib/logical-fields.c b/lib/logical-fields.c index 4ad5bf4..62b9a71 100644 --- a/lib/logical-fields.c +++ b/lib/logical-fields.c @@ -57,6 +57,23 @@ add_ct_bit(const char *name, int index, struct shash *symtab) free(expansion); } + +static void +init_ovnfield_by_name() +{ + static bool initialized = 0; + + if (0 == initialized) { + shash_init(&ovnfield_by_name); + for (int i = 0; i < OVN_FIELD_N_IDS; i++) { + const struct ovn_field *of = &ovn_fields[i]; + ovs_assert(of->id == i); /* Fields must be in the enum order. */ + shash_add_once(&ovnfield_by_name, of->name, of); + } + initialized=1; + } +} + void ovn_init_symtab(struct shash *symtab) { @@ -218,12 +235,8 @@ ovn_init_symtab(struct shash *symtab) expr_symtab_add_field(symtab, "sctp.src", MFF_SCTP_SRC, "sctp", false); expr_symtab_add_field(symtab, "sctp.dst", MFF_SCTP_DST, "sctp", false); - shash_init(&ovnfield_by_name); - for (int i = 0; i < OVN_FIELD_N_IDS; i++) { - const struct ovn_field *of = &ovn_fields[i]; - ovs_assert(of->id == i); /* Fields must be in the enum order. */ - shash_add_once(&ovnfield_by_name, of->name, of); - } + init_ovnfield_by_name(); + expr_symtab_add_ovn_field(symtab, "icmp4.frag_mtu", OVN_ICMP4_FRAG_MTU); }