Mail: fix memory leak on realloc
Fixes #9873 Change-Id: I274fc61359c34ada1088994f65f3d3c762297176 Reviewed-on: https://review.haiku-os.org/c/haiku/+/2069 Reviewed-by: Jérôme Duval <[email protected]>
This commit is contained in:
committed by
waddlesplash
parent
30de32ecb1
commit
c039c51d77
@@ -1039,12 +1039,20 @@ TTextView::KeyDown(const char *key, int32 count)
|
|||||||
end++;
|
end++;
|
||||||
Select(start, end);
|
Select(start, end);
|
||||||
if (fYankBuffer) {
|
if (fYankBuffer) {
|
||||||
fYankBuffer = (char *)realloc(fYankBuffer,
|
char *result = (char *)realloc(fYankBuffer,
|
||||||
strlen(fYankBuffer) + (end - start) + 1);
|
strlen(fYankBuffer) + (end - start) + 1);
|
||||||
|
if (result == NULL) {
|
||||||
|
free(fYankBuffer);
|
||||||
|
fYankBuffer = NULL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
fYankBuffer = result;
|
||||||
GetText(start, end - start,
|
GetText(start, end - start,
|
||||||
&fYankBuffer[strlen(fYankBuffer)]);
|
&fYankBuffer[strlen(fYankBuffer)]);
|
||||||
} else {
|
} else {
|
||||||
fYankBuffer = (char *)malloc(end - start + 1);
|
fYankBuffer = (char *)malloc(end - start + 1);
|
||||||
|
if (fYankBuffer == NULL)
|
||||||
|
break;
|
||||||
GetText(start, end - start, fYankBuffer);
|
GetText(start, end - start, fYankBuffer);
|
||||||
}
|
}
|
||||||
Delete();
|
Delete();
|
||||||
@@ -2469,8 +2477,9 @@ TTextView::Reader::Run(void *_this)
|
|||||||
eol += 2; // CR+LF belong to the line
|
eol += 2; // CR+LF belong to the line
|
||||||
size_t length = eol - header;
|
size_t length = eol - header;
|
||||||
|
|
||||||
buffer = (char *)realloc(buffer, length + 1);
|
free(buffer);
|
||||||
if (buffer == NULL)
|
buffer = (char *)malloc(buffer, length + 1);
|
||||||
|
if (buffer == NULL)
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
memcpy(buffer, header, length);
|
memcpy(buffer, header, length);
|
||||||
@@ -3092,17 +3101,14 @@ TTextView::AddQuote(int32 start, int32 finish)
|
|||||||
// add quote to this line
|
// add quote to this line
|
||||||
int32 lineLength = index - lastLine + 1;
|
int32 lineLength = index - lastLine + 1;
|
||||||
|
|
||||||
char* newTarget = (char *)realloc(target,
|
char* result = (char *)realloc(target,
|
||||||
targetLength + lineLength + quoteLength);
|
targetLength + lineLength + quoteLength);
|
||||||
if (newTarget == NULL) {
|
if (result == NULL) {
|
||||||
// free the old buffer
|
|
||||||
free(target);
|
free(target);
|
||||||
target = NULL;
|
|
||||||
free(text);
|
free(text);
|
||||||
return;
|
return;
|
||||||
} else {
|
|
||||||
target = newTarget;
|
|
||||||
}
|
}
|
||||||
|
target = result;
|
||||||
|
|
||||||
// copy the quote sign
|
// copy the quote sign
|
||||||
memcpy(&target[targetLength], QUOTE, quoteLength);
|
memcpy(&target[targetLength], QUOTE, quoteLength);
|
||||||
|
|||||||
Reference in New Issue
Block a user