From 2a7a824d83dc5fb33326b8b89625685f283a743b Mon Sep 17 00:00:00 2001 From: Jade Lovelace Date: Fri, 24 May 2024 20:45:05 -0600 Subject: [PATCH] libstore: parse the buildMode instead of unchecked cast Change-Id: Icf6af7935e8f139bef36b40ad475e973aa48855c --- src/libstore/daemon.cc | 6 +++--- src/libstore/store-api.cc | 8 ++++++++ src/libstore/store-api.hh | 3 +++ 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/libstore/daemon.cc b/src/libstore/daemon.cc index 242b4ddc6..420fc8bfe 100644 --- a/src/libstore/daemon.cc +++ b/src/libstore/daemon.cc @@ -527,7 +527,7 @@ static void performOp(TunnelLogger * logger, ref store, auto drvs = WorkerProto::Serialise::read(*store, rconn); BuildMode mode = bmNormal; if (GET_PROTOCOL_MINOR(clientVersion) >= 15) { - mode = (BuildMode) readInt(from); + mode = buildModeFromInteger(readInt(from)); /* Repairing is not atomic, so disallowed for "untrusted" clients. @@ -551,7 +551,7 @@ static void performOp(TunnelLogger * logger, ref store, case WorkerProto::Op::BuildPathsWithResults: { auto drvs = WorkerProto::Serialise::read(*store, rconn); BuildMode mode = bmNormal; - mode = (BuildMode) readInt(from); + mode = buildModeFromInteger(readInt(from)); /* Repairing is not atomic, so disallowed for "untrusted" clients. @@ -582,7 +582,7 @@ static void performOp(TunnelLogger * logger, ref store, * correctly. */ readDerivation(from, *store, drv, Derivation::nameFromPath(drvPath)); - BuildMode buildMode = (BuildMode) readInt(from); + BuildMode buildMode = buildModeFromInteger(readInt(from)); logger->startWork(); auto drvType = drv.type(); diff --git a/src/libstore/store-api.cc b/src/libstore/store-api.cc index 509b0fa68..ed3566f5e 100644 --- a/src/libstore/store-api.cc +++ b/src/libstore/store-api.cc @@ -22,6 +22,14 @@ using json = nlohmann::json; namespace nix { +BuildMode buildModeFromInteger(int raw) { + switch (raw) { + case bmNormal: return bmNormal; + case bmRepair: return bmRepair; + case bmCheck: return bmCheck; + default: throw Error("Invalid BuildMode"); + } +} bool Store::isInStore(PathView path) const { diff --git a/src/libstore/store-api.hh b/src/libstore/store-api.hh index 47e644fed..745fce594 100644 --- a/src/libstore/store-api.hh +++ b/src/libstore/store-api.hh @@ -90,6 +90,9 @@ const uint32_t exportMagic = 0x4558494e; enum BuildMode { bmNormal, bmRepair, bmCheck }; +/** Checks that a build mode is a valid one, then returns it */ +BuildMode buildModeFromInteger(int); + enum TrustedFlag : bool { NotTrusted = false, Trusted = true }; struct BuildResult;