14
14
* limitations under the License.
15
15
*/
16
16
17
+ #define __STDINT_MACROS
18
+ #define __STDINT_LIMITS
19
+
17
20
#define LOG_TAG " SampleTable"
18
21
// #define LOG_NDEBUG 0
19
22
#include < utils/Log.h>
27
30
#include < media/stagefright/DataSource.h>
28
31
#include < media/stagefright/Utils.h>
29
32
30
- /* TODO: remove after being merged into other branches */
31
- #ifndef UINT32_MAX
32
- #define UINT32_MAX (4294967295U )
33
- #endif
34
-
35
33
namespace android {
36
34
37
35
// static
@@ -45,6 +43,8 @@ const uint32_t SampleTable::kSampleSizeTypeCompact = FOURCC('s', 't', 'z', '2');
45
43
46
44
// //////////////////////////////////////////////////////////////////////////////
47
45
46
+ const off64_t kMaxOffset = INT64_MAX;
47
+
48
48
struct SampleTable ::CompositionDeltaLookup {
49
49
CompositionDeltaLookup ();
50
50
@@ -233,11 +233,11 @@ status_t SampleTable::setSampleToChunkParams(
233
233
234
234
mNumSampleToChunkOffsets = U32_AT (&header[4 ]);
235
235
236
- if (data_size < 8 + mNumSampleToChunkOffsets * 12 ) {
236
+ if (( data_size - 8 ) / sizeof (SampleToChunkEntry) < mNumSampleToChunkOffsets ) {
237
237
return ERROR_MALFORMED;
238
238
}
239
239
240
- if ((uint64_t )SIZE_MAX / sizeof (SampleToChunkEntry) <=
240
+ if ((uint64_t )kMaxTotalSize / sizeof (SampleToChunkEntry) <=
241
241
(uint64_t )mNumSampleToChunkOffsets ) {
242
242
ALOGE (" Sample-to-chunk table size too large." );
243
243
return ERROR_OUT_OF_RANGE;
@@ -269,16 +269,19 @@ status_t SampleTable::setSampleToChunkParams(
269
269
return OK;
270
270
}
271
271
272
- if ((off64_t )(SIZE_MAX - 8 -
272
+ if ((off64_t )(kMaxOffset - 8 -
273
273
((mNumSampleToChunkOffsets - 1 ) * sizeof (SampleToChunkEntry)))
274
274
< mSampleToChunkOffset ) {
275
275
return ERROR_MALFORMED;
276
276
}
277
277
278
278
for (uint32_t i = 0 ; i < mNumSampleToChunkOffsets ; ++i) {
279
- uint8_t buffer[12 ];
279
+ uint8_t buffer[sizeof (SampleToChunkEntry)];
280
+
280
281
if (mDataSource ->readAt (
281
- mSampleToChunkOffset + 8 + i * 12 , buffer, sizeof (buffer))
282
+ mSampleToChunkOffset + 8 + i * sizeof (SampleToChunkEntry),
283
+ buffer,
284
+ sizeof (buffer))
282
285
!= (ssize_t )sizeof (buffer)) {
283
286
return ERROR_IO;
284
287
}
@@ -378,8 +381,7 @@ status_t SampleTable::setTimeToSampleParams(
378
381
}
379
382
380
383
mTimeToSampleCount = U32_AT (&header[4 ]);
381
- if ((uint64_t )mTimeToSampleCount >
382
- (uint64_t )UINT32_MAX / (2 * sizeof (uint32_t ))) {
384
+ if (mTimeToSampleCount > UINT32_MAX / (2 * sizeof (uint32_t ))) {
383
385
// Choose this bound because
384
386
// 1) 2 * sizeof(uint32_t) is the amount of memory needed for one
385
387
// time-to-sample entry in the time-to-sample table.
@@ -455,7 +457,7 @@ status_t SampleTable::setCompositionTimeToSampleParams(
455
457
456
458
mNumCompositionTimeDeltaEntries = numEntries;
457
459
uint64_t allocSize = (uint64_t )numEntries * 2 * sizeof (uint32_t );
458
- if (allocSize > SIZE_MAX ) {
460
+ if (allocSize > kMaxTotalSize ) {
459
461
ALOGE (" Composition-time-to-sample table size too large." );
460
462
return ERROR_OUT_OF_RANGE;
461
463
}
@@ -522,7 +524,7 @@ status_t SampleTable::setSyncSampleParams(off64_t data_offset, size_t data_size)
522
524
}
523
525
524
526
uint64_t allocSize = (uint64_t )mNumSyncSamples * sizeof (uint32_t );
525
- if (allocSize > SIZE_MAX ) {
527
+ if (allocSize > kMaxTotalSize ) {
526
528
ALOGE (" Sync sample table size too large." );
527
529
return ERROR_OUT_OF_RANGE;
528
530
}
0 commit comments