1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 16:17:45 +00:00

LibLine: Fix Shell crashing (due to write() EFAULT) on <tab><tab>

Use a StringBuilder instead of blindly passing a bunch of potentially
empty/null strings to the kernel. StringBuilder is more lenient and
generally more pleasant to use anyway.
This commit is contained in:
Andreas Kling 2020-04-01 11:24:10 +02:00
parent 9ba9bba529
commit 296f87fa7f

View file

@ -25,10 +25,10 @@
*/ */
#include "Editor.h" #include "Editor.h"
#include <AK/StringBuilder.h>
#include <ctype.h> #include <ctype.h>
#include <stdio.h> #include <stdio.h>
#include <sys/ioctl.h> #include <sys/ioctl.h>
#include <sys/uio.h>
#include <unistd.h> #include <unistd.h>
namespace Line { namespace Line {
@ -323,16 +323,14 @@ String Editor::get_line(const String& prompt)
num_printed += fprintf(stderr, "%-*s", static_cast<int>(longest_suggestion_length) + 2, suggestion.characters()); num_printed += fprintf(stderr, "%-*s", static_cast<int>(longest_suggestion_length) + 2, suggestion.characters());
} }
putchar('\n'); StringBuilder builder;
struct iovec iov[] = { builder.append('\n');
{ const_cast<char*>(prompt.characters()), prompt.length() }, builder.append(prompt);
{ m_buffer.data(), m_cursor }, builder.append(m_buffer.data(), m_cursor);
{ m_buffer.data() + m_cursor, m_buffer.size() - m_cursor } builder.append(m_buffer.data() + m_cursor, m_buffer.size() - m_cursor);
}; fputs(builder.to_string().characters(), stdout);
if (writev(STDOUT_FILENO, iov, 3)) { fflush(stdout);
perror("writev");
ASSERT_NOT_REACHED();
}
m_cursor = m_buffer.size(); m_cursor = m_buffer.size();
} }