Skip to content

Commit 3619618

Browse files
committed
fixup: make ItemHandle own a ref<Item> to prevent UAF on failed transfers
1 parent 2208cf9 commit 3619618

File tree

2 files changed

+7
-7
lines changed

2 files changed

+7
-7
lines changed

src/libstore/filetransfer.cc

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -962,7 +962,7 @@ struct curlFileTransfer : public FileTransfer
962962
writeFull(wakeupPipe.writeSide.get(), " ");
963963
#endif
964964

965-
return ItemHandle(static_cast<Item &>(*item));
965+
return ItemHandle(ref<Item>(std::move(item)));
966966
}
967967

968968
ItemHandle
@@ -977,7 +977,7 @@ struct curlFileTransfer : public FileTransfer
977977
return enqueueItem(item);
978978
} catch (const nix::Error & e) {
979979
item->fail(e);
980-
return ItemHandle(static_cast<Item &>(*item));
980+
return ItemHandle(ref<Item>(std::move(item)));
981981
}
982982
}
983983

@@ -986,7 +986,7 @@ struct curlFileTransfer : public FileTransfer
986986
return enqueueItem(item);
987987
} catch (const nix::Error & e) {
988988
item->fail(e);
989-
return ItemHandle(static_cast<Item &>(*item));
989+
return ItemHandle(ref<Item>(std::move(item)));
990990
}
991991
}
992992

@@ -1001,7 +1001,7 @@ struct curlFileTransfer : public FileTransfer
10011001

10021002
void unpauseTransfer(ItemHandle handle) override
10031003
{
1004-
unpauseTransfer(ref{static_cast<TransferItem &>(handle.item.get()).shared_from_this()});
1004+
unpauseTransfer(ref{static_cast<TransferItem &>(*handle.item).shared_from_this()});
10051005
}
10061006
};
10071007

src/libstore/include/nix/store/filetransfer.hh

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -262,11 +262,11 @@ public:
262262
*/
263263
struct ItemHandle
264264
{
265-
std::reference_wrapper<Item> item;
265+
ref<Item> item;
266266
friend struct FileTransfer;
267267

268-
ItemHandle(Item & item)
269-
: item(item)
268+
explicit ItemHandle(ref<Item> item)
269+
: item(std::move(item))
270270
{
271271
}
272272
};

0 commit comments

Comments
 (0)