From 9df8f9ea12f14bced8fc220fb6f4827e6cce39e4 Mon Sep 17 00:00:00 2001 From: mitteneer Date: Sun, 27 Apr 2025 10:41:42 -0400 Subject: [PATCH] Fix segfault in applyScrobbleRule Thanks bob :) --- src/app/jobs/process_rule.zig | 1 - src/app/views/upload.zig | 16 +++++++++++----- src/apply_rule.zig | 16 +++++++++------- 3 files changed, 20 insertions(+), 13 deletions(-) diff --git a/src/app/jobs/process_rule.zig b/src/app/jobs/process_rule.zig index 217826a..ef0fc09 100644 --- a/src/app/jobs/process_rule.zig +++ b/src/app/jobs/process_rule.zig @@ -32,7 +32,6 @@ pub fn run(allocator: std.mem.Allocator, params: *jetzig.data.Value, env: jetzig }; var rules = std.ArrayList(Data.Rule).init(allocator); - defer rules.deinit(); const file_content = try file_read.readToEndAlloc(allocator, 16_000_000); file_read.close(); diff --git a/src/app/views/upload.zig b/src/app/views/upload.zig index 98f0009..59442a8 100644 --- a/src/app/views/upload.zig +++ b/src/app/views/upload.zig @@ -38,8 +38,8 @@ pub fn post(request: *jetzig.Request) !jetzig.View { }); defer rule_file.close(); - const file_content = try rule_file.readToEndAlloc(request.allocator, 16_000_000); - const rule_list = std.json.parseFromSliceLeaky(Data.Rules, request.allocator, file_content, .{}) catch null; + const rule_file_content = try rule_file.readToEndAlloc(request.allocator, 16_000_000); + const rule_list = std.json.parseFromSliceLeaky(Data.Rules, request.allocator, rule_file_content, .{}) catch null; switch (source) { 0 => { @@ -51,7 +51,7 @@ pub fn post(request: *jetzig.Request) !jetzig.View { if ((before_limiter or after_limiter) and (scrobble.date > before_limiting_date or scrobble.date < after_limiting_date)) continue :appends; const formatted_scrobble = if (rule_list) |rl| - rules.applyScrobbleRule(request.allocator, scrobble, rl) + try rules.applyScrobbleRule(request.allocator, scrobble, rl) else Data.Scrobble{ .album = scrobble.album, @@ -107,9 +107,15 @@ pub fn post(request: *jetzig.Request) !jetzig.View { continue :appends; } - const pre_formatted_scrobble: Data.ImportedScrobble = .{ .track = scrobble.master_metadata_track_name.?, .album = scrobble.master_metadata_album_album_name.?, .artist = scrobble.master_metadata_album_artist_name.?, .date = (try zeit.instant(.{ .source = .{ .iso8601 = scrobble.ts } })).unixTimestamp() * 1000 }; + const pre_formatted_scrobble: Data.ImportedScrobble = .{ + .track = scrobble.master_metadata_track_name.?, + .album = scrobble.master_metadata_album_album_name.?, + .artist = scrobble.master_metadata_album_artist_name.?, + .date = (try zeit.instant(.{ .source = .{ .iso8601 = scrobble.ts } })).unixTimestamp() * 1000, + }; + const formatted_scrobble = if (rule_list) |rl| - rules.applyScrobbleRule(request.allocator, pre_formatted_scrobble, rl) + try rules.applyScrobbleRule(request.allocator, pre_formatted_scrobble, rl) else Data.Scrobble{ .album = pre_formatted_scrobble.album, diff --git a/src/apply_rule.zig b/src/apply_rule.zig index c63ad4a..6c03b38 100644 --- a/src/apply_rule.zig +++ b/src/apply_rule.zig @@ -11,12 +11,14 @@ fn eqlWrapper(haystack: []const u8, needle: []const u8) bool { return std.mem.eql(u8, haystack, needle); } -pub fn applyScrobbleRule(allocator: std.mem.Allocator, scrobble: Data.ImportedScrobble, rules: Rules) Data.Scrobble { +pub fn applyScrobbleRule(allocator: std.mem.Allocator, scrobble: Data.ImportedScrobble, rules: Rules) !Data.Scrobble { + const artists = try allocator.alloc([]const u8, 1); + artists[0] = scrobble.artist; var output_scrobble = Data.Scrobble{ .track = scrobble.track, - .artists_track = &[_][]const u8{scrobble.artist}, + .artists_track = artists, .album = scrobble.album, - .artists_album = &[_][]const u8{scrobble.artist}, + .artists_album = artists, .date = scrobble.date, }; @@ -47,10 +49,10 @@ pub fn applyScrobbleRule(allocator: std.mem.Allocator, scrobble: Data.ImportedSc switch (act.action_on) { .album, .track => unreachable, inline else => |on| { - // I have decided an error won't happen :) - al.appendSlice(@field(output_scrobble, @tagName(on))) catch unreachable; - al.append(act.action_txt) catch unreachable; - @field(output_scrobble, @tagName(on)) = al.items; + try al.appendSlice(@field(output_scrobble, @tagName(on))); + try al.append(act.action_txt); + const list = try al.toOwnedSlice(); + @field(output_scrobble, @tagName(on)) = list; }, //else => { // std.log.debug("Adding artists doesn't work yet", .{});