wayland: Move buffer copy into mime_data_list_add()

It makes it clearer who owns the memory, and more reasonable to free it on
failure in the creating function.

(and, of course, pacifies static analysis.)
This commit is contained in:
Ryan C. Gordon 2020-05-28 14:57:10 -04:00
parent 22da9d4d77
commit ce7ae4ec8d
1 changed files with 13 additions and 14 deletions

View File

@ -185,8 +185,16 @@ mime_data_list_add(struct wl_list* list,
{ {
int status = 0; int status = 0;
size_t mime_type_length = 0; size_t mime_type_length = 0;
SDL_MimeDataList *mime_data = NULL; SDL_MimeDataList *mime_data = NULL;
void *internal_buffer = NULL;
if (buffer != NULL) {
internal_buffer = SDL_malloc(length);
if (internal_buffer == NULL) {
return SDL_OutOfMemory();
}
SDL_memcpy(internal_buffer, buffer, length);
}
mime_data = mime_data_list_find(list, mime_type); mime_data = mime_data_list_find(list, mime_type);
@ -211,8 +219,10 @@ mime_data_list_add(struct wl_list* list,
if (mime_data->data != NULL) { if (mime_data->data != NULL) {
SDL_free(mime_data->data); SDL_free(mime_data->data);
} }
mime_data->data = buffer; mime_data->data = internal_buffer;
mime_data->length = length; mime_data->length = length;
} else {
SDL_free(internal_buffer);
} }
return status; return status;
@ -264,18 +274,7 @@ int Wayland_data_source_add_data(SDL_WaylandDataSource *source,
const void *buffer, const void *buffer,
size_t length) size_t length)
{ {
int status = 0; return mime_data_list_add(&source->mimes, mime_type, buffer, length);
if (length > 0) {
void *internal_buffer = SDL_malloc(length);
if (internal_buffer == NULL) {
status = SDL_OutOfMemory();
} else {
SDL_memcpy(internal_buffer, buffer, length);
status = mime_data_list_add(&source->mimes, mime_type,
internal_buffer, length);
}
}
return status;
} }
SDL_bool SDL_bool