Home | History | Annotate | Download | only in binder
      1 /*
      2  * Copyright (C) 2005 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #define LOG_TAG "Parcel"
     18 //#define LOG_NDEBUG 0
     19 
     20 #include <errno.h>
     21 #include <fcntl.h>
     22 #include <inttypes.h>
     23 #include <pthread.h>
     24 #include <stdint.h>
     25 #include <stdio.h>
     26 #include <stdlib.h>
     27 #include <sys/mman.h>
     28 #include <sys/stat.h>
     29 #include <sys/types.h>
     30 #include <sys/resource.h>
     31 #include <unistd.h>
     32 
     33 #include <binder/Binder.h>
     34 #include <binder/BpBinder.h>
     35 #include <binder/IPCThreadState.h>
     36 #include <binder/Parcel.h>
     37 #include <binder/ProcessState.h>
     38 #include <binder/Status.h>
     39 #include <binder/TextOutput.h>
     40 #include <binder/Value.h>
     41 
     42 #include <cutils/ashmem.h>
     43 #include <utils/Debug.h>
     44 #include <utils/Flattenable.h>
     45 #include <utils/Log.h>
     46 #include <utils/misc.h>
     47 #include <utils/String8.h>
     48 #include <utils/String16.h>
     49 
     50 #include <private/binder/binder_module.h>
     51 #include <private/binder/Static.h>
     52 
     53 #ifndef INT32_MAX
     54 #define INT32_MAX ((int32_t)(2147483647))
     55 #endif
     56 
     57 #define LOG_REFS(...)
     58 //#define LOG_REFS(...) ALOG(LOG_DEBUG, LOG_TAG, __VA_ARGS__)
     59 #define LOG_ALLOC(...)
     60 //#define LOG_ALLOC(...) ALOG(LOG_DEBUG, LOG_TAG, __VA_ARGS__)
     61 
     62 // ---------------------------------------------------------------------------
     63 
     64 // This macro should never be used at runtime, as a too large value
     65 // of s could cause an integer overflow. Instead, you should always
     66 // use the wrapper function pad_size()
     67 #define PAD_SIZE_UNSAFE(s) (((s)+3)&~3)
     68 
     69 static size_t pad_size(size_t s) {
     70     if (s > (SIZE_T_MAX - 3)) {
     71         abort();
     72     }
     73     return PAD_SIZE_UNSAFE(s);
     74 }
     75 
     76 // Note: must be kept in sync with android/os/StrictMode.java's PENALTY_GATHER
     77 #define STRICT_MODE_PENALTY_GATHER (0x40 << 16)
     78 
     79 // XXX This can be made public if we want to provide
     80 // support for typed data.
     81 struct small_flat_data
     82 {
     83     uint32_t type;
     84     uint32_t data;
     85 };
     86 
     87 namespace android {
     88 
     89 static pthread_mutex_t gParcelGlobalAllocSizeLock = PTHREAD_MUTEX_INITIALIZER;
     90 static size_t gParcelGlobalAllocSize = 0;
     91 static size_t gParcelGlobalAllocCount = 0;
     92 
     93 static size_t gMaxFds = 0;
     94 
     95 // Maximum size of a blob to transfer in-place.
     96 static const size_t BLOB_INPLACE_LIMIT = 16 * 1024;
     97 
     98 enum {
     99     BLOB_INPLACE = 0,
    100     BLOB_ASHMEM_IMMUTABLE = 1,
    101     BLOB_ASHMEM_MUTABLE = 2,
    102 };
    103 
    104 void acquire_object(const sp<ProcessState>& proc,
    105     const flat_binder_object& obj, const void* who, size_t* outAshmemSize)
    106 {
    107     switch (obj.hdr.type) {
    108         case BINDER_TYPE_BINDER:
    109             if (obj.binder) {
    110                 LOG_REFS("Parcel %p acquiring reference on local %p", who, obj.cookie);
    111                 reinterpret_cast<IBinder*>(obj.cookie)->incStrong(who);
    112             }
    113             return;
    114         case BINDER_TYPE_WEAK_BINDER:
    115             if (obj.binder)
    116                 reinterpret_cast<RefBase::weakref_type*>(obj.binder)->incWeak(who);
    117             return;
    118         case BINDER_TYPE_HANDLE: {
    119             const sp<IBinder> b = proc->getStrongProxyForHandle(obj.handle);
    120             if (b != NULL) {
    121                 LOG_REFS("Parcel %p acquiring reference on remote %p", who, b.get());
    122                 b->incStrong(who);
    123             }
    124             return;
    125         }
    126         case BINDER_TYPE_WEAK_HANDLE: {
    127             const wp<IBinder> b = proc->getWeakProxyForHandle(obj.handle);
    128             if (b != NULL) b.get_refs()->incWeak(who);
    129             return;
    130         }
    131         case BINDER_TYPE_FD: {
    132             if ((obj.cookie != 0) && (outAshmemSize != NULL) && ashmem_valid(obj.handle)) {
    133                 // If we own an ashmem fd, keep track of how much memory it refers to.
    134                 int size = ashmem_get_size_region(obj.handle);
    135                 if (size > 0) {
    136                     *outAshmemSize += size;
    137                 }
    138             }
    139             return;
    140         }
    141     }
    142 
    143     ALOGD("Invalid object type 0x%08x", obj.hdr.type);
    144 }
    145 
    146 void acquire_object(const sp<ProcessState>& proc,
    147     const flat_binder_object& obj, const void* who)
    148 {
    149     acquire_object(proc, obj, who, NULL);
    150 }
    151 
    152 static void release_object(const sp<ProcessState>& proc,
    153     const flat_binder_object& obj, const void* who, size_t* outAshmemSize)
    154 {
    155     switch (obj.hdr.type) {
    156         case BINDER_TYPE_BINDER:
    157             if (obj.binder) {
    158                 LOG_REFS("Parcel %p releasing reference on local %p", who, obj.cookie);
    159                 reinterpret_cast<IBinder*>(obj.cookie)->decStrong(who);
    160             }
    161             return;
    162         case BINDER_TYPE_WEAK_BINDER:
    163             if (obj.binder)
    164                 reinterpret_cast<RefBase::weakref_type*>(obj.binder)->decWeak(who);
    165             return;
    166         case BINDER_TYPE_HANDLE: {
    167             const sp<IBinder> b = proc->getStrongProxyForHandle(obj.handle);
    168             if (b != NULL) {
    169                 LOG_REFS("Parcel %p releasing reference on remote %p", who, b.get());
    170                 b->decStrong(who);
    171             }
    172             return;
    173         }
    174         case BINDER_TYPE_WEAK_HANDLE: {
    175             const wp<IBinder> b = proc->getWeakProxyForHandle(obj.handle);
    176             if (b != NULL) b.get_refs()->decWeak(who);
    177             return;
    178         }
    179         case BINDER_TYPE_FD: {
    180             if (obj.cookie != 0) { // owned
    181                 if ((outAshmemSize != NULL) && ashmem_valid(obj.handle)) {
    182                     int size = ashmem_get_size_region(obj.handle);
    183                     if (size > 0) {
    184                         *outAshmemSize -= size;
    185                     }
    186                 }
    187 
    188                 close(obj.handle);
    189             }
    190             return;
    191         }
    192     }
    193 
    194     ALOGE("Invalid object type 0x%08x", obj.hdr.type);
    195 }
    196 
    197 void release_object(const sp<ProcessState>& proc,
    198     const flat_binder_object& obj, const void* who)
    199 {
    200     release_object(proc, obj, who, NULL);
    201 }
    202 
    203 inline static status_t finish_flatten_binder(
    204     const sp<IBinder>& /*binder*/, const flat_binder_object& flat, Parcel* out)
    205 {
    206     return out->writeObject(flat, false);
    207 }
    208 
    209 status_t flatten_binder(const sp<ProcessState>& /*proc*/,
    210     const sp<IBinder>& binder, Parcel* out)
    211 {
    212     flat_binder_object obj;
    213 
    214     if (IPCThreadState::self()->backgroundSchedulingDisabled()) {
    215         /* minimum priority for all nodes is nice 0 */
    216         obj.flags = FLAT_BINDER_FLAG_ACCEPTS_FDS;
    217     } else {
    218         /* minimum priority for all nodes is MAX_NICE(19) */
    219         obj.flags = 0x13 | FLAT_BINDER_FLAG_ACCEPTS_FDS;
    220     }
    221 
    222     if (binder != NULL) {
    223         IBinder *local = binder->localBinder();
    224         if (!local) {
    225             BpBinder *proxy = binder->remoteBinder();
    226             if (proxy == NULL) {
    227                 ALOGE("null proxy");
    228             }
    229             const int32_t handle = proxy ? proxy->handle() : 0;
    230             obj.hdr.type = BINDER_TYPE_HANDLE;
    231             obj.binder = 0; /* Don't pass uninitialized stack data to a remote process */
    232             obj.handle = handle;
    233             obj.cookie = 0;
    234         } else {
    235             obj.hdr.type = BINDER_TYPE_BINDER;
    236             obj.binder = reinterpret_cast<uintptr_t>(local->getWeakRefs());
    237             obj.cookie = reinterpret_cast<uintptr_t>(local);
    238         }
    239     } else {
    240         obj.hdr.type = BINDER_TYPE_BINDER;
    241         obj.binder = 0;
    242         obj.cookie = 0;
    243     }
    244 
    245     return finish_flatten_binder(binder, obj, out);
    246 }
    247 
    248 status_t flatten_binder(const sp<ProcessState>& /*proc*/,
    249     const wp<IBinder>& binder, Parcel* out)
    250 {
    251     flat_binder_object obj;
    252 
    253     obj.flags = 0x7f | FLAT_BINDER_FLAG_ACCEPTS_FDS;
    254     if (binder != NULL) {
    255         sp<IBinder> real = binder.promote();
    256         if (real != NULL) {
    257             IBinder *local = real->localBinder();
    258             if (!local) {
    259                 BpBinder *proxy = real->remoteBinder();
    260                 if (proxy == NULL) {
    261                     ALOGE("null proxy");
    262                 }
    263                 const int32_t handle = proxy ? proxy->handle() : 0;
    264                 obj.hdr.type = BINDER_TYPE_WEAK_HANDLE;
    265                 obj.binder = 0; /* Don't pass uninitialized stack data to a remote process */
    266                 obj.handle = handle;
    267                 obj.cookie = 0;
    268             } else {
    269                 obj.hdr.type = BINDER_TYPE_WEAK_BINDER;
    270                 obj.binder = reinterpret_cast<uintptr_t>(binder.get_refs());
    271                 obj.cookie = reinterpret_cast<uintptr_t>(binder.unsafe_get());
    272             }
    273             return finish_flatten_binder(real, obj, out);
    274         }
    275 
    276         // XXX How to deal?  In order to flatten the given binder,
    277         // we need to probe it for information, which requires a primary
    278         // reference...  but we don't have one.
    279         //
    280         // The OpenBinder implementation uses a dynamic_cast<> here,
    281         // but we can't do that with the different reference counting
    282         // implementation we are using.
    283         ALOGE("Unable to unflatten Binder weak reference!");
    284         obj.hdr.type = BINDER_TYPE_BINDER;
    285         obj.binder = 0;
    286         obj.cookie = 0;
    287         return finish_flatten_binder(NULL, obj, out);
    288 
    289     } else {
    290         obj.hdr.type = BINDER_TYPE_BINDER;
    291         obj.binder = 0;
    292         obj.cookie = 0;
    293         return finish_flatten_binder(NULL, obj, out);
    294     }
    295 }
    296 
    297 inline static status_t finish_unflatten_binder(
    298     BpBinder* /*proxy*/, const flat_binder_object& /*flat*/,
    299     const Parcel& /*in*/)
    300 {
    301     return NO_ERROR;
    302 }
    303 
    304 status_t unflatten_binder(const sp<ProcessState>& proc,
    305     const Parcel& in, sp<IBinder>* out)
    306 {
    307     const flat_binder_object* flat = in.readObject(false);
    308 
    309     if (flat) {
    310         switch (flat->hdr.type) {
    311             case BINDER_TYPE_BINDER:
    312                 *out = reinterpret_cast<IBinder*>(flat->cookie);
    313                 return finish_unflatten_binder(NULL, *flat, in);
    314             case BINDER_TYPE_HANDLE:
    315                 *out = proc->getStrongProxyForHandle(flat->handle);
    316                 return finish_unflatten_binder(
    317                     static_cast<BpBinder*>(out->get()), *flat, in);
    318         }
    319     }
    320     return BAD_TYPE;
    321 }
    322 
    323 status_t unflatten_binder(const sp<ProcessState>& proc,
    324     const Parcel& in, wp<IBinder>* out)
    325 {
    326     const flat_binder_object* flat = in.readObject(false);
    327 
    328     if (flat) {
    329         switch (flat->hdr.type) {
    330             case BINDER_TYPE_BINDER:
    331                 *out = reinterpret_cast<IBinder*>(flat->cookie);
    332                 return finish_unflatten_binder(NULL, *flat, in);
    333             case BINDER_TYPE_WEAK_BINDER:
    334                 if (flat->binder != 0) {
    335                     out->set_object_and_refs(
    336                         reinterpret_cast<IBinder*>(flat->cookie),
    337                         reinterpret_cast<RefBase::weakref_type*>(flat->binder));
    338                 } else {
    339                     *out = NULL;
    340                 }
    341                 return finish_unflatten_binder(NULL, *flat, in);
    342             case BINDER_TYPE_HANDLE:
    343             case BINDER_TYPE_WEAK_HANDLE:
    344                 *out = proc->getWeakProxyForHandle(flat->handle);
    345                 return finish_unflatten_binder(
    346                     static_cast<BpBinder*>(out->unsafe_get()), *flat, in);
    347         }
    348     }
    349     return BAD_TYPE;
    350 }
    351 
    352 // ---------------------------------------------------------------------------
    353 
    354 Parcel::Parcel()
    355 {
    356     LOG_ALLOC("Parcel %p: constructing", this);
    357     initState();
    358 }
    359 
    360 Parcel::~Parcel()
    361 {
    362     freeDataNoInit();
    363     LOG_ALLOC("Parcel %p: destroyed", this);
    364 }
    365 
    366 size_t Parcel::getGlobalAllocSize() {
    367     pthread_mutex_lock(&gParcelGlobalAllocSizeLock);
    368     size_t size = gParcelGlobalAllocSize;
    369     pthread_mutex_unlock(&gParcelGlobalAllocSizeLock);
    370     return size;
    371 }
    372 
    373 size_t Parcel::getGlobalAllocCount() {
    374     pthread_mutex_lock(&gParcelGlobalAllocSizeLock);
    375     size_t count = gParcelGlobalAllocCount;
    376     pthread_mutex_unlock(&gParcelGlobalAllocSizeLock);
    377     return count;
    378 }
    379 
    380 const uint8_t* Parcel::data() const
    381 {
    382     return mData;
    383 }
    384 
    385 size_t Parcel::dataSize() const
    386 {
    387     return (mDataSize > mDataPos ? mDataSize : mDataPos);
    388 }
    389 
    390 size_t Parcel::dataAvail() const
    391 {
    392     size_t result = dataSize() - dataPosition();
    393     if (result > INT32_MAX) {
    394         abort();
    395     }
    396     return result;
    397 }
    398 
    399 size_t Parcel::dataPosition() const
    400 {
    401     return mDataPos;
    402 }
    403 
    404 size_t Parcel::dataCapacity() const
    405 {
    406     return mDataCapacity;
    407 }
    408 
    409 status_t Parcel::setDataSize(size_t size)
    410 {
    411     if (size > INT32_MAX) {
    412         // don't accept size_t values which may have come from an
    413         // inadvertent conversion from a negative int.
    414         return BAD_VALUE;
    415     }
    416 
    417     status_t err;
    418     err = continueWrite(size);
    419     if (err == NO_ERROR) {
    420         mDataSize = size;
    421         ALOGV("setDataSize Setting data size of %p to %zu", this, mDataSize);
    422     }
    423     return err;
    424 }
    425 
    426 void Parcel::setDataPosition(size_t pos) const
    427 {
    428     if (pos > INT32_MAX) {
    429         // don't accept size_t values which may have come from an
    430         // inadvertent conversion from a negative int.
    431         abort();
    432     }
    433 
    434     mDataPos = pos;
    435     mNextObjectHint = 0;
    436     mObjectsSorted = false;
    437 }
    438 
    439 status_t Parcel::setDataCapacity(size_t size)
    440 {
    441     if (size > INT32_MAX) {
    442         // don't accept size_t values which may have come from an
    443         // inadvertent conversion from a negative int.
    444         return BAD_VALUE;
    445     }
    446 
    447     if (size > mDataCapacity) return continueWrite(size);
    448     return NO_ERROR;
    449 }
    450 
    451 status_t Parcel::setData(const uint8_t* buffer, size_t len)
    452 {
    453     if (len > INT32_MAX) {
    454         // don't accept size_t values which may have come from an
    455         // inadvertent conversion from a negative int.
    456         return BAD_VALUE;
    457     }
    458 
    459     status_t err = restartWrite(len);
    460     if (err == NO_ERROR) {
    461         memcpy(const_cast<uint8_t*>(data()), buffer, len);
    462         mDataSize = len;
    463         mFdsKnown = false;
    464     }
    465     return err;
    466 }
    467 
    468 status_t Parcel::appendFrom(const Parcel *parcel, size_t offset, size_t len)
    469 {
    470     const sp<ProcessState> proc(ProcessState::self());
    471     status_t err;
    472     const uint8_t *data = parcel->mData;
    473     const binder_size_t *objects = parcel->mObjects;
    474     size_t size = parcel->mObjectsSize;
    475     int startPos = mDataPos;
    476     int firstIndex = -1, lastIndex = -2;
    477 
    478     if (len == 0) {
    479         return NO_ERROR;
    480     }
    481 
    482     if (len > INT32_MAX) {
    483         // don't accept size_t values which may have come from an
    484         // inadvertent conversion from a negative int.
    485         return BAD_VALUE;
    486     }
    487 
    488     // range checks against the source parcel size
    489     if ((offset > parcel->mDataSize)
    490             || (len > parcel->mDataSize)
    491             || (offset + len > parcel->mDataSize)) {
    492         return BAD_VALUE;
    493     }
    494 
    495     // Count objects in range
    496     for (int i = 0; i < (int) size; i++) {
    497         size_t off = objects[i];
    498         if ((off >= offset) && (off + sizeof(flat_binder_object) <= offset + len)) {
    499             if (firstIndex == -1) {
    500                 firstIndex = i;
    501             }
    502             lastIndex = i;
    503         }
    504     }
    505     int numObjects = lastIndex - firstIndex + 1;
    506 
    507     if ((mDataSize+len) > mDataCapacity) {
    508         // grow data
    509         err = growData(len);
    510         if (err != NO_ERROR) {
    511             return err;
    512         }
    513     }
    514 
    515     // append data
    516     memcpy(mData + mDataPos, data + offset, len);
    517     mDataPos += len;
    518     mDataSize += len;
    519 
    520     err = NO_ERROR;
    521 
    522     if (numObjects > 0) {
    523         // grow objects
    524         if (mObjectsCapacity < mObjectsSize + numObjects) {
    525             size_t newSize = ((mObjectsSize + numObjects)*3)/2;
    526             if (newSize*sizeof(binder_size_t) < mObjectsSize) return NO_MEMORY;   // overflow
    527             binder_size_t *objects =
    528                 (binder_size_t*)realloc(mObjects, newSize*sizeof(binder_size_t));
    529             if (objects == (binder_size_t*)0) {
    530                 return NO_MEMORY;
    531             }
    532             mObjects = objects;
    533             mObjectsCapacity = newSize;
    534         }
    535 
    536         // append and acquire objects
    537         int idx = mObjectsSize;
    538         for (int i = firstIndex; i <= lastIndex; i++) {
    539             size_t off = objects[i] - offset + startPos;
    540             mObjects[idx++] = off;
    541             mObjectsSize++;
    542 
    543             flat_binder_object* flat
    544                 = reinterpret_cast<flat_binder_object*>(mData + off);
    545             acquire_object(proc, *flat, this, &mOpenAshmemSize);
    546 
    547             if (flat->hdr.type == BINDER_TYPE_FD) {
    548                 // If this is a file descriptor, we need to dup it so the
    549                 // new Parcel now owns its own fd, and can declare that we
    550                 // officially know we have fds.
    551                 flat->handle = fcntl(flat->handle, F_DUPFD_CLOEXEC, 0);
    552                 flat->cookie = 1;
    553                 mHasFds = mFdsKnown = true;
    554                 if (!mAllowFds) {
    555                     err = FDS_NOT_ALLOWED;
    556                 }
    557             }
    558         }
    559     }
    560 
    561     return err;
    562 }
    563 
    564 int Parcel::compareData(const Parcel& other) {
    565     size_t size = dataSize();
    566     if (size != other.dataSize()) {
    567         return size < other.dataSize() ? -1 : 1;
    568     }
    569     return memcmp(data(), other.data(), size);
    570 }
    571 
    572 bool Parcel::allowFds() const
    573 {
    574     return mAllowFds;
    575 }
    576 
    577 bool Parcel::pushAllowFds(bool allowFds)
    578 {
    579     const bool origValue = mAllowFds;
    580     if (!allowFds) {
    581         mAllowFds = false;
    582     }
    583     return origValue;
    584 }
    585 
    586 void Parcel::restoreAllowFds(bool lastValue)
    587 {
    588     mAllowFds = lastValue;
    589 }
    590 
    591 bool Parcel::hasFileDescriptors() const
    592 {
    593     if (!mFdsKnown) {
    594         scanForFds();
    595     }
    596     return mHasFds;
    597 }
    598 
    599 // Write RPC headers.  (previously just the interface token)
    600 status_t Parcel::writeInterfaceToken(const String16& interface)
    601 {
    602     writeInt32(IPCThreadState::self()->getStrictModePolicy() |
    603                STRICT_MODE_PENALTY_GATHER);
    604     // currently the interface identification token is just its name as a string
    605     return writeString16(interface);
    606 }
    607 
    608 bool Parcel::checkInterface(IBinder* binder) const
    609 {
    610     return enforceInterface(binder->getInterfaceDescriptor());
    611 }
    612 
    613 bool Parcel::enforceInterface(const String16& interface,
    614                               IPCThreadState* threadState) const
    615 {
    616     int32_t strictPolicy = readInt32();
    617     if (threadState == NULL) {
    618         threadState = IPCThreadState::self();
    619     }
    620     if ((threadState->getLastTransactionBinderFlags() &
    621          IBinder::FLAG_ONEWAY) != 0) {
    622       // For one-way calls, the callee is running entirely
    623       // disconnected from the caller, so disable StrictMode entirely.
    624       // Not only does disk/network usage not impact the caller, but
    625       // there's no way to commuicate back any violations anyway.
    626       threadState->setStrictModePolicy(0);
    627     } else {
    628       threadState->setStrictModePolicy(strictPolicy);
    629     }
    630     const String16 str(readString16());
    631     if (str == interface) {
    632         return true;
    633     } else {
    634         ALOGW("**** enforceInterface() expected '%s' but read '%s'",
    635                 String8(interface).string(), String8(str).string());
    636         return false;
    637     }
    638 }
    639 
    640 const binder_size_t* Parcel::objects() const
    641 {
    642     return mObjects;
    643 }
    644 
    645 size_t Parcel::objectsCount() const
    646 {
    647     return mObjectsSize;
    648 }
    649 
    650 status_t Parcel::errorCheck() const
    651 {
    652     return mError;
    653 }
    654 
    655 void Parcel::setError(status_t err)
    656 {
    657     mError = err;
    658 }
    659 
    660 status_t Parcel::finishWrite(size_t len)
    661 {
    662     if (len > INT32_MAX) {
    663         // don't accept size_t values which may have come from an
    664         // inadvertent conversion from a negative int.
    665         return BAD_VALUE;
    666     }
    667 
    668     //printf("Finish write of %d\n", len);
    669     mDataPos += len;
    670     ALOGV("finishWrite Setting data pos of %p to %zu", this, mDataPos);
    671     if (mDataPos > mDataSize) {
    672         mDataSize = mDataPos;
    673         ALOGV("finishWrite Setting data size of %p to %zu", this, mDataSize);
    674     }
    675     //printf("New pos=%d, size=%d\n", mDataPos, mDataSize);
    676     return NO_ERROR;
    677 }
    678 
    679 status_t Parcel::writeUnpadded(const void* data, size_t len)
    680 {
    681     if (len > INT32_MAX) {
    682         // don't accept size_t values which may have come from an
    683         // inadvertent conversion from a negative int.
    684         return BAD_VALUE;
    685     }
    686 
    687     size_t end = mDataPos + len;
    688     if (end < mDataPos) {
    689         // integer overflow
    690         return BAD_VALUE;
    691     }
    692 
    693     if (end <= mDataCapacity) {
    694 restart_write:
    695         memcpy(mData+mDataPos, data, len);
    696         return finishWrite(len);
    697     }
    698 
    699     status_t err = growData(len);
    700     if (err == NO_ERROR) goto restart_write;
    701     return err;
    702 }
    703 
    704 status_t Parcel::write(const void* data, size_t len)
    705 {
    706     if (len > INT32_MAX) {
    707         // don't accept size_t values which may have come from an
    708         // inadvertent conversion from a negative int.
    709         return BAD_VALUE;
    710     }
    711 
    712     void* const d = writeInplace(len);
    713     if (d) {
    714         memcpy(d, data, len);
    715         return NO_ERROR;
    716     }
    717     return mError;
    718 }
    719 
    720 void* Parcel::writeInplace(size_t len)
    721 {
    722     if (len > INT32_MAX) {
    723         // don't accept size_t values which may have come from an
    724         // inadvertent conversion from a negative int.
    725         return NULL;
    726     }
    727 
    728     const size_t padded = pad_size(len);
    729 
    730     // sanity check for integer overflow
    731     if (mDataPos+padded < mDataPos) {
    732         return NULL;
    733     }
    734 
    735     if ((mDataPos+padded) <= mDataCapacity) {
    736 restart_write:
    737         //printf("Writing %ld bytes, padded to %ld\n", len, padded);
    738         uint8_t* const data = mData+mDataPos;
    739 
    740         // Need to pad at end?
    741         if (padded != len) {
    742 #if BYTE_ORDER == BIG_ENDIAN
    743             static const uint32_t mask[4] = {
    744                 0x00000000, 0xffffff00, 0xffff0000, 0xff000000
    745             };
    746 #endif
    747 #if BYTE_ORDER == LITTLE_ENDIAN
    748             static const uint32_t mask[4] = {
    749                 0x00000000, 0x00ffffff, 0x0000ffff, 0x000000ff
    750             };
    751 #endif
    752             //printf("Applying pad mask: %p to %p\n", (void*)mask[padded-len],
    753             //    *reinterpret_cast<void**>(data+padded-4));
    754             *reinterpret_cast<uint32_t*>(data+padded-4) &= mask[padded-len];
    755         }
    756 
    757         finishWrite(padded);
    758         return data;
    759     }
    760 
    761     status_t err = growData(padded);
    762     if (err == NO_ERROR) goto restart_write;
    763     return NULL;
    764 }
    765 
    766 status_t Parcel::writeUtf8AsUtf16(const std::string& str) {
    767     const uint8_t* strData = (uint8_t*)str.data();
    768     const size_t strLen= str.length();
    769     const ssize_t utf16Len = utf8_to_utf16_length(strData, strLen);
    770     if (utf16Len < 0 || utf16Len > std::numeric_limits<int32_t>::max()) {
    771         return BAD_VALUE;
    772     }
    773 
    774     status_t err = writeInt32(utf16Len);
    775     if (err) {
    776         return err;
    777     }
    778 
    779     // Allocate enough bytes to hold our converted string and its terminating NULL.
    780     void* dst = writeInplace((utf16Len + 1) * sizeof(char16_t));
    781     if (!dst) {
    782         return NO_MEMORY;
    783     }
    784 
    785     utf8_to_utf16(strData, strLen, (char16_t*)dst, (size_t) utf16Len + 1);
    786 
    787     return NO_ERROR;
    788 }
    789 
    790 status_t Parcel::writeUtf8AsUtf16(const std::unique_ptr<std::string>& str) {
    791   if (!str) {
    792     return writeInt32(-1);
    793   }
    794   return writeUtf8AsUtf16(*str);
    795 }
    796 
    797 namespace {
    798 
    799 template<typename T>
    800 status_t writeByteVectorInternal(Parcel* parcel, const std::vector<T>& val)
    801 {
    802     status_t status;
    803     if (val.size() > std::numeric_limits<int32_t>::max()) {
    804         status = BAD_VALUE;
    805         return status;
    806     }
    807 
    808     status = parcel->writeInt32(val.size());
    809     if (status != OK) {
    810         return status;
    811     }
    812 
    813     void* data = parcel->writeInplace(val.size());
    814     if (!data) {
    815         status = BAD_VALUE;
    816         return status;
    817     }
    818 
    819     memcpy(data, val.data(), val.size());
    820     return status;
    821 }
    822 
    823 template<typename T>
    824 status_t writeByteVectorInternalPtr(Parcel* parcel,
    825                                     const std::unique_ptr<std::vector<T>>& val)
    826 {
    827     if (!val) {
    828         return parcel->writeInt32(-1);
    829     }
    830 
    831     return writeByteVectorInternal(parcel, *val);
    832 }
    833 
    834 }  // namespace
    835 
    836 status_t Parcel::writeByteVector(const std::vector<int8_t>& val) {
    837     return writeByteVectorInternal(this, val);
    838 }
    839 
    840 status_t Parcel::writeByteVector(const std::unique_ptr<std::vector<int8_t>>& val)
    841 {
    842     return writeByteVectorInternalPtr(this, val);
    843 }
    844 
    845 status_t Parcel::writeByteVector(const std::vector<uint8_t>& val) {
    846     return writeByteVectorInternal(this, val);
    847 }
    848 
    849 status_t Parcel::writeByteVector(const std::unique_ptr<std::vector<uint8_t>>& val)
    850 {
    851     return writeByteVectorInternalPtr(this, val);
    852 }
    853 
    854 status_t Parcel::writeInt32Vector(const std::vector<int32_t>& val)
    855 {
    856     return writeTypedVector(val, &Parcel::writeInt32);
    857 }
    858 
    859 status_t Parcel::writeInt32Vector(const std::unique_ptr<std::vector<int32_t>>& val)
    860 {
    861     return writeNullableTypedVector(val, &Parcel::writeInt32);
    862 }
    863 
    864 status_t Parcel::writeInt64Vector(const std::vector<int64_t>& val)
    865 {
    866     return writeTypedVector(val, &Parcel::writeInt64);
    867 }
    868 
    869 status_t Parcel::writeInt64Vector(const std::unique_ptr<std::vector<int64_t>>& val)
    870 {
    871     return writeNullableTypedVector(val, &Parcel::writeInt64);
    872 }
    873 
    874 status_t Parcel::writeFloatVector(const std::vector<float>& val)
    875 {
    876     return writeTypedVector(val, &Parcel::writeFloat);
    877 }
    878 
    879 status_t Parcel::writeFloatVector(const std::unique_ptr<std::vector<float>>& val)
    880 {
    881     return writeNullableTypedVector(val, &Parcel::writeFloat);
    882 }
    883 
    884 status_t Parcel::writeDoubleVector(const std::vector<double>& val)
    885 {
    886     return writeTypedVector(val, &Parcel::writeDouble);
    887 }
    888 
    889 status_t Parcel::writeDoubleVector(const std::unique_ptr<std::vector<double>>& val)
    890 {
    891     return writeNullableTypedVector(val, &Parcel::writeDouble);
    892 }
    893 
    894 status_t Parcel::writeBoolVector(const std::vector<bool>& val)
    895 {
    896     return writeTypedVector(val, &Parcel::writeBool);
    897 }
    898 
    899 status_t Parcel::writeBoolVector(const std::unique_ptr<std::vector<bool>>& val)
    900 {
    901     return writeNullableTypedVector(val, &Parcel::writeBool);
    902 }
    903 
    904 status_t Parcel::writeCharVector(const std::vector<char16_t>& val)
    905 {
    906     return writeTypedVector(val, &Parcel::writeChar);
    907 }
    908 
    909 status_t Parcel::writeCharVector(const std::unique_ptr<std::vector<char16_t>>& val)
    910 {
    911     return writeNullableTypedVector(val, &Parcel::writeChar);
    912 }
    913 
    914 status_t Parcel::writeString16Vector(const std::vector<String16>& val)
    915 {
    916     return writeTypedVector(val, &Parcel::writeString16);
    917 }
    918 
    919 status_t Parcel::writeString16Vector(
    920         const std::unique_ptr<std::vector<std::unique_ptr<String16>>>& val)
    921 {
    922     return writeNullableTypedVector(val, &Parcel::writeString16);
    923 }
    924 
    925 status_t Parcel::writeUtf8VectorAsUtf16Vector(
    926                         const std::unique_ptr<std::vector<std::unique_ptr<std::string>>>& val) {
    927     return writeNullableTypedVector(val, &Parcel::writeUtf8AsUtf16);
    928 }
    929 
    930 status_t Parcel::writeUtf8VectorAsUtf16Vector(const std::vector<std::string>& val) {
    931     return writeTypedVector(val, &Parcel::writeUtf8AsUtf16);
    932 }
    933 
    934 status_t Parcel::writeInt32(int32_t val)
    935 {
    936     return writeAligned(val);
    937 }
    938 
    939 status_t Parcel::writeUint32(uint32_t val)
    940 {
    941     return writeAligned(val);
    942 }
    943 
    944 status_t Parcel::writeInt32Array(size_t len, const int32_t *val) {
    945     if (len > INT32_MAX) {
    946         // don't accept size_t values which may have come from an
    947         // inadvertent conversion from a negative int.
    948         return BAD_VALUE;
    949     }
    950 
    951     if (!val) {
    952         return writeInt32(-1);
    953     }
    954     status_t ret = writeInt32(static_cast<uint32_t>(len));
    955     if (ret == NO_ERROR) {
    956         ret = write(val, len * sizeof(*val));
    957     }
    958     return ret;
    959 }
    960 status_t Parcel::writeByteArray(size_t len, const uint8_t *val) {
    961     if (len > INT32_MAX) {
    962         // don't accept size_t values which may have come from an
    963         // inadvertent conversion from a negative int.
    964         return BAD_VALUE;
    965     }
    966 
    967     if (!val) {
    968         return writeInt32(-1);
    969     }
    970     status_t ret = writeInt32(static_cast<uint32_t>(len));
    971     if (ret == NO_ERROR) {
    972         ret = write(val, len * sizeof(*val));
    973     }
    974     return ret;
    975 }
    976 
    977 status_t Parcel::writeBool(bool val)
    978 {
    979     return writeInt32(int32_t(val));
    980 }
    981 
    982 status_t Parcel::writeChar(char16_t val)
    983 {
    984     return writeInt32(int32_t(val));
    985 }
    986 
    987 status_t Parcel::writeByte(int8_t val)
    988 {
    989     return writeInt32(int32_t(val));
    990 }
    991 
    992 status_t Parcel::writeInt64(int64_t val)
    993 {
    994     return writeAligned(val);
    995 }
    996 
    997 status_t Parcel::writeUint64(uint64_t val)
    998 {
    999     return writeAligned(val);
   1000 }
   1001 
   1002 status_t Parcel::writePointer(uintptr_t val)
   1003 {
   1004     return writeAligned<binder_uintptr_t>(val);
   1005 }
   1006 
   1007 status_t Parcel::writeFloat(float val)
   1008 {
   1009     return writeAligned(val);
   1010 }
   1011 
   1012 #if defined(__mips__) && defined(__mips_hard_float)
   1013 
   1014 status_t Parcel::writeDouble(double val)
   1015 {
   1016     union {
   1017         double d;
   1018         unsigned long long ll;
   1019     } u;
   1020     u.d = val;
   1021     return writeAligned(u.ll);
   1022 }
   1023 
   1024 #else
   1025 
   1026 status_t Parcel::writeDouble(double val)
   1027 {
   1028     return writeAligned(val);
   1029 }
   1030 
   1031 #endif
   1032 
   1033 status_t Parcel::writeCString(const char* str)
   1034 {
   1035     return write(str, strlen(str)+1);
   1036 }
   1037 
   1038 status_t Parcel::writeString8(const String8& str)
   1039 {
   1040     status_t err = writeInt32(str.bytes());
   1041     // only write string if its length is more than zero characters,
   1042     // as readString8 will only read if the length field is non-zero.
   1043     // this is slightly different from how writeString16 works.
   1044     if (str.bytes() > 0 && err == NO_ERROR) {
   1045         err = write(str.string(), str.bytes()+1);
   1046     }
   1047     return err;
   1048 }
   1049 
   1050 status_t Parcel::writeString16(const std::unique_ptr<String16>& str)
   1051 {
   1052     if (!str) {
   1053         return writeInt32(-1);
   1054     }
   1055 
   1056     return writeString16(*str);
   1057 }
   1058 
   1059 status_t Parcel::writeString16(const String16& str)
   1060 {
   1061     return writeString16(str.string(), str.size());
   1062 }
   1063 
   1064 status_t Parcel::writeString16(const char16_t* str, size_t len)
   1065 {
   1066     if (str == NULL) return writeInt32(-1);
   1067 
   1068     status_t err = writeInt32(len);
   1069     if (err == NO_ERROR) {
   1070         len *= sizeof(char16_t);
   1071         uint8_t* data = (uint8_t*)writeInplace(len+sizeof(char16_t));
   1072         if (data) {
   1073             memcpy(data, str, len);
   1074             *reinterpret_cast<char16_t*>(data+len) = 0;
   1075             return NO_ERROR;
   1076         }
   1077         err = mError;
   1078     }
   1079     return err;
   1080 }
   1081 
   1082 status_t Parcel::writeStrongBinder(const sp<IBinder>& val)
   1083 {
   1084     return flatten_binder(ProcessState::self(), val, this);
   1085 }
   1086 
   1087 status_t Parcel::writeStrongBinderVector(const std::vector<sp<IBinder>>& val)
   1088 {
   1089     return writeTypedVector(val, &Parcel::writeStrongBinder);
   1090 }
   1091 
   1092 status_t Parcel::writeStrongBinderVector(const std::unique_ptr<std::vector<sp<IBinder>>>& val)
   1093 {
   1094     return writeNullableTypedVector(val, &Parcel::writeStrongBinder);
   1095 }
   1096 
   1097 status_t Parcel::readStrongBinderVector(std::unique_ptr<std::vector<sp<IBinder>>>* val) const {
   1098     return readNullableTypedVector(val, &Parcel::readNullableStrongBinder);
   1099 }
   1100 
   1101 status_t Parcel::readStrongBinderVector(std::vector<sp<IBinder>>* val) const {
   1102     return readTypedVector(val, &Parcel::readStrongBinder);
   1103 }
   1104 
   1105 status_t Parcel::writeWeakBinder(const wp<IBinder>& val)
   1106 {
   1107     return flatten_binder(ProcessState::self(), val, this);
   1108 }
   1109 
   1110 status_t Parcel::writeRawNullableParcelable(const Parcelable* parcelable) {
   1111     if (!parcelable) {
   1112         return writeInt32(0);
   1113     }
   1114 
   1115     return writeParcelable(*parcelable);
   1116 }
   1117 
   1118 status_t Parcel::writeParcelable(const Parcelable& parcelable) {
   1119     status_t status = writeInt32(1);  // parcelable is not null.
   1120     if (status != OK) {
   1121         return status;
   1122     }
   1123     return parcelable.writeToParcel(this);
   1124 }
   1125 
   1126 status_t Parcel::writeValue(const binder::Value& value) {
   1127     return value.writeToParcel(this);
   1128 }
   1129 
   1130 status_t Parcel::writeNativeHandle(const native_handle* handle)
   1131 {
   1132     if (!handle || handle->version != sizeof(native_handle))
   1133         return BAD_TYPE;
   1134 
   1135     status_t err;
   1136     err = writeInt32(handle->numFds);
   1137     if (err != NO_ERROR) return err;
   1138 
   1139     err = writeInt32(handle->numInts);
   1140     if (err != NO_ERROR) return err;
   1141 
   1142     for (int i=0 ; err==NO_ERROR && i<handle->numFds ; i++)
   1143         err = writeDupFileDescriptor(handle->data[i]);
   1144 
   1145     if (err != NO_ERROR) {
   1146         ALOGD("write native handle, write dup fd failed");
   1147         return err;
   1148     }
   1149     err = write(handle->data + handle->numFds, sizeof(int)*handle->numInts);
   1150     return err;
   1151 }
   1152 
   1153 status_t Parcel::writeFileDescriptor(int fd, bool takeOwnership)
   1154 {
   1155     flat_binder_object obj;
   1156     obj.hdr.type = BINDER_TYPE_FD;
   1157     obj.flags = 0x7f | FLAT_BINDER_FLAG_ACCEPTS_FDS;
   1158     obj.binder = 0; /* Don't pass uninitialized stack data to a remote process */
   1159     obj.handle = fd;
   1160     obj.cookie = takeOwnership ? 1 : 0;
   1161     return writeObject(obj, true);
   1162 }
   1163 
   1164 status_t Parcel::writeDupFileDescriptor(int fd)
   1165 {
   1166     int dupFd = fcntl(fd, F_DUPFD_CLOEXEC, 0);
   1167     if (dupFd < 0) {
   1168         return -errno;
   1169     }
   1170     status_t err = writeFileDescriptor(dupFd, true /*takeOwnership*/);
   1171     if (err != OK) {
   1172         close(dupFd);
   1173     }
   1174     return err;
   1175 }
   1176 
   1177 status_t Parcel::writeParcelFileDescriptor(int fd, bool takeOwnership)
   1178 {
   1179     writeInt32(0);
   1180     return writeFileDescriptor(fd, takeOwnership);
   1181 }
   1182 
   1183 status_t Parcel::writeUniqueFileDescriptor(const base::unique_fd& fd) {
   1184     return writeDupFileDescriptor(fd.get());
   1185 }
   1186 
   1187 status_t Parcel::writeUniqueFileDescriptorVector(const std::vector<base::unique_fd>& val) {
   1188     return writeTypedVector(val, &Parcel::writeUniqueFileDescriptor);
   1189 }
   1190 
   1191 status_t Parcel::writeUniqueFileDescriptorVector(const std::unique_ptr<std::vector<base::unique_fd>>& val) {
   1192     return writeNullableTypedVector(val, &Parcel::writeUniqueFileDescriptor);
   1193 }
   1194 
   1195 status_t Parcel::writeBlob(size_t len, bool mutableCopy, WritableBlob* outBlob)
   1196 {
   1197     if (len > INT32_MAX) {
   1198         // don't accept size_t values which may have come from an
   1199         // inadvertent conversion from a negative int.
   1200         return BAD_VALUE;
   1201     }
   1202 
   1203     status_t status;
   1204     if (!mAllowFds || len <= BLOB_INPLACE_LIMIT) {
   1205         ALOGV("writeBlob: write in place");
   1206         status = writeInt32(BLOB_INPLACE);
   1207         if (status) return status;
   1208 
   1209         void* ptr = writeInplace(len);
   1210         if (!ptr) return NO_MEMORY;
   1211 
   1212         outBlob->init(-1, ptr, len, false);
   1213         return NO_ERROR;
   1214     }
   1215 
   1216     ALOGV("writeBlob: write to ashmem");
   1217     int fd = ashmem_create_region("Parcel Blob", len);
   1218     if (fd < 0) return NO_MEMORY;
   1219 
   1220     int result = ashmem_set_prot_region(fd, PROT_READ | PROT_WRITE);
   1221     if (result < 0) {
   1222         status = result;
   1223     } else {
   1224         void* ptr = ::mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
   1225         if (ptr == MAP_FAILED) {
   1226             status = -errno;
   1227         } else {
   1228             if (!mutableCopy) {
   1229                 result = ashmem_set_prot_region(fd, PROT_READ);
   1230             }
   1231             if (result < 0) {
   1232                 status = result;
   1233             } else {
   1234                 status = writeInt32(mutableCopy ? BLOB_ASHMEM_MUTABLE : BLOB_ASHMEM_IMMUTABLE);
   1235                 if (!status) {
   1236                     status = writeFileDescriptor(fd, true /*takeOwnership*/);
   1237                     if (!status) {
   1238                         outBlob->init(fd, ptr, len, mutableCopy);
   1239                         return NO_ERROR;
   1240                     }
   1241                 }
   1242             }
   1243         }
   1244         ::munmap(ptr, len);
   1245     }
   1246     ::close(fd);
   1247     return status;
   1248 }
   1249 
   1250 status_t Parcel::writeDupImmutableBlobFileDescriptor(int fd)
   1251 {
   1252     // Must match up with what's done in writeBlob.
   1253     if (!mAllowFds) return FDS_NOT_ALLOWED;
   1254     status_t status = writeInt32(BLOB_ASHMEM_IMMUTABLE);
   1255     if (status) return status;
   1256     return writeDupFileDescriptor(fd);
   1257 }
   1258 
   1259 status_t Parcel::write(const FlattenableHelperInterface& val)
   1260 {
   1261     status_t err;
   1262 
   1263     // size if needed
   1264     const size_t len = val.getFlattenedSize();
   1265     const size_t fd_count = val.getFdCount();
   1266 
   1267     if ((len > INT32_MAX) || (fd_count >= gMaxFds)) {
   1268         // don't accept size_t values which may have come from an
   1269         // inadvertent conversion from a negative int.
   1270         return BAD_VALUE;
   1271     }
   1272 
   1273     err = this->writeInt32(len);
   1274     if (err) return err;
   1275 
   1276     err = this->writeInt32(fd_count);
   1277     if (err) return err;
   1278 
   1279     // payload
   1280     void* const buf = this->writeInplace(len);
   1281     if (buf == NULL)
   1282         return BAD_VALUE;
   1283 
   1284     int* fds = NULL;
   1285     if (fd_count) {
   1286         fds = new (std::nothrow) int[fd_count];
   1287         if (fds == nullptr) {
   1288             ALOGE("write: failed to allocate requested %zu fds", fd_count);
   1289             return BAD_VALUE;
   1290         }
   1291     }
   1292 
   1293     err = val.flatten(buf, len, fds, fd_count);
   1294     for (size_t i=0 ; i<fd_count && err==NO_ERROR ; i++) {
   1295         err = this->writeDupFileDescriptor( fds[i] );
   1296     }
   1297 
   1298     if (fd_count) {
   1299         delete [] fds;
   1300     }
   1301 
   1302     return err;
   1303 }
   1304 
   1305 status_t Parcel::writeObject(const flat_binder_object& val, bool nullMetaData)
   1306 {
   1307     const bool enoughData = (mDataPos+sizeof(val)) <= mDataCapacity;
   1308     const bool enoughObjects = mObjectsSize < mObjectsCapacity;
   1309     if (enoughData && enoughObjects) {
   1310 restart_write:
   1311         *reinterpret_cast<flat_binder_object*>(mData+mDataPos) = val;
   1312 
   1313         // remember if it's a file descriptor
   1314         if (val.hdr.type == BINDER_TYPE_FD) {
   1315             if (!mAllowFds) {
   1316                 // fail before modifying our object index
   1317                 return FDS_NOT_ALLOWED;
   1318             }
   1319             mHasFds = mFdsKnown = true;
   1320         }
   1321 
   1322         // Need to write meta-data?
   1323         if (nullMetaData || val.binder != 0) {
   1324             mObjects[mObjectsSize] = mDataPos;
   1325             acquire_object(ProcessState::self(), val, this, &mOpenAshmemSize);
   1326             mObjectsSize++;
   1327         }
   1328 
   1329         return finishWrite(sizeof(flat_binder_object));
   1330     }
   1331 
   1332     if (!enoughData) {
   1333         const status_t err = growData(sizeof(val));
   1334         if (err != NO_ERROR) return err;
   1335     }
   1336     if (!enoughObjects) {
   1337         size_t newSize = ((mObjectsSize+2)*3)/2;
   1338         if (newSize*sizeof(binder_size_t) < mObjectsSize) return NO_MEMORY;   // overflow
   1339         binder_size_t* objects = (binder_size_t*)realloc(mObjects, newSize*sizeof(binder_size_t));
   1340         if (objects == NULL) return NO_MEMORY;
   1341         mObjects = objects;
   1342         mObjectsCapacity = newSize;
   1343     }
   1344 
   1345     goto restart_write;
   1346 }
   1347 
   1348 status_t Parcel::writeNoException()
   1349 {
   1350     binder::Status status;
   1351     return status.writeToParcel(this);
   1352 }
   1353 
   1354 status_t Parcel::writeMap(const ::android::binder::Map& map_in)
   1355 {
   1356     using ::std::map;
   1357     using ::android::binder::Value;
   1358     using ::android::binder::Map;
   1359 
   1360     Map::const_iterator iter;
   1361     status_t ret;
   1362 
   1363     ret = writeInt32(map_in.size());
   1364 
   1365     if (ret != NO_ERROR) {
   1366         return ret;
   1367     }
   1368 
   1369     for (iter = map_in.begin(); iter != map_in.end(); ++iter) {
   1370         ret = writeValue(Value(iter->first));
   1371         if (ret != NO_ERROR) {
   1372             return ret;
   1373         }
   1374 
   1375         ret = writeValue(iter->second);
   1376         if (ret != NO_ERROR) {
   1377             return ret;
   1378         }
   1379     }
   1380 
   1381     return ret;
   1382 }
   1383 
   1384 status_t Parcel::writeNullableMap(const std::unique_ptr<binder::Map>& map)
   1385 {
   1386     if (map == NULL) {
   1387         return writeInt32(-1);
   1388     }
   1389 
   1390     return writeMap(*map.get());
   1391 }
   1392 
   1393 status_t Parcel::readMap(::android::binder::Map* map_out)const
   1394 {
   1395     using ::std::map;
   1396     using ::android::String16;
   1397     using ::android::String8;
   1398     using ::android::binder::Value;
   1399     using ::android::binder::Map;
   1400 
   1401     status_t ret = NO_ERROR;
   1402     int32_t count;
   1403 
   1404     ret = readInt32(&count);
   1405     if (ret != NO_ERROR) {
   1406         return ret;
   1407     }
   1408 
   1409     if (count < 0) {
   1410         ALOGE("readMap: Unexpected count: %d", count);
   1411         return (count == -1)
   1412             ? UNEXPECTED_NULL
   1413             : BAD_VALUE;
   1414     }
   1415 
   1416     map_out->clear();
   1417 
   1418     while (count--) {
   1419         Map::key_type key;
   1420         Value value;
   1421 
   1422         ret = readValue(&value);
   1423         if (ret != NO_ERROR) {
   1424             return ret;
   1425         }
   1426 
   1427         if (!value.getString(&key)) {
   1428             ALOGE("readMap: Key type not a string (parcelType = %d)", value.parcelType());
   1429             return BAD_VALUE;
   1430         }
   1431 
   1432         ret = readValue(&value);
   1433         if (ret != NO_ERROR) {
   1434             return ret;
   1435         }
   1436 
   1437         (*map_out)[key] = value;
   1438     }
   1439 
   1440     return ret;
   1441 }
   1442 
   1443 status_t Parcel::readNullableMap(std::unique_ptr<binder::Map>* map) const
   1444 {
   1445     const size_t start = dataPosition();
   1446     int32_t count;
   1447     status_t status = readInt32(&count);
   1448     map->reset();
   1449 
   1450     if (status != OK || count == -1) {
   1451         return status;
   1452     }
   1453 
   1454     setDataPosition(start);
   1455     map->reset(new binder::Map());
   1456 
   1457     status = readMap(map->get());
   1458 
   1459     if (status != OK) {
   1460         map->reset();
   1461     }
   1462 
   1463     return status;
   1464 }
   1465 
   1466 
   1467 
   1468 void Parcel::remove(size_t /*start*/, size_t /*amt*/)
   1469 {
   1470     LOG_ALWAYS_FATAL("Parcel::remove() not yet implemented!");
   1471 }
   1472 
   1473 status_t Parcel::validateReadData(size_t upperBound) const
   1474 {
   1475     // Don't allow non-object reads on object data
   1476     if (mObjectsSorted || mObjectsSize <= 1) {
   1477 data_sorted:
   1478         // Expect to check only against the next object
   1479         if (mNextObjectHint < mObjectsSize && upperBound > mObjects[mNextObjectHint]) {
   1480             // For some reason the current read position is greater than the next object
   1481             // hint. Iterate until we find the right object
   1482             size_t nextObject = mNextObjectHint;
   1483             do {
   1484                 if (mDataPos < mObjects[nextObject] + sizeof(flat_binder_object)) {
   1485                     // Requested info overlaps with an object
   1486                     ALOGE("Attempt to read from protected data in Parcel %p", this);
   1487                     return PERMISSION_DENIED;
   1488                 }
   1489                 nextObject++;
   1490             } while (nextObject < mObjectsSize && upperBound > mObjects[nextObject]);
   1491             mNextObjectHint = nextObject;
   1492         }
   1493         return NO_ERROR;
   1494     }
   1495     // Quickly determine if mObjects is sorted.
   1496     binder_size_t* currObj = mObjects + mObjectsSize - 1;
   1497     binder_size_t* prevObj = currObj;
   1498     while (currObj > mObjects) {
   1499         prevObj--;
   1500         if(*prevObj > *currObj) {
   1501             goto data_unsorted;
   1502         }
   1503         currObj--;
   1504     }
   1505     mObjectsSorted = true;
   1506     goto data_sorted;
   1507 
   1508 data_unsorted:
   1509     // Insertion Sort mObjects
   1510     // Great for mostly sorted lists. If randomly sorted or reverse ordered mObjects become common,
   1511     // switch to std::sort(mObjects, mObjects + mObjectsSize);
   1512     for (binder_size_t* iter0 = mObjects + 1; iter0 < mObjects + mObjectsSize; iter0++) {
   1513         binder_size_t temp = *iter0;
   1514         binder_size_t* iter1 = iter0 - 1;
   1515         while (iter1 >= mObjects && *iter1 > temp) {
   1516             *(iter1 + 1) = *iter1;
   1517             iter1--;
   1518         }
   1519         *(iter1 + 1) = temp;
   1520     }
   1521     mNextObjectHint = 0;
   1522     mObjectsSorted = true;
   1523     goto data_sorted;
   1524 }
   1525 
   1526 status_t Parcel::read(void* outData, size_t len) const
   1527 {
   1528     if (len > INT32_MAX) {
   1529         // don't accept size_t values which may have come from an
   1530         // inadvertent conversion from a negative int.
   1531         return BAD_VALUE;
   1532     }
   1533 
   1534     if ((mDataPos+pad_size(len)) >= mDataPos && (mDataPos+pad_size(len)) <= mDataSize
   1535             && len <= pad_size(len)) {
   1536         if (mObjectsSize > 0) {
   1537             status_t err = validateReadData(mDataPos + pad_size(len));
   1538             if(err != NO_ERROR) {
   1539                 // Still increment the data position by the expected length
   1540                 mDataPos += pad_size(len);
   1541                 ALOGV("read Setting data pos of %p to %zu", this, mDataPos);
   1542                 return err;
   1543             }
   1544         }
   1545         memcpy(outData, mData+mDataPos, len);
   1546         mDataPos += pad_size(len);
   1547         ALOGV("read Setting data pos of %p to %zu", this, mDataPos);
   1548         return NO_ERROR;
   1549     }
   1550     return NOT_ENOUGH_DATA;
   1551 }
   1552 
   1553 const void* Parcel::readInplace(size_t len) const
   1554 {
   1555     if (len > INT32_MAX) {
   1556         // don't accept size_t values which may have come from an
   1557         // inadvertent conversion from a negative int.
   1558         return NULL;
   1559     }
   1560 
   1561     if ((mDataPos+pad_size(len)) >= mDataPos && (mDataPos+pad_size(len)) <= mDataSize
   1562             && len <= pad_size(len)) {
   1563         if (mObjectsSize > 0) {
   1564             status_t err = validateReadData(mDataPos + pad_size(len));
   1565             if(err != NO_ERROR) {
   1566                 // Still increment the data position by the expected length
   1567                 mDataPos += pad_size(len);
   1568                 ALOGV("readInplace Setting data pos of %p to %zu", this, mDataPos);
   1569                 return NULL;
   1570             }
   1571         }
   1572 
   1573         const void* data = mData+mDataPos;
   1574         mDataPos += pad_size(len);
   1575         ALOGV("readInplace Setting data pos of %p to %zu", this, mDataPos);
   1576         return data;
   1577     }
   1578     return NULL;
   1579 }
   1580 
   1581 template<class T>
   1582 status_t Parcel::readAligned(T *pArg) const {
   1583     COMPILE_TIME_ASSERT_FUNCTION_SCOPE(PAD_SIZE_UNSAFE(sizeof(T)) == sizeof(T));
   1584 
   1585     if ((mDataPos+sizeof(T)) <= mDataSize) {
   1586         if (mObjectsSize > 0) {
   1587             status_t err = validateReadData(mDataPos + sizeof(T));
   1588             if(err != NO_ERROR) {
   1589                 // Still increment the data position by the expected length
   1590                 mDataPos += sizeof(T);
   1591                 return err;
   1592             }
   1593         }
   1594 
   1595         const void* data = mData+mDataPos;
   1596         mDataPos += sizeof(T);
   1597         *pArg =  *reinterpret_cast<const T*>(data);
   1598         return NO_ERROR;
   1599     } else {
   1600         return NOT_ENOUGH_DATA;
   1601     }
   1602 }
   1603 
   1604 template<class T>
   1605 T Parcel::readAligned() const {
   1606     T result;
   1607     if (readAligned(&result) != NO_ERROR) {
   1608         result = 0;
   1609     }
   1610 
   1611     return result;
   1612 }
   1613 
   1614 template<class T>
   1615 status_t Parcel::writeAligned(T val) {
   1616     COMPILE_TIME_ASSERT_FUNCTION_SCOPE(PAD_SIZE_UNSAFE(sizeof(T)) == sizeof(T));
   1617 
   1618     if ((mDataPos+sizeof(val)) <= mDataCapacity) {
   1619 restart_write:
   1620         *reinterpret_cast<T*>(mData+mDataPos) = val;
   1621         return finishWrite(sizeof(val));
   1622     }
   1623 
   1624     status_t err = growData(sizeof(val));
   1625     if (err == NO_ERROR) goto restart_write;
   1626     return err;
   1627 }
   1628 
   1629 namespace {
   1630 
   1631 template<typename T>
   1632 status_t readByteVectorInternal(const Parcel* parcel,
   1633                                 std::vector<T>* val) {
   1634     val->clear();
   1635 
   1636     int32_t size;
   1637     status_t status = parcel->readInt32(&size);
   1638 
   1639     if (status != OK) {
   1640         return status;
   1641     }
   1642 
   1643     if (size < 0) {
   1644         status = UNEXPECTED_NULL;
   1645         return status;
   1646     }
   1647     if (size_t(size) > parcel->dataAvail()) {
   1648         status = BAD_VALUE;
   1649         return status;
   1650     }
   1651 
   1652     T* data = const_cast<T*>(reinterpret_cast<const T*>(parcel->readInplace(size)));
   1653     if (!data) {
   1654         status = BAD_VALUE;
   1655         return status;
   1656     }
   1657     val->reserve(size);
   1658     val->insert(val->end(), data, data + size);
   1659 
   1660     return status;
   1661 }
   1662 
   1663 template<typename T>
   1664 status_t readByteVectorInternalPtr(
   1665         const Parcel* parcel,
   1666         std::unique_ptr<std::vector<T>>* val) {
   1667     const int32_t start = parcel->dataPosition();
   1668     int32_t size;
   1669     status_t status = parcel->readInt32(&size);
   1670     val->reset();
   1671 
   1672     if (status != OK || size < 0) {
   1673         return status;
   1674     }
   1675 
   1676     parcel->setDataPosition(start);
   1677     val->reset(new (std::nothrow) std::vector<T>());
   1678 
   1679     status = readByteVectorInternal(parcel, val->get());
   1680 
   1681     if (status != OK) {
   1682         val->reset();
   1683     }
   1684 
   1685     return status;
   1686 }
   1687 
   1688 }  // namespace
   1689 
   1690 status_t Parcel::readByteVector(std::vector<int8_t>* val) const {
   1691     return readByteVectorInternal(this, val);
   1692 }
   1693 
   1694 status_t Parcel::readByteVector(std::vector<uint8_t>* val) const {
   1695     return readByteVectorInternal(this, val);
   1696 }
   1697 
   1698 status_t Parcel::readByteVector(std::unique_ptr<std::vector<int8_t>>* val) const {
   1699     return readByteVectorInternalPtr(this, val);
   1700 }
   1701 
   1702 status_t Parcel::readByteVector(std::unique_ptr<std::vector<uint8_t>>* val) const {
   1703     return readByteVectorInternalPtr(this, val);
   1704 }
   1705 
   1706 status_t Parcel::readInt32Vector(std::unique_ptr<std::vector<int32_t>>* val) const {
   1707     return readNullableTypedVector(val, &Parcel::readInt32);
   1708 }
   1709 
   1710 status_t Parcel::readInt32Vector(std::vector<int32_t>* val) const {
   1711     return readTypedVector(val, &Parcel::readInt32);
   1712 }
   1713 
   1714 status_t Parcel::readInt64Vector(std::unique_ptr<std::vector<int64_t>>* val) const {
   1715     return readNullableTypedVector(val, &Parcel::readInt64);
   1716 }
   1717 
   1718 status_t Parcel::readInt64Vector(std::vector<int64_t>* val) const {
   1719     return readTypedVector(val, &Parcel::readInt64);
   1720 }
   1721 
   1722 status_t Parcel::readFloatVector(std::unique_ptr<std::vector<float>>* val) const {
   1723     return readNullableTypedVector(val, &Parcel::readFloat);
   1724 }
   1725 
   1726 status_t Parcel::readFloatVector(std::vector<float>* val) const {
   1727     return readTypedVector(val, &Parcel::readFloat);
   1728 }
   1729 
   1730 status_t Parcel::readDoubleVector(std::unique_ptr<std::vector<double>>* val) const {
   1731     return readNullableTypedVector(val, &Parcel::readDouble);
   1732 }
   1733 
   1734 status_t Parcel::readDoubleVector(std::vector<double>* val) const {
   1735     return readTypedVector(val, &Parcel::readDouble);
   1736 }
   1737 
   1738 status_t Parcel::readBoolVector(std::unique_ptr<std::vector<bool>>* val) const {
   1739     const int32_t start = dataPosition();
   1740     int32_t size;
   1741     status_t status = readInt32(&size);
   1742     val->reset();
   1743 
   1744     if (status != OK || size < 0) {
   1745         return status;
   1746     }
   1747 
   1748     setDataPosition(start);
   1749     val->reset(new (std::nothrow) std::vector<bool>());
   1750 
   1751     status = readBoolVector(val->get());
   1752 
   1753     if (status != OK) {
   1754         val->reset();
   1755     }
   1756 
   1757     return status;
   1758 }
   1759 
   1760 status_t Parcel::readBoolVector(std::vector<bool>* val) const {
   1761     int32_t size;
   1762     status_t status = readInt32(&size);
   1763 
   1764     if (status != OK) {
   1765         return status;
   1766     }
   1767 
   1768     if (size < 0) {
   1769         return UNEXPECTED_NULL;
   1770     }
   1771 
   1772     val->resize(size);
   1773 
   1774     /* C++ bool handling means a vector of bools isn't necessarily addressable
   1775      * (we might use individual bits)
   1776      */
   1777     bool data;
   1778     for (int32_t i = 0; i < size; ++i) {
   1779         status = readBool(&data);
   1780         (*val)[i] = data;
   1781 
   1782         if (status != OK) {
   1783             return status;
   1784         }
   1785     }
   1786 
   1787     return OK;
   1788 }
   1789 
   1790 status_t Parcel::readCharVector(std::unique_ptr<std::vector<char16_t>>* val) const {
   1791     return readNullableTypedVector(val, &Parcel::readChar);
   1792 }
   1793 
   1794 status_t Parcel::readCharVector(std::vector<char16_t>* val) const {
   1795     return readTypedVector(val, &Parcel::readChar);
   1796 }
   1797 
   1798 status_t Parcel::readString16Vector(
   1799         std::unique_ptr<std::vector<std::unique_ptr<String16>>>* val) const {
   1800     return readNullableTypedVector(val, &Parcel::readString16);
   1801 }
   1802 
   1803 status_t Parcel::readString16Vector(std::vector<String16>* val) const {
   1804     return readTypedVector(val, &Parcel::readString16);
   1805 }
   1806 
   1807 status_t Parcel::readUtf8VectorFromUtf16Vector(
   1808         std::unique_ptr<std::vector<std::unique_ptr<std::string>>>* val) const {
   1809     return readNullableTypedVector(val, &Parcel::readUtf8FromUtf16);
   1810 }
   1811 
   1812 status_t Parcel::readUtf8VectorFromUtf16Vector(std::vector<std::string>* val) const {
   1813     return readTypedVector(val, &Parcel::readUtf8FromUtf16);
   1814 }
   1815 
   1816 status_t Parcel::readInt32(int32_t *pArg) const
   1817 {
   1818     return readAligned(pArg);
   1819 }
   1820 
   1821 int32_t Parcel::readInt32() const
   1822 {
   1823     return readAligned<int32_t>();
   1824 }
   1825 
   1826 status_t Parcel::readUint32(uint32_t *pArg) const
   1827 {
   1828     return readAligned(pArg);
   1829 }
   1830 
   1831 uint32_t Parcel::readUint32() const
   1832 {
   1833     return readAligned<uint32_t>();
   1834 }
   1835 
   1836 status_t Parcel::readInt64(int64_t *pArg) const
   1837 {
   1838     return readAligned(pArg);
   1839 }
   1840 
   1841 
   1842 int64_t Parcel::readInt64() const
   1843 {
   1844     return readAligned<int64_t>();
   1845 }
   1846 
   1847 status_t Parcel::readUint64(uint64_t *pArg) const
   1848 {
   1849     return readAligned(pArg);
   1850 }
   1851 
   1852 uint64_t Parcel::readUint64() const
   1853 {
   1854     return readAligned<uint64_t>();
   1855 }
   1856 
   1857 status_t Parcel::readPointer(uintptr_t *pArg) const
   1858 {
   1859     status_t ret;
   1860     binder_uintptr_t ptr;
   1861     ret = readAligned(&ptr);
   1862     if (!ret)
   1863         *pArg = ptr;
   1864     return ret;
   1865 }
   1866 
   1867 uintptr_t Parcel::readPointer() const
   1868 {
   1869     return readAligned<binder_uintptr_t>();
   1870 }
   1871 
   1872 
   1873 status_t Parcel::readFloat(float *pArg) const
   1874 {
   1875     return readAligned(pArg);
   1876 }
   1877 
   1878 
   1879 float Parcel::readFloat() const
   1880 {
   1881     return readAligned<float>();
   1882 }
   1883 
   1884 #if defined(__mips__) && defined(__mips_hard_float)
   1885 
   1886 status_t Parcel::readDouble(double *pArg) const
   1887 {
   1888     union {
   1889       double d;
   1890       unsigned long long ll;
   1891     } u;
   1892     u.d = 0;
   1893     status_t status;
   1894     status = readAligned(&u.ll);
   1895     *pArg = u.d;
   1896     return status;
   1897 }
   1898 
   1899 double Parcel::readDouble() const
   1900 {
   1901     union {
   1902       double d;
   1903       unsigned long long ll;
   1904     } u;
   1905     u.ll = readAligned<unsigned long long>();
   1906     return u.d;
   1907 }
   1908 
   1909 #else
   1910 
   1911 status_t Parcel::readDouble(double *pArg) const
   1912 {
   1913     return readAligned(pArg);
   1914 }
   1915 
   1916 double Parcel::readDouble() const
   1917 {
   1918     return readAligned<double>();
   1919 }
   1920 
   1921 #endif
   1922 
   1923 status_t Parcel::readIntPtr(intptr_t *pArg) const
   1924 {
   1925     return readAligned(pArg);
   1926 }
   1927 
   1928 
   1929 intptr_t Parcel::readIntPtr() const
   1930 {
   1931     return readAligned<intptr_t>();
   1932 }
   1933 
   1934 status_t Parcel::readBool(bool *pArg) const
   1935 {
   1936     int32_t tmp = 0;
   1937     status_t ret = readInt32(&tmp);
   1938     *pArg = (tmp != 0);
   1939     return ret;
   1940 }
   1941 
   1942 bool Parcel::readBool() const
   1943 {
   1944     return readInt32() != 0;
   1945 }
   1946 
   1947 status_t Parcel::readChar(char16_t *pArg) const
   1948 {
   1949     int32_t tmp = 0;
   1950     status_t ret = readInt32(&tmp);
   1951     *pArg = char16_t(tmp);
   1952     return ret;
   1953 }
   1954 
   1955 char16_t Parcel::readChar() const
   1956 {
   1957     return char16_t(readInt32());
   1958 }
   1959 
   1960 status_t Parcel::readByte(int8_t *pArg) const
   1961 {
   1962     int32_t tmp = 0;
   1963     status_t ret = readInt32(&tmp);
   1964     *pArg = int8_t(tmp);
   1965     return ret;
   1966 }
   1967 
   1968 int8_t Parcel::readByte() const
   1969 {
   1970     return int8_t(readInt32());
   1971 }
   1972 
   1973 status_t Parcel::readUtf8FromUtf16(std::string* str) const {
   1974     size_t utf16Size = 0;
   1975     const char16_t* src = readString16Inplace(&utf16Size);
   1976     if (!src) {
   1977         return UNEXPECTED_NULL;
   1978     }
   1979 
   1980     // Save ourselves the trouble, we're done.
   1981     if (utf16Size == 0u) {
   1982         str->clear();
   1983        return NO_ERROR;
   1984     }
   1985 
   1986     // Allow for closing '\0'
   1987     ssize_t utf8Size = utf16_to_utf8_length(src, utf16Size) + 1;
   1988     if (utf8Size < 1) {
   1989         return BAD_VALUE;
   1990     }
   1991     // Note that while it is probably safe to assume string::resize keeps a
   1992     // spare byte around for the trailing null, we still pass the size including the trailing null
   1993     str->resize(utf8Size);
   1994     utf16_to_utf8(src, utf16Size, &((*str)[0]), utf8Size);
   1995     str->resize(utf8Size - 1);
   1996     return NO_ERROR;
   1997 }
   1998 
   1999 status_t Parcel::readUtf8FromUtf16(std::unique_ptr<std::string>* str) const {
   2000     const int32_t start = dataPosition();
   2001     int32_t size;
   2002     status_t status = readInt32(&size);
   2003     str->reset();
   2004 
   2005     if (status != OK || size < 0) {
   2006         return status;
   2007     }
   2008 
   2009     setDataPosition(start);
   2010     str->reset(new (std::nothrow) std::string());
   2011     return readUtf8FromUtf16(str->get());
   2012 }
   2013 
   2014 const char* Parcel::readCString() const
   2015 {
   2016     const size_t avail = mDataSize-mDataPos;
   2017     if (avail > 0) {
   2018         const char* str = reinterpret_cast<const char*>(mData+mDataPos);
   2019         // is the string's trailing NUL within the parcel's valid bounds?
   2020         const char* eos = reinterpret_cast<const char*>(memchr(str, 0, avail));
   2021         if (eos) {
   2022             const size_t len = eos - str;
   2023             mDataPos += pad_size(len+1);
   2024             ALOGV("readCString Setting data pos of %p to %zu", this, mDataPos);
   2025             return str;
   2026         }
   2027     }
   2028     return NULL;
   2029 }
   2030 
   2031 String8 Parcel::readString8() const
   2032 {
   2033     String8 retString;
   2034     status_t status = readString8(&retString);
   2035     if (status != OK) {
   2036         // We don't care about errors here, so just return an empty string.
   2037         return String8();
   2038     }
   2039     return retString;
   2040 }
   2041 
   2042 status_t Parcel::readString8(String8* pArg) const
   2043 {
   2044     int32_t size;
   2045     status_t status = readInt32(&size);
   2046     if (status != OK) {
   2047         return status;
   2048     }
   2049     // watch for potential int overflow from size+1
   2050     if (size < 0 || size >= INT32_MAX) {
   2051         return BAD_VALUE;
   2052     }
   2053     // |writeString8| writes nothing for empty string.
   2054     if (size == 0) {
   2055         *pArg = String8();
   2056         return OK;
   2057     }
   2058     const char* str = (const char*)readInplace(size + 1);
   2059     if (str == NULL) {
   2060         return BAD_VALUE;
   2061     }
   2062     pArg->setTo(str, size);
   2063     return OK;
   2064 }
   2065 
   2066 String16 Parcel::readString16() const
   2067 {
   2068     size_t len;
   2069     const char16_t* str = readString16Inplace(&len);
   2070     if (str) return String16(str, len);
   2071     ALOGE("Reading a NULL string not supported here.");
   2072     return String16();
   2073 }
   2074 
   2075 status_t Parcel::readString16(std::unique_ptr<String16>* pArg) const
   2076 {
   2077     const int32_t start = dataPosition();
   2078     int32_t size;
   2079     status_t status = readInt32(&size);
   2080     pArg->reset();
   2081 
   2082     if (status != OK || size < 0) {
   2083         return status;
   2084     }
   2085 
   2086     setDataPosition(start);
   2087     pArg->reset(new (std::nothrow) String16());
   2088 
   2089     status = readString16(pArg->get());
   2090 
   2091     if (status != OK) {
   2092         pArg->reset();
   2093     }
   2094 
   2095     return status;
   2096 }
   2097 
   2098 status_t Parcel::readString16(String16* pArg) const
   2099 {
   2100     size_t len;
   2101     const char16_t* str = readString16Inplace(&len);
   2102     if (str) {
   2103         pArg->setTo(str, len);
   2104         return 0;
   2105     } else {
   2106         *pArg = String16();
   2107         return UNEXPECTED_NULL;
   2108     }
   2109 }
   2110 
   2111 const char16_t* Parcel::readString16Inplace(size_t* outLen) const
   2112 {
   2113     int32_t size = readInt32();
   2114     // watch for potential int overflow from size+1
   2115     if (size >= 0 && size < INT32_MAX) {
   2116         *outLen = size;
   2117         const char16_t* str = (const char16_t*)readInplace((size+1)*sizeof(char16_t));
   2118         if (str != NULL) {
   2119             return str;
   2120         }
   2121     }
   2122     *outLen = 0;
   2123     return NULL;
   2124 }
   2125 
   2126 status_t Parcel::readStrongBinder(sp<IBinder>* val) const
   2127 {
   2128     status_t status = readNullableStrongBinder(val);
   2129     if (status == OK && !val->get()) {
   2130         status = UNEXPECTED_NULL;
   2131     }
   2132     return status;
   2133 }
   2134 
   2135 status_t Parcel::readNullableStrongBinder(sp<IBinder>* val) const
   2136 {
   2137     return unflatten_binder(ProcessState::self(), *this, val);
   2138 }
   2139 
   2140 sp<IBinder> Parcel::readStrongBinder() const
   2141 {
   2142     sp<IBinder> val;
   2143     // Note that a lot of code in Android reads binders by hand with this
   2144     // method, and that code has historically been ok with getting nullptr
   2145     // back (while ignoring error codes).
   2146     readNullableStrongBinder(&val);
   2147     return val;
   2148 }
   2149 
   2150 wp<IBinder> Parcel::readWeakBinder() const
   2151 {
   2152     wp<IBinder> val;
   2153     unflatten_binder(ProcessState::self(), *this, &val);
   2154     return val;
   2155 }
   2156 
   2157 status_t Parcel::readParcelable(Parcelable* parcelable) const {
   2158     int32_t have_parcelable = 0;
   2159     status_t status = readInt32(&have_parcelable);
   2160     if (status != OK) {
   2161         return status;
   2162     }
   2163     if (!have_parcelable) {
   2164         return UNEXPECTED_NULL;
   2165     }
   2166     return parcelable->readFromParcel(this);
   2167 }
   2168 
   2169 status_t Parcel::readValue(binder::Value* value) const {
   2170     return value->readFromParcel(this);
   2171 }
   2172 
   2173 int32_t Parcel::readExceptionCode() const
   2174 {
   2175     binder::Status status;
   2176     status.readFromParcel(*this);
   2177     return status.exceptionCode();
   2178 }
   2179 
   2180 native_handle* Parcel::readNativeHandle() const
   2181 {
   2182     int numFds, numInts;
   2183     status_t err;
   2184     err = readInt32(&numFds);
   2185     if (err != NO_ERROR) return 0;
   2186     err = readInt32(&numInts);
   2187     if (err != NO_ERROR) return 0;
   2188 
   2189     native_handle* h = native_handle_create(numFds, numInts);
   2190     if (!h) {
   2191         return 0;
   2192     }
   2193 
   2194     for (int i=0 ; err==NO_ERROR && i<numFds ; i++) {
   2195         h->data[i] = fcntl(readFileDescriptor(), F_DUPFD_CLOEXEC, 0);
   2196         if (h->data[i] < 0) {
   2197             for (int j = 0; j < i; j++) {
   2198                 close(h->data[j]);
   2199             }
   2200             native_handle_delete(h);
   2201             return 0;
   2202         }
   2203     }
   2204     err = read(h->data + numFds, sizeof(int)*numInts);
   2205     if (err != NO_ERROR) {
   2206         native_handle_close(h);
   2207         native_handle_delete(h);
   2208         h = 0;
   2209     }
   2210     return h;
   2211 }
   2212 
   2213 int Parcel::readFileDescriptor() const
   2214 {
   2215     const flat_binder_object* flat = readObject(true);
   2216 
   2217     if (flat && flat->hdr.type == BINDER_TYPE_FD) {
   2218         return flat->handle;
   2219     }
   2220 
   2221     return BAD_TYPE;
   2222 }
   2223 
   2224 int Parcel::readParcelFileDescriptor() const
   2225 {
   2226     int32_t hasComm = readInt32();
   2227     int fd = readFileDescriptor();
   2228     if (hasComm != 0) {
   2229         // skip
   2230         readFileDescriptor();
   2231     }
   2232     return fd;
   2233 }
   2234 
   2235 status_t Parcel::readUniqueFileDescriptor(base::unique_fd* val) const
   2236 {
   2237     int got = readFileDescriptor();
   2238 
   2239     if (got == BAD_TYPE) {
   2240         return BAD_TYPE;
   2241     }
   2242 
   2243     val->reset(fcntl(got, F_DUPFD_CLOEXEC, 0));
   2244 
   2245     if (val->get() < 0) {
   2246         return BAD_VALUE;
   2247     }
   2248 
   2249     return OK;
   2250 }
   2251 
   2252 
   2253 status_t Parcel::readUniqueFileDescriptorVector(std::unique_ptr<std::vector<base::unique_fd>>* val) const {
   2254     return readNullableTypedVector(val, &Parcel::readUniqueFileDescriptor);
   2255 }
   2256 
   2257 status_t Parcel::readUniqueFileDescriptorVector(std::vector<base::unique_fd>* val) const {
   2258     return readTypedVector(val, &Parcel::readUniqueFileDescriptor);
   2259 }
   2260 
   2261 status_t Parcel::readBlob(size_t len, ReadableBlob* outBlob) const
   2262 {
   2263     int32_t blobType;
   2264     status_t status = readInt32(&blobType);
   2265     if (status) return status;
   2266 
   2267     if (blobType == BLOB_INPLACE) {
   2268         ALOGV("readBlob: read in place");
   2269         const void* ptr = readInplace(len);
   2270         if (!ptr) return BAD_VALUE;
   2271 
   2272         outBlob->init(-1, const_cast<void*>(ptr), len, false);
   2273         return NO_ERROR;
   2274     }
   2275 
   2276     ALOGV("readBlob: read from ashmem");
   2277     bool isMutable = (blobType == BLOB_ASHMEM_MUTABLE);
   2278     int fd = readFileDescriptor();
   2279     if (fd == int(BAD_TYPE)) return BAD_VALUE;
   2280 
   2281     void* ptr = ::mmap(NULL, len, isMutable ? PROT_READ | PROT_WRITE : PROT_READ,
   2282             MAP_SHARED, fd, 0);
   2283     if (ptr == MAP_FAILED) return NO_MEMORY;
   2284 
   2285     outBlob->init(fd, ptr, len, isMutable);
   2286     return NO_ERROR;
   2287 }
   2288 
   2289 status_t Parcel::read(FlattenableHelperInterface& val) const
   2290 {
   2291     // size
   2292     const size_t len = this->readInt32();
   2293     const size_t fd_count = this->readInt32();
   2294 
   2295     if ((len > INT32_MAX) || (fd_count >= gMaxFds)) {
   2296         // don't accept size_t values which may have come from an
   2297         // inadvertent conversion from a negative int.
   2298         return BAD_VALUE;
   2299     }
   2300 
   2301     // payload
   2302     void const* const buf = this->readInplace(pad_size(len));
   2303     if (buf == NULL)
   2304         return BAD_VALUE;
   2305 
   2306     int* fds = NULL;
   2307     if (fd_count) {
   2308         fds = new (std::nothrow) int[fd_count];
   2309         if (fds == nullptr) {
   2310             ALOGE("read: failed to allocate requested %zu fds", fd_count);
   2311             return BAD_VALUE;
   2312         }
   2313     }
   2314 
   2315     status_t err = NO_ERROR;
   2316     for (size_t i=0 ; i<fd_count && err==NO_ERROR ; i++) {
   2317         int fd = this->readFileDescriptor();
   2318         if (fd < 0 || ((fds[i] = fcntl(fd, F_DUPFD_CLOEXEC, 0)) < 0)) {
   2319             err = BAD_VALUE;
   2320             ALOGE("fcntl(F_DUPFD_CLOEXEC) failed in Parcel::read, i is %zu, fds[i] is %d, fd_count is %zu, error: %s",
   2321                   i, fds[i], fd_count, strerror(fd < 0 ? -fd : errno));
   2322             // Close all the file descriptors that were dup-ed.
   2323             for (size_t j=0; j<i ;j++) {
   2324                 close(fds[j]);
   2325             }
   2326         }
   2327     }
   2328 
   2329     if (err == NO_ERROR) {
   2330         err = val.unflatten(buf, len, fds, fd_count);
   2331     }
   2332 
   2333     if (fd_count) {
   2334         delete [] fds;
   2335     }
   2336 
   2337     return err;
   2338 }
   2339 const flat_binder_object* Parcel::readObject(bool nullMetaData) const
   2340 {
   2341     const size_t DPOS = mDataPos;
   2342     if ((DPOS+sizeof(flat_binder_object)) <= mDataSize) {
   2343         const flat_binder_object* obj
   2344                 = reinterpret_cast<const flat_binder_object*>(mData+DPOS);
   2345         mDataPos = DPOS + sizeof(flat_binder_object);
   2346         if (!nullMetaData && (obj->cookie == 0 && obj->binder == 0)) {
   2347             // When transferring a NULL object, we don't write it into
   2348             // the object list, so we don't want to check for it when
   2349             // reading.
   2350             ALOGV("readObject Setting data pos of %p to %zu", this, mDataPos);
   2351             return obj;
   2352         }
   2353 
   2354         // Ensure that this object is valid...
   2355         binder_size_t* const OBJS = mObjects;
   2356         const size_t N = mObjectsSize;
   2357         size_t opos = mNextObjectHint;
   2358 
   2359         if (N > 0) {
   2360             ALOGV("Parcel %p looking for obj at %zu, hint=%zu",
   2361                  this, DPOS, opos);
   2362 
   2363             // Start at the current hint position, looking for an object at
   2364             // the current data position.
   2365             if (opos < N) {
   2366                 while (opos < (N-1) && OBJS[opos] < DPOS) {
   2367                     opos++;
   2368                 }
   2369             } else {
   2370                 opos = N-1;
   2371             }
   2372             if (OBJS[opos] == DPOS) {
   2373                 // Found it!
   2374                 ALOGV("Parcel %p found obj %zu at index %zu with forward search",
   2375                      this, DPOS, opos);
   2376                 mNextObjectHint = opos+1;
   2377                 ALOGV("readObject Setting data pos of %p to %zu", this, mDataPos);
   2378                 return obj;
   2379             }
   2380 
   2381             // Look backwards for it...
   2382             while (opos > 0 && OBJS[opos] > DPOS) {
   2383                 opos--;
   2384             }
   2385             if (OBJS[opos] == DPOS) {
   2386                 // Found it!
   2387                 ALOGV("Parcel %p found obj %zu at index %zu with backward search",
   2388                      this, DPOS, opos);
   2389                 mNextObjectHint = opos+1;
   2390                 ALOGV("readObject Setting data pos of %p to %zu", this, mDataPos);
   2391                 return obj;
   2392             }
   2393         }
   2394         ALOGW("Attempt to read object from Parcel %p at offset %zu that is not in the object list",
   2395              this, DPOS);
   2396     }
   2397     return NULL;
   2398 }
   2399 
   2400 void Parcel::closeFileDescriptors()
   2401 {
   2402     size_t i = mObjectsSize;
   2403     if (i > 0) {
   2404         //ALOGI("Closing file descriptors for %zu objects...", i);
   2405     }
   2406     while (i > 0) {
   2407         i--;
   2408         const flat_binder_object* flat
   2409             = reinterpret_cast<flat_binder_object*>(mData+mObjects[i]);
   2410         if (flat->hdr.type == BINDER_TYPE_FD) {
   2411             //ALOGI("Closing fd: %ld", flat->handle);
   2412             close(flat->handle);
   2413         }
   2414     }
   2415 }
   2416 
   2417 uintptr_t Parcel::ipcData() const
   2418 {
   2419     return reinterpret_cast<uintptr_t>(mData);
   2420 }
   2421 
   2422 size_t Parcel::ipcDataSize() const
   2423 {
   2424     return (mDataSize > mDataPos ? mDataSize : mDataPos);
   2425 }
   2426 
   2427 uintptr_t Parcel::ipcObjects() const
   2428 {
   2429     return reinterpret_cast<uintptr_t>(mObjects);
   2430 }
   2431 
   2432 size_t Parcel::ipcObjectsCount() const
   2433 {
   2434     return mObjectsSize;
   2435 }
   2436 
   2437 void Parcel::ipcSetDataReference(const uint8_t* data, size_t dataSize,
   2438     const binder_size_t* objects, size_t objectsCount, release_func relFunc, void* relCookie)
   2439 {
   2440     binder_size_t minOffset = 0;
   2441     freeDataNoInit();
   2442     mError = NO_ERROR;
   2443     mData = const_cast<uint8_t*>(data);
   2444     mDataSize = mDataCapacity = dataSize;
   2445     //ALOGI("setDataReference Setting data size of %p to %lu (pid=%d)", this, mDataSize, getpid());
   2446     mDataPos = 0;
   2447     ALOGV("setDataReference Setting data pos of %p to %zu", this, mDataPos);
   2448     mObjects = const_cast<binder_size_t*>(objects);
   2449     mObjectsSize = mObjectsCapacity = objectsCount;
   2450     mNextObjectHint = 0;
   2451     mObjectsSorted = false;
   2452     mOwner = relFunc;
   2453     mOwnerCookie = relCookie;
   2454     for (size_t i = 0; i < mObjectsSize; i++) {
   2455         binder_size_t offset = mObjects[i];
   2456         if (offset < minOffset) {
   2457             ALOGE("%s: bad object offset %" PRIu64 " < %" PRIu64 "\n",
   2458                   __func__, (uint64_t)offset, (uint64_t)minOffset);
   2459             mObjectsSize = 0;
   2460             break;
   2461         }
   2462         minOffset = offset + sizeof(flat_binder_object);
   2463     }
   2464     scanForFds();
   2465 }
   2466 
   2467 void Parcel::print(TextOutput& to, uint32_t /*flags*/) const
   2468 {
   2469     to << "Parcel(";
   2470 
   2471     if (errorCheck() != NO_ERROR) {
   2472         const status_t err = errorCheck();
   2473         to << "Error: " << (void*)(intptr_t)err << " \"" << strerror(-err) << "\"";
   2474     } else if (dataSize() > 0) {
   2475         const uint8_t* DATA = data();
   2476         to << indent << HexDump(DATA, dataSize()) << dedent;
   2477         const binder_size_t* OBJS = objects();
   2478         const size_t N = objectsCount();
   2479         for (size_t i=0; i<N; i++) {
   2480             const flat_binder_object* flat
   2481                 = reinterpret_cast<const flat_binder_object*>(DATA+OBJS[i]);
   2482             to << endl << "Object #" << i << " @ " << (void*)OBJS[i] << ": "
   2483                 << TypeCode(flat->hdr.type & 0x7f7f7f00)
   2484                 << " = " << flat->binder;
   2485         }
   2486     } else {
   2487         to << "NULL";
   2488     }
   2489 
   2490     to << ")";
   2491 }
   2492 
   2493 void Parcel::releaseObjects()
   2494 {
   2495     const sp<ProcessState> proc(ProcessState::self());
   2496     size_t i = mObjectsSize;
   2497     uint8_t* const data = mData;
   2498     binder_size_t* const objects = mObjects;
   2499     while (i > 0) {
   2500         i--;
   2501         const flat_binder_object* flat
   2502             = reinterpret_cast<flat_binder_object*>(data+objects[i]);
   2503         release_object(proc, *flat, this, &mOpenAshmemSize);
   2504     }
   2505 }
   2506 
   2507 void Parcel::acquireObjects()
   2508 {
   2509     const sp<ProcessState> proc(ProcessState::self());
   2510     size_t i = mObjectsSize;
   2511     uint8_t* const data = mData;
   2512     binder_size_t* const objects = mObjects;
   2513     while (i > 0) {
   2514         i--;
   2515         const flat_binder_object* flat
   2516             = reinterpret_cast<flat_binder_object*>(data+objects[i]);
   2517         acquire_object(proc, *flat, this, &mOpenAshmemSize);
   2518     }
   2519 }
   2520 
   2521 void Parcel::freeData()
   2522 {
   2523     freeDataNoInit();
   2524     initState();
   2525 }
   2526 
   2527 void Parcel::freeDataNoInit()
   2528 {
   2529     if (mOwner) {
   2530         LOG_ALLOC("Parcel %p: freeing other owner data", this);
   2531         //ALOGI("Freeing data ref of %p (pid=%d)", this, getpid());
   2532         mOwner(this, mData, mDataSize, mObjects, mObjectsSize, mOwnerCookie);
   2533     } else {
   2534         LOG_ALLOC("Parcel %p: freeing allocated data", this);
   2535         releaseObjects();
   2536         if (mData) {
   2537             LOG_ALLOC("Parcel %p: freeing with %zu capacity", this, mDataCapacity);
   2538             pthread_mutex_lock(&gParcelGlobalAllocSizeLock);
   2539             if (mDataCapacity <= gParcelGlobalAllocSize) {
   2540               gParcelGlobalAllocSize = gParcelGlobalAllocSize - mDataCapacity;
   2541             } else {
   2542               gParcelGlobalAllocSize = 0;
   2543             }
   2544             if (gParcelGlobalAllocCount > 0) {
   2545               gParcelGlobalAllocCount--;
   2546             }
   2547             pthread_mutex_unlock(&gParcelGlobalAllocSizeLock);
   2548             free(mData);
   2549         }
   2550         if (mObjects) free(mObjects);
   2551     }
   2552 }
   2553 
   2554 status_t Parcel::growData(size_t len)
   2555 {
   2556     if (len > INT32_MAX) {
   2557         // don't accept size_t values which may have come from an
   2558         // inadvertent conversion from a negative int.
   2559         return BAD_VALUE;
   2560     }
   2561 
   2562     size_t newSize = ((mDataSize+len)*3)/2;
   2563     return (newSize <= mDataSize)
   2564             ? (status_t) NO_MEMORY
   2565             : continueWrite(newSize);
   2566 }
   2567 
   2568 status_t Parcel::restartWrite(size_t desired)
   2569 {
   2570     if (desired > INT32_MAX) {
   2571         // don't accept size_t values which may have come from an
   2572         // inadvertent conversion from a negative int.
   2573         return BAD_VALUE;
   2574     }
   2575 
   2576     if (mOwner) {
   2577         freeData();
   2578         return continueWrite(desired);
   2579     }
   2580 
   2581     uint8_t* data = (uint8_t*)realloc(mData, desired);
   2582     if (!data && desired > mDataCapacity) {
   2583         mError = NO_MEMORY;
   2584         return NO_MEMORY;
   2585     }
   2586 
   2587     releaseObjects();
   2588 
   2589     if (data) {
   2590         LOG_ALLOC("Parcel %p: restart from %zu to %zu capacity", this, mDataCapacity, desired);
   2591         pthread_mutex_lock(&gParcelGlobalAllocSizeLock);
   2592         gParcelGlobalAllocSize += desired;
   2593         gParcelGlobalAllocSize -= mDataCapacity;
   2594         if (!mData) {
   2595             gParcelGlobalAllocCount++;
   2596         }
   2597         pthread_mutex_unlock(&gParcelGlobalAllocSizeLock);
   2598         mData = data;
   2599         mDataCapacity = desired;
   2600     }
   2601 
   2602     mDataSize = mDataPos = 0;
   2603     ALOGV("restartWrite Setting data size of %p to %zu", this, mDataSize);
   2604     ALOGV("restartWrite Setting data pos of %p to %zu", this, mDataPos);
   2605 
   2606     free(mObjects);
   2607     mObjects = NULL;
   2608     mObjectsSize = mObjectsCapacity = 0;
   2609     mNextObjectHint = 0;
   2610     mObjectsSorted = false;
   2611     mHasFds = false;
   2612     mFdsKnown = true;
   2613     mAllowFds = true;
   2614 
   2615     return NO_ERROR;
   2616 }
   2617 
   2618 status_t Parcel::continueWrite(size_t desired)
   2619 {
   2620     if (desired > INT32_MAX) {
   2621         // don't accept size_t values which may have come from an
   2622         // inadvertent conversion from a negative int.
   2623         return BAD_VALUE;
   2624     }
   2625 
   2626     // If shrinking, first adjust for any objects that appear
   2627     // after the new data size.
   2628     size_t objectsSize = mObjectsSize;
   2629     if (desired < mDataSize) {
   2630         if (desired == 0) {
   2631             objectsSize = 0;
   2632         } else {
   2633             while (objectsSize > 0) {
   2634                 if (mObjects[objectsSize-1] < desired)
   2635                     break;
   2636                 objectsSize--;
   2637             }
   2638         }
   2639     }
   2640 
   2641     if (mOwner) {
   2642         // If the size is going to zero, just release the owner's data.
   2643         if (desired == 0) {
   2644             freeData();
   2645             return NO_ERROR;
   2646         }
   2647 
   2648         // If there is a different owner, we need to take
   2649         // posession.
   2650         uint8_t* data = (uint8_t*)malloc(desired);
   2651         if (!data) {
   2652             mError = NO_MEMORY;
   2653             return NO_MEMORY;
   2654         }
   2655         binder_size_t* objects = NULL;
   2656 
   2657         if (objectsSize) {
   2658             objects = (binder_size_t*)calloc(objectsSize, sizeof(binder_size_t));
   2659             if (!objects) {
   2660                 free(data);
   2661 
   2662                 mError = NO_MEMORY;
   2663                 return NO_MEMORY;
   2664             }
   2665 
   2666             // Little hack to only acquire references on objects
   2667             // we will be keeping.
   2668             size_t oldObjectsSize = mObjectsSize;
   2669             mObjectsSize = objectsSize;
   2670             acquireObjects();
   2671             mObjectsSize = oldObjectsSize;
   2672         }
   2673 
   2674         if (mData) {
   2675             memcpy(data, mData, mDataSize < desired ? mDataSize : desired);
   2676         }
   2677         if (objects && mObjects) {
   2678             memcpy(objects, mObjects, objectsSize*sizeof(binder_size_t));
   2679         }
   2680         //ALOGI("Freeing data ref of %p (pid=%d)", this, getpid());
   2681         mOwner(this, mData, mDataSize, mObjects, mObjectsSize, mOwnerCookie);
   2682         mOwner = NULL;
   2683 
   2684         LOG_ALLOC("Parcel %p: taking ownership of %zu capacity", this, desired);
   2685         pthread_mutex_lock(&gParcelGlobalAllocSizeLock);
   2686         gParcelGlobalAllocSize += desired;
   2687         gParcelGlobalAllocCount++;
   2688         pthread_mutex_unlock(&gParcelGlobalAllocSizeLock);
   2689 
   2690         mData = data;
   2691         mObjects = objects;
   2692         mDataSize = (mDataSize < desired) ? mDataSize : desired;
   2693         ALOGV("continueWrite Setting data size of %p to %zu", this, mDataSize);
   2694         mDataCapacity = desired;
   2695         mObjectsSize = mObjectsCapacity = objectsSize;
   2696         mNextObjectHint = 0;
   2697         mObjectsSorted = false;
   2698 
   2699     } else if (mData) {
   2700         if (objectsSize < mObjectsSize) {
   2701             // Need to release refs on any objects we are dropping.
   2702             const sp<ProcessState> proc(ProcessState::self());
   2703             for (size_t i=objectsSize; i<mObjectsSize; i++) {
   2704                 const flat_binder_object* flat
   2705                     = reinterpret_cast<flat_binder_object*>(mData+mObjects[i]);
   2706                 if (flat->hdr.type == BINDER_TYPE_FD) {
   2707                     // will need to rescan because we may have lopped off the only FDs
   2708                     mFdsKnown = false;
   2709                 }
   2710                 release_object(proc, *flat, this, &mOpenAshmemSize);
   2711             }
   2712             binder_size_t* objects =
   2713                 (binder_size_t*)realloc(mObjects, objectsSize*sizeof(binder_size_t));
   2714             if (objects) {
   2715                 mObjects = objects;
   2716             }
   2717             mObjectsSize = objectsSize;
   2718             mNextObjectHint = 0;
   2719             mObjectsSorted = false;
   2720         }
   2721 
   2722         // We own the data, so we can just do a realloc().
   2723         if (desired > mDataCapacity) {
   2724             uint8_t* data = (uint8_t*)realloc(mData, desired);
   2725             if (data) {
   2726                 LOG_ALLOC("Parcel %p: continue from %zu to %zu capacity", this, mDataCapacity,
   2727                         desired);
   2728                 pthread_mutex_lock(&gParcelGlobalAllocSizeLock);
   2729                 gParcelGlobalAllocSize += desired;
   2730                 gParcelGlobalAllocSize -= mDataCapacity;
   2731                 pthread_mutex_unlock(&gParcelGlobalAllocSizeLock);
   2732                 mData = data;
   2733                 mDataCapacity = desired;
   2734             } else {
   2735                 mError = NO_MEMORY;
   2736                 return NO_MEMORY;
   2737             }
   2738         } else {
   2739             if (mDataSize > desired) {
   2740                 mDataSize = desired;
   2741                 ALOGV("continueWrite Setting data size of %p to %zu", this, mDataSize);
   2742             }
   2743             if (mDataPos > desired) {
   2744                 mDataPos = desired;
   2745                 ALOGV("continueWrite Setting data pos of %p to %zu", this, mDataPos);
   2746             }
   2747         }
   2748 
   2749     } else {
   2750         // This is the first data.  Easy!
   2751         uint8_t* data = (uint8_t*)malloc(desired);
   2752         if (!data) {
   2753             mError = NO_MEMORY;
   2754             return NO_MEMORY;
   2755         }
   2756 
   2757         if(!(mDataCapacity == 0 && mObjects == NULL
   2758              && mObjectsCapacity == 0)) {
   2759             ALOGE("continueWrite: %zu/%p/%zu/%zu", mDataCapacity, mObjects, mObjectsCapacity, desired);
   2760         }
   2761 
   2762         LOG_ALLOC("Parcel %p: allocating with %zu capacity", this, desired);
   2763         pthread_mutex_lock(&gParcelGlobalAllocSizeLock);
   2764         gParcelGlobalAllocSize += desired;
   2765         gParcelGlobalAllocCount++;
   2766         pthread_mutex_unlock(&gParcelGlobalAllocSizeLock);
   2767 
   2768         mData = data;
   2769         mDataSize = mDataPos = 0;
   2770         ALOGV("continueWrite Setting data size of %p to %zu", this, mDataSize);
   2771         ALOGV("continueWrite Setting data pos of %p to %zu", this, mDataPos);
   2772         mDataCapacity = desired;
   2773     }
   2774 
   2775     return NO_ERROR;
   2776 }
   2777 
   2778 void Parcel::initState()
   2779 {
   2780     LOG_ALLOC("Parcel %p: initState", this);
   2781     mError = NO_ERROR;
   2782     mData = 0;
   2783     mDataSize = 0;
   2784     mDataCapacity = 0;
   2785     mDataPos = 0;
   2786     ALOGV("initState Setting data size of %p to %zu", this, mDataSize);
   2787     ALOGV("initState Setting data pos of %p to %zu", this, mDataPos);
   2788     mObjects = NULL;
   2789     mObjectsSize = 0;
   2790     mObjectsCapacity = 0;
   2791     mNextObjectHint = 0;
   2792     mObjectsSorted = false;
   2793     mHasFds = false;
   2794     mFdsKnown = true;
   2795     mAllowFds = true;
   2796     mOwner = NULL;
   2797     mOpenAshmemSize = 0;
   2798 
   2799     // racing multiple init leads only to multiple identical write
   2800     if (gMaxFds == 0) {
   2801         struct rlimit result;
   2802         if (!getrlimit(RLIMIT_NOFILE, &result)) {
   2803             gMaxFds = (size_t)result.rlim_cur;
   2804             //ALOGI("parcel fd limit set to %zu", gMaxFds);
   2805         } else {
   2806             ALOGW("Unable to getrlimit: %s", strerror(errno));
   2807             gMaxFds = 1024;
   2808         }
   2809     }
   2810 }
   2811 
   2812 void Parcel::scanForFds() const
   2813 {
   2814     bool hasFds = false;
   2815     for (size_t i=0; i<mObjectsSize; i++) {
   2816         const flat_binder_object* flat
   2817             = reinterpret_cast<const flat_binder_object*>(mData + mObjects[i]);
   2818         if (flat->hdr.type == BINDER_TYPE_FD) {
   2819             hasFds = true;
   2820             break;
   2821         }
   2822     }
   2823     mHasFds = hasFds;
   2824     mFdsKnown = true;
   2825 }
   2826 
   2827 size_t Parcel::getBlobAshmemSize() const
   2828 {
   2829     // This used to return the size of all blobs that were written to ashmem, now we're returning
   2830     // the ashmem currently referenced by this Parcel, which should be equivalent.
   2831     // TODO: Remove method once ABI can be changed.
   2832     return mOpenAshmemSize;
   2833 }
   2834 
   2835 size_t Parcel::getOpenAshmemSize() const
   2836 {
   2837     return mOpenAshmemSize;
   2838 }
   2839 
   2840 // --- Parcel::Blob ---
   2841 
   2842 Parcel::Blob::Blob() :
   2843         mFd(-1), mData(NULL), mSize(0), mMutable(false) {
   2844 }
   2845 
   2846 Parcel::Blob::~Blob() {
   2847     release();
   2848 }
   2849 
   2850 void Parcel::Blob::release() {
   2851     if (mFd != -1 && mData) {
   2852         ::munmap(mData, mSize);
   2853     }
   2854     clear();
   2855 }
   2856 
   2857 void Parcel::Blob::init(int fd, void* data, size_t size, bool isMutable) {
   2858     mFd = fd;
   2859     mData = data;
   2860     mSize = size;
   2861     mMutable = isMutable;
   2862 }
   2863 
   2864 void Parcel::Blob::clear() {
   2865     mFd = -1;
   2866     mData = NULL;
   2867     mSize = 0;
   2868     mMutable = false;
   2869 }
   2870 
   2871 }; // namespace android
   2872