glfw/input.c: fix dedup to swap duplicates to end instead of overwriting pointers

Agent-Logs-Url: https://github.com/kovidgoyal/kitty/sessions/071dfd57-73e7-4daa-8d35-955bec8b1c4b

Co-authored-by: kovidgoyal <1308621+kovidgoyal@users.noreply.github.com>
This commit is contained in:
copilot-swe-agent[bot]
2026-05-19 02:12:29 +00:00
committed by GitHub
parent 1aaae286a8
commit 9ef08fd865

19
glfw/input.c vendored
View File

@@ -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);