diff --git a/glfw/input.c b/glfw/input.c index 92d575502..8eb696c68 100644 --- a/glfw/input.c +++ b/glfw/input.c @@ -421,15 +421,22 @@ size_t _glfwInputDropEvent(_GLFWwindow *window, GLFWDropEventType type, double x size_t write_pos = 0; for (size_t i = 0; i < num_mimes; i++) { if (mime_dedup_set_is_end(mime_dedup_set_get(&seen, mimes[i]))) { - if (!mime_dedup_set_is_end(mime_dedup_set_insert(&seen, mimes[i]))) - mimes[write_pos++] = mimes[i]; - else { - // OOM: keep remaining entries without further deduplication - mimes[write_pos++] = mimes[i]; - for (size_t j = i + 1; j < num_mimes; j++) mimes[write_pos++] = mimes[j]; + if (mime_dedup_set_is_end(mime_dedup_set_insert(&seen, mimes[i]))) { + // OOM: shift remaining entries to write_pos and stop deduplicating + memmove(mimes + write_pos, mimes + i, (num_mimes - i) * sizeof(const char*)); + write_pos += num_mimes - i; break; } + // Swap the unique entry into write_pos; the displaced entry moves to + // position i where it will end up at or beyond the new num_mimes. + if (write_pos != i) { + const char *tmp = mimes[write_pos]; + mimes[write_pos] = mimes[i]; + mimes[i] = tmp; + } + write_pos++; } + // duplicate: left in-place; will end up at a position >= new num_mimes } num_mimes = write_pos; mime_dedup_set_cleanup(&seen);