native_handle_t support.
- writeEmbeddedNativeHandle to write a native_handle_t*
embedded inside a buffer.
- Factored out writeEmbeddedBuffer to make clear the buffer
is pointed to from inside another buffer.
- readBuffer()/readEmbeddedBuffer()/readEmbeddedNativeHandle()
- Added writeNativeHandleNoDup()/readNativeHandleNoDup() to
avoid copying file descriptors around if the caller doesn't
need it.
- Moved the binder header modifications inside libhwbinder
for now, until we can get them upstreamed and pulled down
to bionic's uapi headers again.
Change-Id: I3a2c44732f5dc9ed92363552b42aa3ff55a06a8d
diff --git a/IPCThreadState.cpp b/IPCThreadState.cpp
index 7c0dc0a..dda2064 100644
--- a/IPCThreadState.cpp
+++ b/IPCThreadState.cpp
@@ -927,37 +927,36 @@
status_t IPCThreadState::writeTransactionData(int32_t cmd, uint32_t binderFlags,
int32_t handle, uint32_t code, const Parcel& data, status_t* statusBuffer)
{
- binder_transaction_data tr;
-
- tr.target.ptr = 0; /* Don't pass uninitialized stack data to a remote process */
- tr.target.handle = handle;
- tr.code = code;
- tr.flags = binderFlags;
- tr.cookie = 0;
- tr.sender_pid = 0;
- tr.sender_euid = 0;
+ binder_transaction_data_sg tr_sg;
+ tr_sg.tr.target.ptr = 0; /* Don't pass uninitialized stack data to a remote process */
+ tr_sg.tr.target.handle = handle;
+ tr_sg.tr.code = code;
+ tr_sg.tr.flags = binderFlags;
+ tr_sg.tr.cookie = 0;
+ tr_sg.tr.sender_pid = 0;
+ tr_sg.tr.sender_euid = 0;
const status_t err = data.errorCheck();
if (err == NO_ERROR) {
- tr.data_size = data.ipcDataSize();
- tr.data.ptr.buffer = data.ipcData();
- tr.offsets_size = data.ipcObjectsCount()*sizeof(binder_size_t);
- tr.data.ptr.offsets = data.ipcObjects();
- tr.buffers_size = data.ipcBufferSize();
+ tr_sg.tr.data_size = data.ipcDataSize();
+ tr_sg.tr.data.ptr.buffer = data.ipcData();
+ tr_sg.tr.offsets_size = data.ipcObjectsCount()*sizeof(binder_size_t);
+ tr_sg.tr.data.ptr.offsets = data.ipcObjects();
+ tr_sg.buffers_size = data.ipcBufferSize();
} else if (statusBuffer) {
- tr.flags |= TF_STATUS_CODE;
+ tr_sg.tr.flags |= TF_STATUS_CODE;
*statusBuffer = err;
- tr.data_size = sizeof(status_t);
- tr.data.ptr.buffer = reinterpret_cast<uintptr_t>(statusBuffer);
- tr.offsets_size = 0;
- tr.data.ptr.offsets = 0;
- tr.buffers_size = 0;
+ tr_sg.tr.data_size = sizeof(status_t);
+ tr_sg.tr.data.ptr.buffer = reinterpret_cast<uintptr_t>(statusBuffer);
+ tr_sg.tr.offsets_size = 0;
+ tr_sg.tr.data.ptr.offsets = 0;
+ tr_sg.buffers_size = 0;
} else {
return (mLastError = err);
}
mOut.writeInt32(cmd);
- mOut.write(&tr, sizeof(tr));
+ mOut.write(&tr_sg, sizeof(tr_sg));
return NO_ERROR;
}