From 067b66dbe8a33b9cd9619d47366accf7c0931c0b Mon Sep 17 00:00:00 2001 From: Ari Date: Fri, 5 Jun 2026 09:31:01 -0400 Subject: [PATCH 01/17] Update flac.c - flac_find_frame returns a 64 bit int The flac_find_frame function was changed to return off_t instead of int --- src/flac.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/flac.c b/src/flac.c index eeeee66..b7e471b 100644 --- a/src/flac.c +++ b/src/flac.c @@ -270,7 +270,7 @@ _flac_parse(PerlIO *infile, char *file, HV *info, HV *tags, uint8_t seeking) // offset is in ms, does sample-accurate seeking, using seektable if available // based on libFLAC seek_to_absolute_sample_ -static int +static off_t flac_find_frame(PerlIO *infile, char *file, int offset) { off_t frame_offset = -1; From abc75a715b19c9aa2672dacd8f3168af94ebd094 Mon Sep 17 00:00:00 2001 From: Ari Date: Fri, 5 Jun 2026 09:34:00 -0400 Subject: [PATCH 02/17] Update Scan.xs --- Scan.xs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Scan.xs b/Scan.xs index ee415b1..c548884 100644 --- a/Scan.xs +++ b/Scan.xs @@ -56,7 +56,7 @@ typedef struct { char* type; int (*get_tags)(PerlIO *infile, char *file, HV *info, HV *tags); int (*get_fileinfo)(PerlIO *infile, char *file, HV *tags); - int (*find_frame)(PerlIO *infile, char *file, int offset); + off_t (*find_frame)(PerlIO *infile, char *file, int offset); int (*find_frame_return_info)(PerlIO *infile, char *file, int offset, HV *info); } taghandler; From 286482c55eede7778d1b244a200e542dae495520 Mon Sep 17 00:00:00 2001 From: Ari Date: Fri, 5 Jun 2026 10:14:10 -0400 Subject: [PATCH 03/17] Update Scan.xs - change return type of _find_frame 64-bit return type to prevent 32-bit overflow with large flac files --- Scan.xs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Scan.xs b/Scan.xs index c548884..c03fa8c 100644 --- a/Scan.xs +++ b/Scan.xs @@ -268,7 +268,7 @@ CODE: OUTPUT: RETVAL -int +off_t _find_frame( char *dummy, char *suffix, PerlIO *infile, SV *path, int offset ) CODE: { From 8a6e0f71eedaf3623daac82ad0d1c570c9f09b06 Mon Sep 17 00:00:00 2001 From: Ari Date: Fri, 5 Jun 2026 12:49:08 -0400 Subject: [PATCH 04/17] Update mp3.c - return 64 bits for mp3_find_frame Fixes the 32b rollover in files of more than 2GB --- src/mp3.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mp3.c b/src/mp3.c index 934f05f..8c8e097 100644 --- a/src/mp3.c +++ b/src/mp3.c @@ -903,7 +903,7 @@ _mp3_parse(PerlIO *infile, char *file, HV *info) return mp3; } -int +off_t mp3_find_frame(PerlIO *infile, char *file, int offset) { Buffer mp3_buf; From 868d5849668a193f620afdfc0687b54efc61c91c Mon Sep 17 00:00:00 2001 From: Ari Date: Fri, 5 Jun 2026 12:51:24 -0400 Subject: [PATCH 05/17] Update ogg.c - support 64b for the return value of off_find_frame Fixes support for files of more than 2GB --- src/ogg.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ogg.c b/src/ogg.c index f03c3a1..9bcc3f3 100644 --- a/src/ogg.c +++ b/src/ogg.c @@ -500,7 +500,7 @@ _parse_vorbis_comments(PerlIO *infile, Buffer *vorbis_buf, HV *tags, int has_fra } } -static int +static off_t ogg_find_frame(PerlIO *infile, char *file, int offset) { int frame_offset = -1; From a8bf763fa8ee7316568cc0185647cd1763a249dd Mon Sep 17 00:00:00 2001 From: Ari Date: Fri, 5 Jun 2026 12:53:01 -0400 Subject: [PATCH 06/17] Update opus.c - 64b return type for opus_find_frame Fixes support for files of > 2GB, prevents 32b rollover --- src/opus.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/opus.c b/src/opus.c index 778284b..2354b1d 100644 --- a/src/opus.c +++ b/src/opus.c @@ -349,7 +349,7 @@ _opus_parse(PerlIO *infile, char *file, HV *info, HV *tags, uint8_t seeking) return 0; } -static int +static off_t opus_find_frame(PerlIO *infile, char *file, int offset) { int frame_offset = -1; From 7f412d430114f8c69c5f20c31bedccb2b1d743fd Mon Sep 17 00:00:00 2001 From: Ari Date: Fri, 5 Jun 2026 12:54:25 -0400 Subject: [PATCH 07/17] Update asf.c - 64b return type for asf_find_frame Fixes support for files of > 2GB, prevents 32b counter rollover --- src/asf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/asf.c b/src/asf.c index 216eac9..047e690 100644 --- a/src/asf.c +++ b/src/asf.c @@ -1495,7 +1495,7 @@ _parse_picture(asfinfo *asf, uint32_t picture_offset) // offset is in ms // Based on some code from Rockbox -int +off_t asf_find_frame(PerlIO *infile, char *file, int time_offset) { int frame_offset = -1; From 55f35fa608edd1e6553df7dd645c2a1e9e600f05 Mon Sep 17 00:00:00 2001 From: Ari Date: Fri, 5 Jun 2026 12:55:30 -0400 Subject: [PATCH 08/17] Update mp4.c - 64b return type for mp4_find_frame Fixes support for files of more than 2GB --- src/mp4.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mp4.c b/src/mp4.c index c2aa3aa..37985d6 100644 --- a/src/mp4.c +++ b/src/mp4.c @@ -27,7 +27,7 @@ get_mp4tags(PerlIO *infile, char *file, HV *info, HV *tags) } // wrapper to return just the file offset -int +off_t mp4_find_frame(PerlIO *infile, char *file, int offset) { HV *info = newHV(); From 69ecbc2398dc8b3ffeee3982fc10805035480f79 Mon Sep 17 00:00:00 2001 From: Ari Date: Fri, 5 Jun 2026 12:56:49 -0400 Subject: [PATCH 09/17] Update ogf.c - 64b return type for ogf_find_frame fixes support for files > 2GB --- src/ogf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ogf.c b/src/ogf.c index d94e3e8..0c92e78 100644 --- a/src/ogf.c +++ b/src/ogf.c @@ -434,7 +434,7 @@ _ogf_parse(PerlIO *infile, char *file, HV *info, HV *tags, uint8_t seeking) return err; } -int +off_t ogf_find_frame(PerlIO *infile, char *file, int offset) { HV *info = newHV(); From 6aa4f6ec080900b89a93d3d93cd16667597f6021 Mon Sep 17 00:00:00 2001 From: Ari Date: Fri, 5 Jun 2026 13:09:08 -0400 Subject: [PATCH 10/17] Update asf.h - 64b return type for asf_find_frame Fix for support of files > 2GB --- include/asf.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/asf.h b/include/asf.h index 44004af..4eb90bb 100644 --- a/include/asf.h +++ b/include/asf.h @@ -218,5 +218,5 @@ void _parse_content_encryption(asfinfo *asf); void _parse_extended_content_encryption(asfinfo *asf); void _parse_script_command(asfinfo *asf); SV *_parse_picture(asfinfo *asf, uint32_t picture_offset); -int asf_find_frame(PerlIO *infile, char *file, int offset); +off_t asf_find_frame(PerlIO *infile, char *file, int offset); int _timestamp(asfinfo *asf, int offset, int *duration); From 24a273b0a02556dfd2d4621576e59ee0f3c608f7 Mon Sep 17 00:00:00 2001 From: Ari Date: Fri, 5 Jun 2026 13:11:01 -0400 Subject: [PATCH 11/17] Update mp3.h - 64b return type for mp3_find_frame fix support for files > 2GB --- include/mp3.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/mp3.h b/include/mp3.h index 6e7e974..bca182d 100644 --- a/include/mp3.h +++ b/include/mp3.h @@ -225,7 +225,7 @@ static int sample_rate_tbl[ ] = { int get_mp3tags(PerlIO *infile, char *file, HV *info, HV *tags); int get_mp3fileinfo(PerlIO *infile, char *file, HV *info); -int mp3_find_frame(PerlIO *infile, char *file, int offset); +off_t mp3_find_frame(PerlIO *infile, char *file, int offset); mp3info * _mp3_parse(PerlIO *infile, char *file, HV *info); int _decode_mp3_frame(unsigned char *bptr, struct mp3frame *frame); From c20d21a4d910244897abd7c40693a0a2f133f279 Mon Sep 17 00:00:00 2001 From: Ari Date: Fri, 5 Jun 2026 13:11:54 -0400 Subject: [PATCH 12/17] Update mp4.h - 64b return type for mp4_find_frame fix support for files > 2GB --- include/mp4.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/mp4.h b/include/mp4.h index d30e385..e40c772 100644 --- a/include/mp4.h +++ b/include/mp4.h @@ -123,7 +123,7 @@ typedef struct mp4info { } mp4info; static int get_mp4tags(PerlIO *infile, char *file, HV *info, HV *tags); -int mp4_find_frame(PerlIO *infile, char *file, int offset); +off_t mp4_find_frame(PerlIO *infile, char *file, int offset); int mp4_find_frame_return_info(PerlIO *infile, char *file, int offset, HV *info); mp4info * _mp4_parse(PerlIO *infile, char *file, HV *info, HV *tags, uint8_t seeking); From 0d00ecf4900661eb8e95f3a632ab9dda19ee1e80 Mon Sep 17 00:00:00 2001 From: Ari Date: Fri, 5 Jun 2026 13:14:11 -0400 Subject: [PATCH 13/17] Update ogf.h - 64b return type for ogf_find_frame and _ogf_find_frame Fixes support for files > 2GB --- include/ogf.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/ogf.h b/include/ogf.h index 1f7f35f..30fe8f3 100644 --- a/include/ogf.h +++ b/include/ogf.h @@ -16,7 +16,7 @@ int get_ogf_metadata(PerlIO *infile, char *file, HV *info, HV *tags); int ogf_find_frame_return_info(PerlIO *infile, char *file, int offset, HV *info); -int ogf_find_frame(PerlIO *infile, char *file, int offset); +off_t ogf_find_frame(PerlIO *infile, char *file, int offset); static int _ogf_parse(PerlIO *infile, char *file, HV *info, HV *tags, uint8_t seeking); -static int _ogf_find_frame(PerlIO *infile, char *file, int offset, HV *info, HV *tags); +static off_t _ogf_find_frame(PerlIO *infile, char *file, int offset, HV *info, HV *tags); From 3f04d7fd9de9d9a2c86ba41c6e03a305e06b3bd9 Mon Sep 17 00:00:00 2001 From: Ari Date: Fri, 5 Jun 2026 13:15:02 -0400 Subject: [PATCH 14/17] Update ogg.h - 64b return type for ogg_find_frame fixes support of files > 2GB --- include/ogg.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/ogg.h b/include/ogg.h index 0909fd7..653946d 100644 --- a/include/ogg.h +++ b/include/ogg.h @@ -20,6 +20,6 @@ int get_ogg_metadata(PerlIO *infile, char *file, HV *info, HV *tags); int _ogg_parse(PerlIO *infile, char *file, HV *info, HV *tags, uint8_t seeking); -static int ogg_find_frame(PerlIO *infile, char *file, int offset); +static off_t ogg_find_frame(PerlIO *infile, char *file, int offset); void _parse_vorbis_comments(PerlIO *infile, Buffer *vorbis_buf, HV *tags, int has_framing); int _ogg_binary_search_sample(PerlIO *infile, char *file, HV *info, uint64_t target_sample); From 4619a629834229c4c6b99346736161e1924d5adc Mon Sep 17 00:00:00 2001 From: Ari Date: Fri, 5 Jun 2026 13:15:57 -0400 Subject: [PATCH 15/17] Update opus.h - 64b return type for opus_find_frame fixes support for files > 2GB --- include/opus.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/opus.h b/include/opus.h index b878ff9..820283d 100644 --- a/include/opus.h +++ b/include/opus.h @@ -18,6 +18,6 @@ int get_opus_metadata(PerlIO *infile, char *file, HV *info, HV *tags); int _opus_parse(PerlIO *infile, char *file, HV *info, HV *tags, uint8_t seeking); -static int opus_find_frame(PerlIO *infile, char *file, int offset); +static off_t opus_find_frame(PerlIO *infile, char *file, int offset); void _parse_vorbis_comments(PerlIO *infile, Buffer *vorbis_buf, HV *tags, int has_framing); int _opus_binary_search_sample(PerlIO *infile, char *file, HV *info, uint64_t target_sample); From 8b24a2b23bf9566064d7827dd70bee75bc1c3972 Mon Sep 17 00:00:00 2001 From: Ari Date: Fri, 5 Jun 2026 14:50:37 -0400 Subject: [PATCH 16/17] Update Scan.xs - change type to IV of _find_frame Perl-native 64b; off_t does not apply here (that is only for C code) --- Scan.xs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Scan.xs b/Scan.xs index c03fa8c..afa69b6 100644 --- a/Scan.xs +++ b/Scan.xs @@ -268,7 +268,7 @@ CODE: OUTPUT: RETVAL -off_t +IV _find_frame( char *dummy, char *suffix, PerlIO *infile, SV *path, int offset ) CODE: { From fdf94bcc859fb609c817c330d3af77ae23525ff4 Mon Sep 17 00:00:00 2001 From: Ari Date: Fri, 5 Jun 2026 15:31:26 -0400 Subject: [PATCH 17/17] Update ogf.c - 64b return type in _ogf_find_frame was missing Fix for files > 2GB --- src/ogf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ogf.c b/src/ogf.c index 0c92e78..2681f57 100644 --- a/src/ogf.c +++ b/src/ogf.c @@ -455,7 +455,7 @@ ogf_find_frame(PerlIO *infile, char *file, int offset) return frame_offset; } -static int +static off_t _ogf_find_frame(PerlIO *infile, char *file, int offset, HV *info, HV *tags) { int frame_offset = -1;