uml: fix build error due to frame size > 1024
authorChristian Lamparter <chunkeey@gmail.com>
Sun, 21 May 2023 16:30:14 +0000 (18:30 +0200)
committerChristian Lamparter <chunkeey@gmail.com>
Mon, 22 May 2023 12:45:03 +0000 (14:45 +0200)
the UML build fails during the kernel build:
| arch/um/drivers/net_kern.c: In function 'compute_hash':
| arch/um/drivers/net_kern.c:322:1: error: the frame size of 1072 bytes is larger than 1024 bytes [-Werror=frame-larger-than=]
|  322 | }
|      | ^
|cc1: all warnings being treated as errors

The compute_hash() function is added by our patch:
102-pseudo-random-mac.patch

Instead of allocating a 1024 byte buffer on the stack for the SHA1
digest input, let's allocate the data on the heap. We should be
able to do that since crypto_alloc_ahash and ahash_request_alloc
also need to allocate structures on the heap.

Signed-off-by: Christian Lamparter <chunkeey@gmail.com>
target/linux/uml/patches-5.15/102-pseudo-random-mac.patch

index 925b9d77101ff062512814d2b972dc774fd3742b..045d2d0dbd9ae3788515d5547d54d182e606337a 100644 (file)
@@ -49,7 +49,7 @@ Applies to vanilla kernel 3.9.4.
  #define DRIVER_NAME "uml-netdev"
  
  static DEFINE_SPINLOCK(opened_lock);
-@@ -274,9 +282,51 @@ static const struct ethtool_ops uml_net_
+@@ -274,9 +282,55 @@ static const struct ethtool_ops uml_net_
        .get_ts_info    = ethtool_op_get_ts_info,
  };
  
@@ -59,24 +59,26 @@ Applies to vanilla kernel 3.9.4.
 + *  * an interface name. */
 +static int compute_hash(const char *umid, const char *ifname, char *hash)
 +{
-+      struct ahash_request *desc;
-+      struct crypto_ahash *tfm;
++      struct ahash_request *desc = NULL;
++      struct crypto_ahash *tfm = NULL;
 +      struct scatterlist sg;
-+      char vmif[1024];
-+      int ret;
++      char *vmif = NULL;
++      int ret = -ENOMEM;
++
++      vmif = kmalloc(1024, GFP_KERNEL);
++      if (!vmif)
++              goto out;
 +
 +      strcpy (vmif, umid);
 +      strcat (vmif, ifname);
 +
 +      tfm = crypto_alloc_ahash("sha1", 0, CRYPTO_ALG_ASYNC);
 +      if (IS_ERR(tfm))
-+              return -ENOMEM;
++              goto out;
 +
 +      desc = ahash_request_alloc(tfm, GFP_KERNEL);
-+      if (!desc) {
-+              ret = -ENOMEM;
++      if (!desc)
 +              goto out;
-+      }
 +
 +      crypto_ahash_clear_flags(tfm, ~0);
 +
@@ -88,6 +90,8 @@ Applies to vanilla kernel 3.9.4.
 +      ret = crypto_ahash_digest(desc);
 +out:
 +      crypto_free_ahash(tfm);
++      ahash_request_free(desc);
++      kfree(vmif);
 +
 +      return ret;
 +}
@@ -101,7 +105,7 @@ Applies to vanilla kernel 3.9.4.
        char *end;
        int i;
  
-@@ -319,9 +369,26 @@ void uml_net_setup_etheraddr(struct net_
+@@ -319,9 +373,26 @@ void uml_net_setup_etheraddr(struct net_
        return;
  
  random: