From cf51dd13955c1eab521a2a610d1c7ca26fc01e05 Mon Sep 17 00:00:00 2001 From: Yang Ni Date: Wed, 19 Apr 2017 10:05:53 -0700 Subject: Increment sys ref count of input/output Allocations Bug: 30596040 In case such Allocations lose their other references and get deleted, while being used by a rsForEach() call. Test: CTS on x86_64 emulator Change-Id: I01bd9ef9235ad963b461d235f4d63c481e7c034d (cherry picked from commit 972be5160b8b52d07582fd0f0585524e2f7e143d) --- driver/rsdRuntimeStubs.cpp | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/driver/rsdRuntimeStubs.cpp b/driver/rsdRuntimeStubs.cpp index 504f0980..74c79182 100644 --- a/driver/rsdRuntimeStubs.cpp +++ b/driver/rsdRuntimeStubs.cpp @@ -683,10 +683,23 @@ void rsForEachInternal(int slot, Allocation* inputs[RS_KERNEL_MAX_ARGUMENTS]; for (int i = 0; i < numInputs; i++) { inputs[i] = (Allocation*)allocs[i].p; + CHECK_OBJ(inputs[i]); + inputs[i]->incSysRef(); + } + Allocation* out = nullptr; + if (hasOutput) { + out = (Allocation*)allocs[numInputs].p; + CHECK_OBJ(out); + out->incSysRef(); } - Allocation* out = hasOutput ? (Allocation*)allocs[numInputs].p : nullptr; rsrForEach(rsc, s, slot, numInputs, numInputs > 0 ? inputs : nullptr, out, nullptr, 0, (RsScriptCall*)options); + for (int i = 0; i < numInputs; i++) { + inputs[i]->decSysRef(); + } + if (hasOutput) { + out->decSysRef(); + } } void __attribute__((overloadable)) rsForEach(::rs_script script, -- cgit v1.2.3