Skip to content

Commit c70b8a9

Browse files
committed
Return an invalid string (not a partial one) when operator+() fails.
1 parent 30a823f commit c70b8a9

File tree

2 files changed

+28
-26
lines changed

2 files changed

+28
-26
lines changed

hardware/arduino/cores/arduino/WString.cpp

Lines changed: 27 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,13 @@ inline void String::init(void)
112112
flags = 0;
113113
}
114114

115+
void String::invalidate(void)
116+
{
117+
if (buffer) free(buffer);
118+
buffer = NULL;
119+
capacity = len = 0;
120+
}
121+
115122
unsigned char String::reserve(unsigned int size)
116123
{
117124
if (buffer && capacity >= size) return 1;
@@ -140,11 +147,7 @@ unsigned char String::changeBuffer(unsigned int maxStrLen)
140147
String & String::copy(const char *cstr, unsigned int length)
141148
{
142149
if (!reserve(length)) {
143-
if (buffer) {
144-
free(buffer);
145-
buffer = NULL;
146-
}
147-
len = capacity = 0;
150+
invalidate();
148151
return *this;
149152
}
150153
len = length;
@@ -177,7 +180,11 @@ void String::move(String &rhs)
177180
String & String::operator = (const String &rhs)
178181
{
179182
if (this == &rhs) return *this;
180-
return copy(rhs.buffer, rhs.len);
183+
184+
if (rhs.buffer) copy(rhs.buffer, rhs.len);
185+
else invalidate();
186+
187+
return *this;
181188
}
182189

183190
#ifdef __GXX_EXPERIMENTAL_CXX0X__
@@ -196,16 +203,9 @@ String & String::operator = (StringSumHelper &&rval)
196203

197204
String & String::operator = (const char *cstr)
198205
{
199-
if (cstr) {
200-
copy(cstr, strlen(cstr));
201-
} else {
202-
if (buffer) {
203-
free(buffer);
204-
capacity = 0;
205-
buffer = NULL;
206-
}
207-
len = 0;
208-
}
206+
if (cstr) copy(cstr, strlen(cstr));
207+
else invalidate();
208+
209209
return *this;
210210
}
211211

@@ -229,7 +229,8 @@ unsigned char String::concat(const String &s)
229229
unsigned char String::concat(const char *cstr, unsigned int length)
230230
{
231231
unsigned int newlen = len + length;
232-
if (!cstr || length == 0) return 1; // nothing to append = success
232+
if (!cstr) return 0;
233+
if (length == 0) return 1;
233234
if (!reserve(newlen)) return 0;
234235
strcpy(buffer + len, cstr);
235236
len = newlen;
@@ -238,7 +239,7 @@ unsigned char String::concat(const char *cstr, unsigned int length)
238239

239240
unsigned char String::concat(const char *cstr)
240241
{
241-
if (!cstr) return 1; // nothing to append = success
242+
if (!cstr) return 0;
242243
return concat(cstr, strlen(cstr));
243244
}
244245

@@ -285,56 +286,56 @@ unsigned char String::concat(unsigned long num)
285286
StringSumHelper & operator + (const StringSumHelper &lhs, const String &rhs)
286287
{
287288
StringSumHelper &a = const_cast<StringSumHelper&>(lhs);
288-
a.concat(rhs.buffer, rhs.len);
289+
if (!a.concat(rhs.buffer, rhs.len)) a.invalidate();
289290
return a;
290291
}
291292

292293
StringSumHelper & operator + (const StringSumHelper &lhs, const char *cstr)
293294
{
294295
StringSumHelper &a = const_cast<StringSumHelper&>(lhs);
295-
if (cstr) a.concat(cstr, strlen(cstr));
296+
if (!cstr || !a.concat(cstr, strlen(cstr))) a.invalidate();
296297
return a;
297298
}
298299

299300
StringSumHelper & operator + (const StringSumHelper &lhs, char c)
300301
{
301302
StringSumHelper &a = const_cast<StringSumHelper&>(lhs);
302-
a.concat(c);
303+
if (!a.concat(c)) a.invalidate();
303304
return a;
304305
}
305306

306307
StringSumHelper & operator + (const StringSumHelper &lhs, unsigned char c)
307308
{
308309
StringSumHelper &a = const_cast<StringSumHelper&>(lhs);
309-
a.concat(c);
310+
if (!a.concat(c)) a.invalidate();
310311
return a;
311312
}
312313

313314
StringSumHelper & operator + (const StringSumHelper &lhs, int num)
314315
{
315316
StringSumHelper &a = const_cast<StringSumHelper&>(lhs);
316-
a.concat(num);
317+
if (!a.concat(num)) a.invalidate();
317318
return a;
318319
}
319320

320321
StringSumHelper & operator + (const StringSumHelper &lhs, unsigned int num)
321322
{
322323
StringSumHelper &a = const_cast<StringSumHelper&>(lhs);
323-
a.concat(num);
324+
if (!a.concat(num)) a.invalidate();
324325
return a;
325326
}
326327

327328
StringSumHelper & operator + (const StringSumHelper &lhs, long num)
328329
{
329330
StringSumHelper &a = const_cast<StringSumHelper&>(lhs);
330-
a.concat(num);
331+
if (!a.concat(num)) a.invalidate();
331332
return a;
332333
}
333334

334335
StringSumHelper & operator + (const StringSumHelper &lhs, unsigned long num)
335336
{
336337
StringSumHelper &a = const_cast<StringSumHelper&>(lhs);
337-
a.concat(num);
338+
if (!a.concat(num)) a.invalidate();
338339
return a;
339340
}
340341

hardware/arduino/cores/arduino/WString.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,7 @@ class String
153153
unsigned char flags; // unused, for future features
154154
protected:
155155
void init(void);
156+
void invalidate(void);
156157
unsigned char changeBuffer(unsigned int maxStrLen);
157158
unsigned char concat(const char *cstr, unsigned int length);
158159

0 commit comments

Comments
 (0)