use response arena rather than db allocator for responses
This commit is contained in:
parent
61efcae568
commit
a09088ebff
1 changed files with 11 additions and 6 deletions
17
src/main.zig
17
src/main.zig
|
|
@ -130,7 +130,7 @@ pub fn main() !u8 {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
fn indexHandler(db: *root.NotmuchDb, _: *httpz.Request, res: *httpz.Response) !void {
|
fn indexHandler(_: *root.NotmuchDb, _: *httpz.Request, res: *httpz.Response) !void {
|
||||||
const file = std.fs.cwd().openFile("static/index.html", .{}) catch {
|
const file = std.fs.cwd().openFile("static/index.html", .{}) catch {
|
||||||
res.status = 500;
|
res.status = 500;
|
||||||
res.body = "Error loading index.html";
|
res.body = "Error loading index.html";
|
||||||
|
|
@ -138,7 +138,7 @@ fn indexHandler(db: *root.NotmuchDb, _: *httpz.Request, res: *httpz.Response) !v
|
||||||
};
|
};
|
||||||
defer file.close();
|
defer file.close();
|
||||||
|
|
||||||
const content = file.readToEndAlloc(db.allocator, 1024 * 1024) catch {
|
const content = file.readToEndAlloc(res.arena, 1024 * 1024) catch {
|
||||||
res.status = 500;
|
res.status = 500;
|
||||||
res.body = "Error reading index.html";
|
res.body = "Error reading index.html";
|
||||||
return;
|
return;
|
||||||
|
|
@ -149,7 +149,7 @@ fn indexHandler(db: *root.NotmuchDb, _: *httpz.Request, res: *httpz.Response) !v
|
||||||
res.body = content;
|
res.body = content;
|
||||||
}
|
}
|
||||||
|
|
||||||
fn staticHandler(db: *root.NotmuchDb, req: *httpz.Request, res: *httpz.Response) !void {
|
fn staticHandler(_: *root.NotmuchDb, req: *httpz.Request, res: *httpz.Response) !void {
|
||||||
const path = req.url.path;
|
const path = req.url.path;
|
||||||
|
|
||||||
const file_path = if (std.mem.eql(u8, path, "/style.css"))
|
const file_path = if (std.mem.eql(u8, path, "/style.css"))
|
||||||
|
|
@ -169,7 +169,7 @@ fn staticHandler(db: *root.NotmuchDb, req: *httpz.Request, res: *httpz.Response)
|
||||||
};
|
};
|
||||||
defer file.close();
|
defer file.close();
|
||||||
|
|
||||||
const content = file.readToEndAlloc(db.allocator, 1024 * 1024) catch {
|
const content = file.readToEndAlloc(res.arena, 1024 * 1024) catch {
|
||||||
res.status = 500;
|
res.status = 500;
|
||||||
res.body = "Error reading file";
|
res.body = "Error reading file";
|
||||||
return;
|
return;
|
||||||
|
|
@ -345,8 +345,13 @@ fn attachmentHandler(db: *root.NotmuchDb, req: *httpz.Request, res: *httpz.Respo
|
||||||
}
|
}
|
||||||
|
|
||||||
const att = msg.attachments[num];
|
const att = msg.attachments[num];
|
||||||
res.header("Content-Type", att.content_type);
|
// httpz stores header values by reference and serializes them after this
|
||||||
res.header("Content-Disposition", try std.fmt.allocPrint(db.allocator, "attachment; filename=\"{s}\"", .{att.filename}));
|
// handler returns -- i.e. after `defer msg.deinit` has freed att.* and
|
||||||
|
// without ever freeing anything allocated here. Copy both values into the
|
||||||
|
// per-request arena (reset by httpz after the response is written) to avoid
|
||||||
|
// a use-after-free on Content-Type and a leak on Content-Disposition.
|
||||||
|
res.header("Content-Type", try res.arena.dupe(u8, att.content_type));
|
||||||
|
res.header("Content-Disposition", try std.fmt.allocPrint(res.arena, "attachment; filename=\"{s}\"", .{att.filename}));
|
||||||
|
|
||||||
// TODO: Actually retrieve and send attachment content
|
// TODO: Actually retrieve and send attachment content
|
||||||
// For now, just send metadata
|
// For now, just send metadata
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue