瀏覽代碼

LibLine: Fix writing to temporary file in ^X^E handler

I have no idea how this _ever_ worked, and I also have no idea why past
me didn't use FileStream to begin with.
Fixes the issue where lots of junk data would be written to the temp
file, causing the external editor to crash.
Ali Mohammad Pur 4 年之前
父節點
當前提交
6783f65d5a
共有 1 個文件被更改,包括 8 次插入7 次删除
  1. 8 7
      Userland/Libraries/LibLine/InternalFunctions.cpp

+ 8 - 7
Userland/Libraries/LibLine/InternalFunctions.cpp

@@ -4,6 +4,7 @@
  * SPDX-License-Identifier: BSD-2-Clause
  * SPDX-License-Identifier: BSD-2-Clause
  */
  */
 
 
+#include <AK/FileStream.h>
 #include <AK/ScopeGuard.h>
 #include <AK/ScopeGuard.h>
 #include <AK/ScopedValueRollback.h>
 #include <AK/ScopedValueRollback.h>
 #include <AK/StringBuilder.h>
 #include <AK/StringBuilder.h>
@@ -527,15 +528,15 @@ void Editor::edit_in_external_editor()
             return;
             return;
         }
         }
 
 
+        OutputFileStream stream { fp };
+
         StringBuilder builder;
         StringBuilder builder;
         builder.append(Utf32View { m_buffer.data(), m_buffer.size() });
         builder.append(Utf32View { m_buffer.data(), m_buffer.size() });
-        auto view = builder.string_view();
-        size_t remaining_size = view.length();
-
-        while (remaining_size > 0)
-            remaining_size = fwrite(view.characters_without_null_termination() - remaining_size, sizeof(char), remaining_size, fp);
-
-        fclose(fp);
+        auto bytes = builder.string_view().bytes();
+        while (!bytes.is_empty()) {
+            auto nwritten = stream.write(bytes);
+            bytes = bytes.slice(nwritten);
+        }
     }
     }
 
 
     ScopeGuard remove_temp_file_guard {
     ScopeGuard remove_temp_file_guard {