|
17 | 17 |
|
18 | 18 | #include <arpa/inet.h>
|
19 | 19 | #include <stdint.h>
|
20 |
| -#include <sys/types.h> |
21 | 20 |
|
| 21 | +#include <binder/IPCThreadState.h> |
22 | 22 | #include <binder/Parcel.h>
|
23 | 23 |
|
24 | 24 | #include <media/AudioResamplerPublic.h>
|
@@ -85,10 +85,36 @@ enum {
|
85 | 85 | };
|
86 | 86 |
|
87 | 87 | // ModDrm helpers
|
88 |
| -static void readVector(const Parcel& reply, Vector<uint8_t>& vector) { |
89 |
| - uint32_t size = reply.readUint32(); |
90 |
| - vector.insertAt((size_t)0, size); |
91 |
| - reply.read(vector.editArray(), size); |
| 88 | +static status_t readVector(const Parcel& reply, Vector<uint8_t>& vector) { |
| 89 | + uint32_t size = 0; |
| 90 | + status_t status = reply.readUint32(&size); |
| 91 | + if (status == OK) { |
| 92 | + status = size <= reply.dataAvail() ? OK : BAD_VALUE; |
| 93 | + } |
| 94 | + if (status == OK) { |
| 95 | + status = vector.insertAt((size_t) 0, size) >= 0 ? OK : NO_MEMORY; |
| 96 | + } |
| 97 | + if (status == OK) { |
| 98 | + status = reply.read(vector.editArray(), size); |
| 99 | + } |
| 100 | + if (status != OK) { |
| 101 | + char errorMsg[100]; |
| 102 | + char buganizerId[] = "173720767"; |
| 103 | + snprintf(errorMsg, |
| 104 | + sizeof(errorMsg), |
| 105 | + "%s: failed to read array. Size: %d, status: %d.", |
| 106 | + __func__, |
| 107 | + size, |
| 108 | + status); |
| 109 | + android_errorWriteWithInfoLog( |
| 110 | + /* safetyNet tag= */ 0x534e4554, |
| 111 | + buganizerId, |
| 112 | + IPCThreadState::self()->getCallingUid(), |
| 113 | + errorMsg, |
| 114 | + strlen(errorMsg)); |
| 115 | + ALOGE("%s (b/%s)", errorMsg, buganizerId); |
| 116 | + } |
| 117 | + return status; |
92 | 118 | }
|
93 | 119 |
|
94 | 120 | static void writeVector(Parcel& data, Vector<uint8_t> const& vector) {
|
@@ -964,8 +990,10 @@ status_t BnMediaPlayer::onTransact(
|
964 | 990 | uint8_t uuid[16];
|
965 | 991 | data.read(uuid, sizeof(uuid));
|
966 | 992 | Vector<uint8_t> drmSessionId;
|
967 |
| - readVector(data, drmSessionId); |
968 |
| - |
| 993 | + status_t status = readVector(data, drmSessionId); |
| 994 | + if (status != OK) { |
| 995 | + return status; |
| 996 | + } |
969 | 997 | uint32_t result = prepareDrm(uuid, drmSessionId);
|
970 | 998 | reply->writeInt32(result);
|
971 | 999 | return OK;
|
|
0 commit comments