1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
|
From 76e6db3e514350fd146cb04425e669d63b59f889 Mon Sep 17 00:00:00 2001
From: Gerald Squelart <gsquelart@mozilla.com>
Date: Wed, 9 Dec 2015 09:59:37 +0100
Subject: [PATCH] Bug 1216748 - p2. Handle failed malloc in Metadata storage -
r=rillian, a=sylvestre
---
.../av/include/media/stagefright/MetaData.h | 2 +-
.../av/media/libstagefright/MetaData.cpp | 35 ++++++++++++++--------
2 files changed, 24 insertions(+), 13 deletions(-)
diff --git a/media/libstagefright/frameworks/av/include/media/stagefright/MetaData.h b/media/libstagefright/frameworks/av/include/media/stagefright/MetaData.h
index 30d969d..0a8ff77 100644
--- a/media/libstagefright/frameworks/av/include/media/stagefright/MetaData.h
+++ b/media/libstagefright/frameworks/av/include/media/stagefright/MetaData.h
@@ -248,7 +248,7 @@ private:
return mSize <= sizeof(u.reservoir);
}
- void allocateStorage(size_t size);
+ bool allocateStorage(size_t size);
void freeStorage();
void *storage() {
diff --git a/media/libstagefright/frameworks/av/media/libstagefright/MetaData.cpp b/media/libstagefright/frameworks/av/media/libstagefright/MetaData.cpp
index c832c96..cba324d 100644
--- a/media/libstagefright/frameworks/av/media/libstagefright/MetaData.cpp
+++ b/media/libstagefright/frameworks/av/media/libstagefright/MetaData.cpp
@@ -220,7 +220,7 @@ bool MetaData::findData(uint32_t key, uint32_t *type,
}
MetaData::typed_data::typed_data()
- : mType(0),
+ : mType(TYPE_NONE),
mSize(0) {
}
@@ -231,17 +231,19 @@ MetaData::typed_data::~typed_data() {
MetaData::typed_data::typed_data(const typed_data &from)
: mType(from.mType),
mSize(0) {
- allocateStorage(from.mSize);
- memcpy(storage(), from.storage(), mSize);
+ if (allocateStorage(from.mSize)) {
+ memcpy(storage(), from.storage(), mSize);
+ }
}
MetaData::typed_data &MetaData::typed_data::operator=(
const MetaData::typed_data &from) {
if (this != &from) {
clear();
- mType = from.mType;
- allocateStorage(from.mSize);
- memcpy(storage(), from.storage(), mSize);
+ if (allocateStorage(from.mSize)) {
+ mType = from.mType;
+ memcpy(storage(), from.storage(), mSize);
+ }
}
return *this;
@@ -250,16 +252,17 @@ MetaData::typed_data &MetaData::typed_data::operator=(
void MetaData::typed_data::clear() {
freeStorage();
- mType = 0;
+ mType = TYPE_NONE;
}
void MetaData::typed_data::setData(
uint32_t type, const void *data, size_t size) {
clear();
- mType = type;
- allocateStorage(size);
- memcpy(storage(), data, size);
+ if (allocateStorage(size)) {
+ mType = type;
+ memcpy(storage(), data, size);
+ }
}
void MetaData::typed_data::getData(
@@ -269,14 +272,22 @@ void MetaData::typed_data::getData(
*data = storage();
}
-void MetaData::typed_data::allocateStorage(size_t size) {
+bool MetaData::typed_data::allocateStorage(size_t size) {
+ // Update mSize now, as it is needed by usesReservoir() below.
+ // (mSize will be reset if the allocation fails further below.)
mSize = size;
if (usesReservoir()) {
- return;
+ return true;
}
u.ext_data = malloc(mSize);
+ if (!u.ext_data) {
+ mType = TYPE_NONE;
+ mSize = 0;
+ return false;
+ }
+ return true;
}
void MetaData::typed_data::freeStorage() {
--
2.6.3
|