Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(210)

Side by Side Diff: core/src/fxcrt/fx_basic_buffer.cpp

Issue 1710403002: Use safe arithmentic in CFX_BinaryBuf::ExpandBuf. (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: needless uint8_t casts. Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « core/src/fxcodec/codec/fx_codec_fax.cpp ('k') | fpdfsdk/src/fsdk_baseform.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 PDFium Authors. All rights reserved. 1 // Copyright 2014 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <limits>
8 9
9 #include "core/include/fxcrt/fx_basic.h" 10 #include "core/include/fxcrt/fx_basic.h"
11 #include "core/include/fxcrt/fx_safe_types.h"
10 12
11 FX_STRSIZE FX_ftoa(FX_FLOAT f, FX_CHAR* buf);
12 CFX_BinaryBuf::CFX_BinaryBuf() 13 CFX_BinaryBuf::CFX_BinaryBuf()
13 : m_AllocStep(0), m_pBuffer(NULL), m_DataSize(0), m_AllocSize(0) {} 14 : m_AllocStep(0), m_AllocSize(0), m_DataSize(0) {}
15
14 CFX_BinaryBuf::CFX_BinaryBuf(FX_STRSIZE size) 16 CFX_BinaryBuf::CFX_BinaryBuf(FX_STRSIZE size)
15 : m_AllocStep(0), m_DataSize(size), m_AllocSize(size) { 17 : m_AllocStep(0), m_AllocSize(size), m_DataSize(size) {
16 m_pBuffer = FX_Alloc(uint8_t, size); 18 m_pBuffer.reset(FX_Alloc(uint8_t, size));
17 } 19 }
18 CFX_BinaryBuf::~CFX_BinaryBuf() { 20
19 FX_Free(m_pBuffer);
20 }
21 void CFX_BinaryBuf::Delete(int start_index, int count) { 21 void CFX_BinaryBuf::Delete(int start_index, int count) {
22 if (!m_pBuffer || start_index < 0 || start_index + count > m_DataSize) { 22 if (!m_pBuffer || start_index < 0 || count < 0 || count > m_DataSize ||
23 start_index > m_DataSize - count) {
23 return; 24 return;
24 } 25 }
25 FXSYS_memmove(m_pBuffer + start_index, m_pBuffer + start_index + count, 26 FXSYS_memmove(m_pBuffer.get() + start_index,
27 m_pBuffer.get() + start_index + count,
26 m_DataSize - start_index - count); 28 m_DataSize - start_index - count);
27 m_DataSize -= count; 29 m_DataSize -= count;
28 } 30 }
31
29 void CFX_BinaryBuf::Clear() { 32 void CFX_BinaryBuf::Clear() {
30 m_DataSize = 0; 33 m_DataSize = 0;
31 } 34 }
32 void CFX_BinaryBuf::DetachBuffer() { 35
36 uint8_t* CFX_BinaryBuf::DetachBuffer() {
33 m_DataSize = 0; 37 m_DataSize = 0;
34 m_pBuffer = NULL;
35 m_AllocSize = 0; 38 m_AllocSize = 0;
39 return m_pBuffer.release();
36 } 40 }
37 void CFX_BinaryBuf::AttachData(void* buffer, FX_STRSIZE size) { 41
38 FX_Free(m_pBuffer); 42 void CFX_BinaryBuf::AttachData(uint8_t* buffer, FX_STRSIZE size) {
43 m_pBuffer.reset(buffer);
39 m_DataSize = size; 44 m_DataSize = size;
40 m_pBuffer = (uint8_t*)buffer;
41 m_AllocSize = size; 45 m_AllocSize = size;
42 } 46 }
43 void CFX_BinaryBuf::TakeOver(CFX_BinaryBuf& other) { 47
44 AttachData(other.GetBuffer(), other.GetSize());
45 other.DetachBuffer();
46 }
47 void CFX_BinaryBuf::EstimateSize(FX_STRSIZE size, FX_STRSIZE step) { 48 void CFX_BinaryBuf::EstimateSize(FX_STRSIZE size, FX_STRSIZE step) {
48 m_AllocStep = step; 49 m_AllocStep = step;
49 if (m_AllocSize >= size) { 50 if (m_AllocSize < size)
51 ExpandBuf(size - m_DataSize);
52 }
53
54 void CFX_BinaryBuf::ExpandBuf(FX_STRSIZE add_size) {
55 FX_SAFE_STRSIZE new_size = m_DataSize;
56 new_size += add_size;
57 if (m_AllocSize >= new_size.ValueOrDie())
50 return; 58 return;
51 } 59
52 ExpandBuf(size - m_DataSize); 60 int alloc_step = std::min(128, m_AllocStep ? m_AllocStep : m_AllocSize / 4);
61 new_size += alloc_step - 1; // Quantize, don't combine these lines.
62 new_size /= alloc_step;
63 new_size *= alloc_step;
64 m_AllocSize = new_size.ValueOrDie();
65 m_pBuffer.reset(m_pBuffer
66 ? FX_Realloc(uint8_t, m_pBuffer.release(), m_AllocSize)
67 : FX_Alloc(uint8_t, m_AllocSize));
53 } 68 }
54 void CFX_BinaryBuf::ExpandBuf(FX_STRSIZE add_size) { 69
55 FX_STRSIZE new_size = add_size + m_DataSize; 70 void CFX_BinaryBuf::AppendBlock(const void* pBuf, FX_STRSIZE size) {
56 if (m_AllocSize >= new_size) { 71 if (size <= 0)
57 return; 72 return;
58 } 73
59 int alloc_step; 74 ExpandBuf(size);
60 if (m_AllocStep == 0) { 75 if (pBuf) {
61 alloc_step = m_AllocSize / 4; 76 FXSYS_memcpy(m_pBuffer.get() + m_DataSize, pBuf, size);
62 if (alloc_step < 128) {
63 alloc_step = 128;
64 }
65 } else { 77 } else {
66 alloc_step = m_AllocStep; 78 FXSYS_memset(m_pBuffer.get() + m_DataSize, 0, size);
67 }
68 new_size = (new_size + alloc_step - 1) / alloc_step * alloc_step;
69 uint8_t* pNewBuffer = m_pBuffer;
70 if (pNewBuffer) {
71 pNewBuffer = FX_Realloc(uint8_t, m_pBuffer, new_size);
72 } else {
73 pNewBuffer = FX_Alloc(uint8_t, new_size);
74 }
75 m_pBuffer = pNewBuffer;
76 m_AllocSize = new_size;
77 }
78 void CFX_BinaryBuf::CopyData(const void* pStr, FX_STRSIZE size) {
79 if (size == 0) {
80 m_DataSize = 0;
81 return;
82 }
83 if (m_AllocSize < size) {
84 ExpandBuf(size - m_DataSize);
85 }
86 if (!m_pBuffer) {
87 return;
88 }
89 FXSYS_memcpy(m_pBuffer, pStr, size);
90 m_DataSize = size;
91 }
92 void CFX_BinaryBuf::AppendBlock(const void* pBuf, FX_STRSIZE size) {
93 ExpandBuf(size);
94 if (pBuf && m_pBuffer) {
95 FXSYS_memcpy(m_pBuffer + m_DataSize, pBuf, size);
96 } 79 }
97 m_DataSize += size; 80 m_DataSize += size;
98 } 81 }
82
99 void CFX_BinaryBuf::InsertBlock(FX_STRSIZE pos, 83 void CFX_BinaryBuf::InsertBlock(FX_STRSIZE pos,
100 const void* pBuf, 84 const void* pBuf,
101 FX_STRSIZE size) { 85 FX_STRSIZE size) {
86 if (size <= 0)
87 return;
88
102 ExpandBuf(size); 89 ExpandBuf(size);
103 if (!m_pBuffer) { 90 FXSYS_memmove(m_pBuffer.get() + pos + size, m_pBuffer.get() + pos,
104 return; 91 m_DataSize - pos);
105 }
106 FXSYS_memmove(m_pBuffer + pos + size, m_pBuffer + pos, m_DataSize - pos);
107 if (pBuf) { 92 if (pBuf) {
108 FXSYS_memcpy(m_pBuffer + pos, pBuf, size); 93 FXSYS_memcpy(m_pBuffer.get() + pos, pBuf, size);
94 } else {
95 FXSYS_memset(m_pBuffer.get() + pos, 0, size);
109 } 96 }
110 m_DataSize += size; 97 m_DataSize += size;
111 } 98 }
112 void CFX_BinaryBuf::AppendFill(uint8_t byte, FX_STRSIZE count) { 99
113 ExpandBuf(count); 100 CFX_ByteStringC CFX_ByteTextBuf::GetByteString() const {
114 if (!m_pBuffer) { 101 return CFX_ByteStringC(m_pBuffer.get(), m_DataSize);
115 return;
116 }
117 FXSYS_memset(m_pBuffer + m_DataSize, byte, count);
118 m_DataSize += count;
119 } 102 }
120 CFX_ByteStringC CFX_BinaryBuf::GetByteString() const { 103
121 return CFX_ByteStringC(m_pBuffer, m_DataSize);
122 }
123 CFX_ByteTextBuf& CFX_ByteTextBuf::operator<<(const CFX_ByteStringC& lpsz) { 104 CFX_ByteTextBuf& CFX_ByteTextBuf::operator<<(const CFX_ByteStringC& lpsz) {
124 AppendBlock(lpsz.GetPtr(), lpsz.GetLength()); 105 AppendBlock(lpsz.GetPtr(), lpsz.GetLength());
125 return *this; 106 return *this;
126 } 107 }
108
127 CFX_ByteTextBuf& CFX_ByteTextBuf::operator<<(int i) { 109 CFX_ByteTextBuf& CFX_ByteTextBuf::operator<<(int i) {
128 char buf[32]; 110 char buf[32];
129 FXSYS_itoa(i, buf, 10); 111 FXSYS_itoa(i, buf, 10);
130 AppendBlock(buf, FXSYS_strlen(buf)); 112 AppendBlock(buf, FXSYS_strlen(buf));
131 return *this; 113 return *this;
132 } 114 }
115
133 CFX_ByteTextBuf& CFX_ByteTextBuf::operator<<(FX_DWORD i) { 116 CFX_ByteTextBuf& CFX_ByteTextBuf::operator<<(FX_DWORD i) {
134 char buf[32]; 117 char buf[32];
135 FXSYS_itoa(i, buf, 10); 118 FXSYS_itoa(i, buf, 10);
136 AppendBlock(buf, FXSYS_strlen(buf)); 119 AppendBlock(buf, FXSYS_strlen(buf));
137 return *this; 120 return *this;
138 } 121 }
122
139 CFX_ByteTextBuf& CFX_ByteTextBuf::operator<<(double f) { 123 CFX_ByteTextBuf& CFX_ByteTextBuf::operator<<(double f) {
140 char buf[32]; 124 char buf[32];
141 FX_STRSIZE len = FX_ftoa((FX_FLOAT)f, buf); 125 FX_STRSIZE len = FX_ftoa((FX_FLOAT)f, buf);
142 AppendBlock(buf, len); 126 AppendBlock(buf, len);
143 return *this; 127 return *this;
144 } 128 }
129
145 CFX_ByteTextBuf& CFX_ByteTextBuf::operator<<(const CFX_ByteTextBuf& buf) { 130 CFX_ByteTextBuf& CFX_ByteTextBuf::operator<<(const CFX_ByteTextBuf& buf) {
146 AppendBlock(buf.m_pBuffer, buf.m_DataSize); 131 AppendBlock(buf.m_pBuffer.get(), buf.m_DataSize);
147 return *this; 132 return *this;
148 } 133 }
149 void CFX_ByteTextBuf::operator=(const CFX_ByteStringC& str) { 134
150 CopyData(str.GetPtr(), str.GetLength());
151 }
152 void CFX_WideTextBuf::AppendChar(FX_WCHAR ch) { 135 void CFX_WideTextBuf::AppendChar(FX_WCHAR ch) {
153 if (m_AllocSize < m_DataSize + (FX_STRSIZE)sizeof(FX_WCHAR)) { 136 ExpandBuf(sizeof(FX_WCHAR));
154 ExpandBuf(sizeof(FX_WCHAR)); 137 *(FX_WCHAR*)(m_pBuffer.get() + m_DataSize) = ch;
155 }
156 ASSERT(m_pBuffer);
157 *(FX_WCHAR*)(m_pBuffer + m_DataSize) = ch;
158 m_DataSize += sizeof(FX_WCHAR); 138 m_DataSize += sizeof(FX_WCHAR);
159 } 139 }
140
160 CFX_WideTextBuf& CFX_WideTextBuf::operator<<(const CFX_WideStringC& str) { 141 CFX_WideTextBuf& CFX_WideTextBuf::operator<<(const CFX_WideStringC& str) {
161 AppendBlock(str.GetPtr(), str.GetLength() * sizeof(FX_WCHAR)); 142 AppendBlock(str.GetPtr(), str.GetLength() * sizeof(FX_WCHAR));
162 return *this; 143 return *this;
163 } 144 }
145
164 CFX_WideTextBuf& CFX_WideTextBuf::operator<<(const CFX_WideString& str) { 146 CFX_WideTextBuf& CFX_WideTextBuf::operator<<(const CFX_WideString& str) {
165 AppendBlock(str.c_str(), str.GetLength() * sizeof(FX_WCHAR)); 147 AppendBlock(str.c_str(), str.GetLength() * sizeof(FX_WCHAR));
166 return *this; 148 return *this;
167 } 149 }
150
168 CFX_WideTextBuf& CFX_WideTextBuf::operator<<(int i) { 151 CFX_WideTextBuf& CFX_WideTextBuf::operator<<(int i) {
169 char buf[32]; 152 char buf[32];
170 FXSYS_itoa(i, buf, 10); 153 FXSYS_itoa(i, buf, 10);
171 FX_STRSIZE len = FXSYS_strlen(buf); 154 FX_STRSIZE len = FXSYS_strlen(buf);
172 if (m_AllocSize < m_DataSize + (FX_STRSIZE)(len * sizeof(FX_WCHAR))) { 155 ExpandBuf(len * sizeof(FX_WCHAR));
173 ExpandBuf(len * sizeof(FX_WCHAR)); 156 FX_WCHAR* str = (FX_WCHAR*)(m_pBuffer.get() + m_DataSize);
174 }
175 ASSERT(m_pBuffer);
176 FX_WCHAR* str = (FX_WCHAR*)(m_pBuffer + m_DataSize);
177 for (FX_STRSIZE j = 0; j < len; j++) { 157 for (FX_STRSIZE j = 0; j < len; j++) {
178 *str++ = buf[j]; 158 *str++ = buf[j];
179 } 159 }
180 m_DataSize += len * sizeof(FX_WCHAR); 160 m_DataSize += len * sizeof(FX_WCHAR);
181 return *this; 161 return *this;
182 } 162 }
163
183 CFX_WideTextBuf& CFX_WideTextBuf::operator<<(double f) { 164 CFX_WideTextBuf& CFX_WideTextBuf::operator<<(double f) {
184 char buf[32]; 165 char buf[32];
185 FX_STRSIZE len = FX_ftoa((FX_FLOAT)f, buf); 166 FX_STRSIZE len = FX_ftoa((FX_FLOAT)f, buf);
186 if (m_AllocSize < m_DataSize + (FX_STRSIZE)(len * sizeof(FX_WCHAR))) { 167 ExpandBuf(len * sizeof(FX_WCHAR));
187 ExpandBuf(len * sizeof(FX_WCHAR)); 168 FX_WCHAR* str = (FX_WCHAR*)(m_pBuffer.get() + m_DataSize);
188 }
189 ASSERT(m_pBuffer);
190 FX_WCHAR* str = (FX_WCHAR*)(m_pBuffer + m_DataSize);
191 for (FX_STRSIZE i = 0; i < len; i++) { 169 for (FX_STRSIZE i = 0; i < len; i++) {
192 *str++ = buf[i]; 170 *str++ = buf[i];
193 } 171 }
194 m_DataSize += len * sizeof(FX_WCHAR); 172 m_DataSize += len * sizeof(FX_WCHAR);
195 return *this; 173 return *this;
196 } 174 }
175
197 CFX_WideTextBuf& CFX_WideTextBuf::operator<<(const FX_WCHAR* lpsz) { 176 CFX_WideTextBuf& CFX_WideTextBuf::operator<<(const FX_WCHAR* lpsz) {
198 AppendBlock(lpsz, FXSYS_wcslen(lpsz) * sizeof(FX_WCHAR)); 177 AppendBlock(lpsz, FXSYS_wcslen(lpsz) * sizeof(FX_WCHAR));
199 return *this; 178 return *this;
200 } 179 }
180
201 CFX_WideTextBuf& CFX_WideTextBuf::operator<<(const CFX_WideTextBuf& buf) { 181 CFX_WideTextBuf& CFX_WideTextBuf::operator<<(const CFX_WideTextBuf& buf) {
202 AppendBlock(buf.m_pBuffer, buf.m_DataSize); 182 AppendBlock(buf.m_pBuffer.get(), buf.m_DataSize);
203 return *this; 183 return *this;
204 } 184 }
205 void CFX_WideTextBuf::operator=(const CFX_WideStringC& str) { 185
206 CopyData(str.GetPtr(), str.GetLength() * sizeof(FX_WCHAR));
207 }
208 CFX_WideStringC CFX_WideTextBuf::GetWideString() const { 186 CFX_WideStringC CFX_WideTextBuf::GetWideString() const {
209 return CFX_WideStringC((const FX_WCHAR*)m_pBuffer, 187 return CFX_WideStringC((const FX_WCHAR*)m_pBuffer.get(),
210 m_DataSize / sizeof(FX_WCHAR)); 188 m_DataSize / sizeof(FX_WCHAR));
211 } 189 }
212 190
213 #ifdef PDF_ENABLE_XFA 191 #ifdef PDF_ENABLE_XFA
214 CFX_ArchiveSaver& CFX_ArchiveSaver::operator<<(uint8_t i) { 192 CFX_ArchiveSaver& CFX_ArchiveSaver::operator<<(uint8_t i) {
215 if (m_pStream) { 193 if (m_pStream) {
216 m_pStream->WriteBlock(&i, 1); 194 m_pStream->WriteBlock(&i, 1);
217 } else { 195 } else {
218 m_SavingBuf.AppendByte(i); 196 m_SavingBuf.AppendByte(i);
219 } 197 }
(...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after
454 } 432 }
455 FX_BOOL CFX_FileBufferArchive::DoWork(const void* pBuf, size_t size) { 433 FX_BOOL CFX_FileBufferArchive::DoWork(const void* pBuf, size_t size) {
456 if (!m_pFile) { 434 if (!m_pFile) {
457 return FALSE; 435 return FALSE;
458 } 436 }
459 if (!pBuf || size < 1) { 437 if (!pBuf || size < 1) {
460 return TRUE; 438 return TRUE;
461 } 439 }
462 return m_pFile->WriteBlock(pBuf, size); 440 return m_pFile->WriteBlock(pBuf, size);
463 } 441 }
OLDNEW
« no previous file with comments | « core/src/fxcodec/codec/fx_codec_fax.cpp ('k') | fpdfsdk/src/fsdk_baseform.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698