From 94e4de6fd3413827dffec06d5a74b3e673a7cc2c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Edwin=20T=C3=B6r=C3=B6k?= <edvin.torok@citrix.com>
Date: Wed, 4 Nov 2020 19:52:20 +0000
Subject: XSA-354: ls_lR: separate recursion into separate function
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

This will make it easier to add quota checks.

Signed-off-by: Edwin Török <edvin.torok@citrix.com>
Acked-by: Christian Lindig <christian.lindig@citrix.com>

diff --git a/xc/xenops_server_xen.ml b/xc/xenops_server_xen.ml
index 912e97fa..84c59f13 100644
--- a/xc/xenops_server_xen.ml
+++ b/xc/xenops_server_xen.ml
@@ -2591,9 +2591,11 @@ module VM = struct
                      (Uuidm.to_string uuid))
               with Xs_protocol.Enoent _ -> ""
             in
-            let rec ls_lR root acc dir =
+            let ls_l root dir =
               let entry = root ^ "/" ^ dir in
-              let acc = try (dir, xs.Xs.read entry) :: acc with _ -> acc in
+              let value_opt =
+                try Some (dir, xs.Xs.read entry) with _ -> None
+              in
               let subdirs =
                 try
                   xs.Xs.directory entry
@@ -2601,6 +2603,13 @@ module VM = struct
                   |> map_tr (fun x -> dir ^ "/" ^ x)
                 with _ -> []
               in
+              (value_opt, subdirs)
+            in
+            let rec ls_lR root acc dir =
+              let value_opt, subdirs = ls_l root dir in
+              let acc =
+                match value_opt with Some v -> v :: acc | None -> acc
+              in
               List.fold_left (ls_lR root) acc subdirs
             in
             let guest_agent =
