diff --git a/flake.nix b/flake.nix
index fd06ef7df7cf6a96e865dbf1c7b95f1947bdbe50..c0573fbe80a4adbbdbbaebd6259021e350a25be4 100644
--- a/flake.nix
+++ b/flake.nix
@@ -28,6 +28,7 @@
         compilerVersion = ghcVersion;
         packageName = "gbs-downloader";
         hsPkgsOverrides = import ./nix/haskell-packages.nix {
+          inherit pkgs;
           haskellLib = pkgs.haskell.lib;
         };
       };
diff --git a/nix/haskell-packages.nix b/nix/haskell-packages.nix
index 0411c50574ae51acb05dd80f11bd70435fdebcfe..834ddd811b37b4157b87d57579679ba46ef3b9f5 100644
--- a/nix/haskell-packages.nix
+++ b/nix/haskell-packages.nix
@@ -1,8 +1,23 @@
-{haskellLib}: hfinal: hprev: {
+{
+  pkgs,
+  haskellLib,
+}: hfinal: hprev: {
   tahoe-chk = hfinal.callPackage ./tahoe-chk.nix {};
   tahoe-great-black-swamp = hfinal.callPackage ./tahoe-great-black-swamp.nix {};
 
   # A broken dependency of a tahoe-great-black-swamp executable that we don't
   # use.  Flip the broken bit so we can get a build.
   language-ecmascript = haskellLib.unmarkBroken hprev.language-ecmascript;
+
+  # hs-flake-utils does a callCabal2nix for us but we can't use it because we
+  # need to overide an argument.  This overlay runs before the hs-flake-utils
+  # overlay (a mistake?) so we can't even use hprev.gbs-downloader.override -
+  # we just have to re-do it all ourselves.
+  gbs-downloader = hfinal.callCabal2nix "gbs-downloader" ../. {
+    # cabal2nix gives the generated nix expression a `zlib` parameter which is
+    # then satisfied *from the Haskell package set* because there is a zlib
+    # package there and it gets precedence over the zlib in the top-level
+    # package set.  Then the build fails because that's not the zlib we want.
+    inherit (pkgs) zlib;
+  };
 }