Skip to content

Commit f7c29fa

Browse files
committed
cuda.core: validate IPC buffer import size against mapped extent
Reject peer-supplied IPCBufferDescriptor sizes larger than the driver-reported allocation extent before storing buf._size, preventing oversized cuMemcpyAsync lengths on imported buffers (Glasswing V2.2).
1 parent 25abc36 commit f7c29fa

2 files changed

Lines changed: 34 additions & 1 deletion

File tree

cuda_core/cuda/core/_memory/_ipc.pyx

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,20 @@ cdef Buffer Buffer_from_ipc_descriptor(
179179
)
180180
if not h_ptr:
181181
HANDLE_RETURN(get_last_error())
182-
return Buffer_from_deviceptr_handle(h_ptr, ipc_descriptor.size, mr, ipc_descriptor)
182+
cdef size_t mapped_size = 0
183+
cdef size_t claimed_size = ipc_descriptor.size
184+
with nogil:
185+
HANDLE_RETURN(cydriver.cuPointerGetAttribute(
186+
&mapped_size,
187+
cydriver.CU_POINTER_ATTRIBUTE_RANGE_SIZE,
188+
as_cu(h_ptr)))
189+
if claimed_size > mapped_size:
190+
h_ptr.reset()
191+
raise ValueError(
192+
f"IPC buffer descriptor size ({claimed_size}) exceeds "
193+
f"mapped allocation extent ({mapped_size} bytes)"
194+
)
195+
return Buffer_from_deviceptr_handle(h_ptr, claimed_size, mr, ipc_descriptor)
183196

184197

185198
# _MemPool IPC Implementation

cuda_core/tests/memory_ipc/test_errors.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
from helpers.child_processes import child_timeout_sec, kill_subprocesses
1010

1111
from cuda.core import Buffer, Device, DeviceMemoryResource, DeviceMemoryResourceOptions
12+
from cuda.core._memory import IPCBufferDescriptor
1213
from cuda.core._utils.cuda_utils import CUDAError
1314

1415
CHILD_TIMEOUT_SEC = child_timeout_sec()
@@ -88,6 +89,25 @@ def child_main(self, pipe, device, mr):
8889
pipe[1].put(exc_info)
8990

9091

92+
class TestImportOversizedBufferDescriptorSize(ChildErrorHarness):
93+
"""Reject peer-supplied sizes larger than the mapped allocation extent."""
94+
95+
def PARENT_ACTION(self, queue):
96+
self.buffer = self.mr.allocate(NBYTES, stream=self.device.default_stream)
97+
payload, _ = self.buffer.ipc_descriptor.__reduce__()[1]
98+
oversized = IPCBufferDescriptor._init(payload, NBYTES * 100)
99+
queue.put(oversized)
100+
101+
def CHILD_ACTION(self, queue):
102+
oversized = queue.get(timeout=CHILD_TIMEOUT_SEC)
103+
Buffer.from_ipc_descriptor(self.mr, oversized, stream=self.device.default_stream)
104+
105+
def ASSERT(self, exc_type, exc_msg):
106+
assert exc_type is ValueError
107+
assert "exceeds" in exc_msg
108+
assert "mapped allocation extent" in exc_msg
109+
110+
91111
class TestAllocFromImportedMr(ChildErrorHarness):
92112
"""Error when attempting to allocate from an import memory resource."""
93113

0 commit comments

Comments
 (0)