From patchwork Thu Nov 9 11:02:39 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Thomas Schaefer X-Patchwork-Id: 836295 X-Patchwork-Delegate: joe.hershberger@gmail.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=lists.denx.de (client-ip=81.169.180.215; helo=lists.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 3yXgHY4KMvz9t5Q for ; Thu, 9 Nov 2017 22:02:49 +1100 (AEDT) Received: by lists.denx.de (Postfix, from userid 105) id 323B2C21DEF; Thu, 9 Nov 2017 11:02:47 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on lists.denx.de X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=RCVD_IN_MSPIKE_H2 autolearn=unavailable autolearn_force=no version=3.4.0 Received: from lists.denx.de (localhost [IPv6:::1]) by lists.denx.de (Postfix) with ESMTP id CC55BC21DA9; Thu, 9 Nov 2017 11:02:44 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id 519D7C21DA9; Thu, 9 Nov 2017 11:02:43 +0000 (UTC) Received: from eu-smtp-delivery-185.mimecast.com (eu-smtp-delivery-185.mimecast.com [146.101.78.185]) by lists.denx.de (Postfix) with ESMTPS id 44C39C21D57 for ; Thu, 9 Nov 2017 11:02:42 +0000 (UTC) Received: from SDEMUCHB01.kontron.local (host-212-18-14-254.customer.m-online.net [212.18.14.254]) (Using TLS) by eu-smtp-1.mimecast.com with ESMTP id uk-mta-53-bTblChiAOZeHlzVBtbW-bA-1; Thu, 09 Nov 2017 11:02:40 +0000 Received: from SDEMUCMB02.kontron.local ([fe80::45b3:76ed:59fe:3fed]) by SDEMUCHB01.kontron.local ([::1]) with mapi id 14.03.0123.003; Thu, 9 Nov 2017 12:02:39 +0100 From: Thomas Schaefer To: "joe.hershberger@ni.com" Thread-Topic: Running out of memory after setting invalid ethaddr Thread-Index: AdNZN6Boesp5nIWUQ4ydlEKvr4hL6A== Date: Thu, 9 Nov 2017 11:02:39 +0000 Message-ID: <1BBC30BFBAE48D49A8C663EE5D39C03F020C9AAAF3@SDEMUCMB02.kontron.local> Accept-Language: en-US, de-DE Content-Language: de-DE X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.228.0.132] MIME-Version: 1.0 X-MC-Unique: bTblChiAOZeHlzVBtbW-bA-1 Cc: "u-boot@lists.denx.de" Subject: [U-Boot] Running out of memory after setting invalid ethaddr X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.18 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" Hi Joe et. al. After setting MAC address to invalid value 00:00:00:00:00:00 and resetting to a valid one, u-boot will run into a recursive endless loop until no memory is left to allocate a new MAC address: => print eth1addr eth1addr=00:a0:a5:10:20:31 => setenv eth1addr 00:00:00:00:00:00 => setenv eth1addr 00:a0:a5:10:20:31 ## Can't malloc 18 bytes => I have tested this with current v2017.11-rc4 on a Freescale T1024RDB eval system, but also see this on our custom i.MX7 and T1042 boards which are based on v2017.03. After some investigation, I found that the recursive loop is entered in eth_write_hwaddr in net/eth_legacy.c when 'eth_env_set_enetaddr_by_index' is called: ~snip } else if (is_valid_ethaddr(dev->enetaddr)) { eth_env_set_enetaddr_by_index(base_name, eth_number, dev->enetaddr); ~snip The patch shown below would prevent u-boot from setting ethaddr to an invalid value like 00:00:00:00:00:00 and avoids running into a situation as shown above: What do you think? Best regards, Thomas Thomas Schäfer SW Design Engineer Kontron - An S&T Company Heinrich-Barth-Straße 1-1a | 66115 Saarbrücken | Germany P: +49 681 95916 203 thomas.schaefer@kontron.com diff --git a/net/eth_legacy.c b/net/eth_legacy.c index be0cf64a3d..8d0a573551 100644 --- a/net/eth_legacy.c +++ b/net/eth_legacy.c @@ -104,9 +104,11 @@ static int on_ethaddr(const char *name, const char *value, enum env_op op, { int index; struct eth_device *dev; + int ret = 0; + unsigned char tmp_enetaddr[ARP_HLEN]; if (!eth_devices) - return 0; + return ret; /* look for an index after "eth" */ index = simple_strtoul(name + 3, NULL, 10); @@ -117,8 +119,17 @@ static int on_ethaddr(const char *name, const char *value, enum env_op op, switch (op) { case env_op_create: case env_op_overwrite: - eth_parse_enetaddr(value, dev->enetaddr); - eth_write_hwaddr(dev, "eth", dev->index); + if (is_valid_ethaddr(tmp_enetaddr)) { + eth_parse_enetaddr(value, + dev->enetaddr); + eth_write_hwaddr(dev, "eth", + dev->index); + } else { + printf("\nMAC address %pM is not " + "valid\n", + tmp_enetaddr); + ret = 1; + } break; case env_op_delete: memset(dev->enetaddr, 0, ARP_HLEN); @@ -127,7 +138,7 @@ static int on_ethaddr(const char *name, const char *value, enum env_op op, dev = dev->next; } while (dev != eth_devices); - return 0; + return ret; } U_BOOT_ENV_CALLBACK(ethaddr, on_ethaddr);