diff -up libsndfile-1.0.28/src/ogg.c.cve-2024-50612prereq libsndfile-1.0.28/src/ogg.c --- libsndfile-1.0.28/src/ogg.c.cve-2024-50612prereq 2017-04-01 09:18:02.000000000 +0200 +++ libsndfile-1.0.28/src/ogg.c 2024-11-26 15:06:33.595446443 +0100 @@ -45,6 +45,16 @@ static int ogg_stream_classify (SF_PRIVA static int ogg_page_classify (SF_PRIVATE * psf, const ogg_page * og) ; int +ogg_write_page (SF_PRIVATE *psf, ogg_page *page) +{ int bytes ; + + bytes = psf_fwrite (page->header, 1, page->header_len, psf) ; + bytes += psf_fwrite (page->body, 1, page->body_len, psf) ; + + return bytes == page->header_len + page->body_len ; +} /* ogg_write_page */ + +int ogg_open (SF_PRIVATE *psf) { OGG_PRIVATE* odata = calloc (1, sizeof (OGG_PRIVATE)) ; sf_count_t pos = psf_ftell (psf) ; diff -up libsndfile-1.0.28/src/ogg.h.cve-2024-50612prereq libsndfile-1.0.28/src/ogg.h --- libsndfile-1.0.28/src/ogg.h.cve-2024-50612prereq 2024-11-26 15:06:45.023560621 +0100 +++ libsndfile-1.0.28/src/ogg.h 2024-11-26 15:06:57.731687587 +0100 @@ -48,5 +48,10 @@ typedef struct (buf [base] & 0xff)) +/* +** Write the whole Ogg page out. Convenience function as the ogg_page struct +** splits header and body data into separate buffers. +*/ +int ogg_write_page (SF_PRIVATE *, ogg_page *) ; #endif /* SF_SRC_OGG_H */ diff -up libsndfile-1.0.28/src/ogg_vorbis.c.cve-2024-50612prereq libsndfile-1.0.28/src/ogg_vorbis.c --- libsndfile-1.0.28/src/ogg_vorbis.c.cve-2024-50612prereq 2017-04-01 09:18:02.000000000 +0200 +++ libsndfile-1.0.28/src/ogg_vorbis.c 2024-11-26 15:06:33.595446443 +0100 @@ -423,8 +423,7 @@ vorbis_write_header (SF_PRIVATE *psf, in * audio data will start on a new page, as per spec */ while ((result = ogg_stream_flush (&odata->ostream, &odata->opage)) != 0) - { psf_fwrite (odata->opage.header, 1, odata->opage.header_len, psf) ; - psf_fwrite (odata->opage.body, 1, odata->opage.body_len, psf) ; + { ogg_write_page (psf, &odata->opage) ; } ; } @@ -463,8 +462,7 @@ vorbis_close (SF_PRIVATE *psf) while (!odata->eos) { int result = ogg_stream_pageout (&odata->ostream, &odata->opage) ; if (result == 0) break ; - psf_fwrite (odata->opage.header, 1, odata->opage.header_len, psf) ; - psf_fwrite (odata->opage.body, 1, odata->opage.body_len, psf) ; + ogg_write_page (psf, &odata->opage) ; /* this could be set above, but for illustrative purposes, I do it here (to show that vorbis does know where the stream ends) */ @@ -778,8 +776,7 @@ vorbis_write_samples (SF_PRIVATE *psf, O { int result = ogg_stream_pageout (&odata->ostream, &odata->opage) ; if (result == 0) break ; - psf_fwrite (odata->opage.header, 1, odata->opage.header_len, psf) ; - psf_fwrite (odata->opage.body, 1, odata->opage.body_len, psf) ; + ogg_write_page (psf, &odata->opage) ; /* This could be set above, but for illustrative purposes, I do ** it here (to show that vorbis does know where the stream ends) */