From 2c639169fd49008e6a2767b24058de8500ae33b0 Mon Sep 17 00:00:00 2001
From: Alexander Boettcher <alexander.boettcher@genode-labs.com>
Date: Fri, 20 Nov 2020 11:16:41 +0100
Subject: [PATCH] dde_linux: use linux memory primitives in impl/usb

Issue #3953
---
 .../dde_linux/src/include/lx_emul/impl/usb.h  | 25 ++++++++++++++-----
 1 file changed, 19 insertions(+), 6 deletions(-)

diff --git a/repos/dde_linux/src/include/lx_emul/impl/usb.h b/repos/dde_linux/src/include/lx_emul/impl/usb.h
index a2f205d3e9..f05b46bc13 100644
--- a/repos/dde_linux/src/include/lx_emul/impl/usb.h
+++ b/repos/dde_linux/src/include/lx_emul/impl/usb.h
@@ -12,7 +12,6 @@
  */
 
 /* Linux kit includes */
-#include <lx_kit/malloc.h>
 #include <lx_kit/usb.h>
 
 int usb_control_msg(struct usb_device *dev, unsigned int pipe,
@@ -30,13 +29,23 @@ int usb_control_msg(struct usb_device *dev, unsigned int pipe,
 	dr->wLength      = cpu_to_le16(size);
 
 	urb * u = (urb*) usb_alloc_urb(0, GFP_KERNEL);
-	if (!u) return -ENOMEM;
+	if (!u) {
+		kfree(dr);
+		return -ENOMEM;
+	}
+
+	Sync_ctrl_urb * scu = (Sync_ctrl_urb *)kzalloc(sizeof(Sync_ctrl_urb), GFP_KERNEL);
+	if (!scu) {
+		usb_free_urb(u);
+		kfree(dr);
+		return -ENOMEM;
+	}
 
 	usb_fill_control_urb(u, dev, pipe, (unsigned char *)dr, data,
 	                     size, nullptr, nullptr);
 
-	Sync_ctrl_urb * scu = new (Lx::Malloc::mem())
-		Sync_ctrl_urb(*(Usb::Connection*)(dev->bus->controller), *u);
+	Genode::construct_at<Sync_ctrl_urb>(scu, *(Usb::Connection*)(dev->bus->controller), *u);
+
 	scu->send(timeout);
 	int ret = u->actual_length;
 	usb_free_urb(u);
@@ -59,8 +68,12 @@ struct urb *usb_alloc_urb(int iso_packets, gfp_t mem_flags)
 
 int usb_submit_urb(struct urb *urb, gfp_t mem_flags)
 {
-	Urb * u = new (Lx::Malloc::mem())
-		Urb(*(Usb::Connection*)(urb->dev->bus->controller), *urb);
+	Urb * u = (Urb *)kzalloc(sizeof(Urb), mem_flags);
+	if (!u)
+		return 1;
+
+	Genode::construct_at<Urb>(u, *(Usb::Connection*)(urb->dev->bus->controller), *urb);
+
 	u->send();
 	return 0;
 }