about summary refs log tree commit diff stats
path: root/src/local
diff options
context:
space:
mode:
authorbptato <nincsnevem662@gmail.com>2024-07-20 15:28:35 +0200
committerbptato <nincsnevem662@gmail.com>2024-07-20 15:31:55 +0200
commit7cafa1f5e0f1e83ec5064764284433d64e94cc9f (patch)
tree97e10041df5a6d58a6a7f77538b81d3d1c8a3729 /src/local
parent4183fbf5bc53e4208df443f343f97ab466384e21 (diff)
downloadchawan-7cafa1f5e0f1e83ec5064764284433d64e94cc9f.tar.gz
loader: copy cached items on buffer cloning
This fixes a bug where cloning buffers with images would crash the
browser.
Diffstat (limited to 'src/local')
-rw-r--r--src/local/client.nim3
-rw-r--r--src/local/container.nim3
-rw-r--r--src/local/pager.nim6
3 files changed, 8 insertions, 4 deletions
diff --git a/src/local/client.nim b/src/local/client.nim
index 60910bc8..97390528 100644
--- a/src/local/client.nim
+++ b/src/local/client.nim
@@ -406,7 +406,8 @@ proc acceptBuffers(client: Client) =
     if stream == nil:
       pager.alert("Error: failed to set up buffer")
       continue
-    let key = pager.addLoaderClient(container.process, container.loaderConfig)
+    let key = pager.addLoaderClient(container.process, container.loaderConfig,
+      container.clonedFrom)
     let loader = pager.loader
     stream.withPacketWriter w:
       w.swrite(key)
diff --git a/src/local/container.nim b/src/local/container.nim
index a103e7a8..9dc9d552 100644
--- a/src/local/container.nim
+++ b/src/local/container.nim
@@ -135,6 +135,7 @@ type
     bpos: seq[CursorPosition]
     highlights: seq[Highlight]
     process* {.jsget.}: int
+    clonedFrom*: int
     loadinfo*: string
     lines: SimpleFlexibleGrid
     lineshift: int
@@ -479,6 +480,7 @@ proc newContainer*(config: BufferConfig; loaderConfig: LoaderClientConfig;
     loadinfo: "Connecting to " & request.url.host & "...",
     cacheId: cacheId,
     process: -1,
+    clonedFrom: -1,
     mainConfig: mainConfig,
     flags: flags,
     luctx: luctx,
@@ -515,6 +517,7 @@ proc clone*(container: Container; newurl: URL; loader: FileLoader):
     nc[] = container[]
     nc.url = url
     nc.process = pid
+    nc.clonedFrom = container.process
     nc.flags.incl(cfCloned)
     nc.retry = @[]
     nc.parent = nil
diff --git a/src/local/pager.nim b/src/local/pager.nim
index c77d724b..6430416f 100644
--- a/src/local/pager.nim
+++ b/src/local/pager.nim
@@ -341,10 +341,10 @@ proc genClientKey(pager: Pager): ClientKey =
   pager.devRandom.recvDataLoop(key)
   return key
 
-proc addLoaderClient*(pager: Pager; pid: int; config: LoaderClientConfig):
-    ClientKey =
+proc addLoaderClient*(pager: Pager; pid: int; config: LoaderClientConfig;
+    clonedFrom = -1): ClientKey =
   var key = pager.genClientKey()
-  while unlikely(not pager.loader.addClient(key, pid, config)):
+  while unlikely(not pager.loader.addClient(key, pid, config, clonedFrom)):
     key = pager.genClientKey()
   return key