From b1c729d53273c482052dfc99e197463b123e389e Mon Sep 17 00:00:00 2001 From: Tilman Sauerbeck Date: Thu, 17 Aug 2006 17:51:37 +0200 Subject: [PATCH] Sanitized memory allocation scheme. --- ext/vcedit.c | 94 +++++++++++++++++++++------------------------------- 1 file changed, 37 insertions(+), 57 deletions(-) diff --git a/ext/vcedit.c b/ext/vcedit.c index 1aee14c..832f417 100644 --- a/ext/vcedit.c +++ b/ext/vcedit.c @@ -34,11 +34,11 @@ struct vcedit_state_St { int refcount; - ogg_sync_state *oy; - ogg_stream_state *os; + ogg_sync_state oy; + ogg_stream_state os; - vorbis_comment *vc; - vorbis_info *vi; + vorbis_comment vc; + vorbis_info vi; char filename[PATH_MAX]; @@ -58,10 +58,6 @@ struct vcedit_state_St { static void vcedit_state_free (vcedit_state *state) { - free (state->oy); - free (state->os); - free (state->vc); - free (state->vi); free (state->mainbuf); free (state->bookbuf); free (state->vendor); @@ -79,22 +75,6 @@ vcedit_state_init (vcedit_state *state) { state->refcount = 1; - state->oy = malloc (sizeof (ogg_sync_state)); - if (!state->oy) - return false; - - state->os = malloc (sizeof (ogg_stream_state)); - if (!state->os) - return false; - - state->vc = malloc (sizeof (vorbis_comment)); - if (!state->vc) - return false; - - state->vi = malloc (sizeof (vorbis_info)); - if (!state->vi) - return false; - return true; } @@ -123,17 +103,17 @@ vcedit_state_new (const char *filename) vorbis_comment * vcedit_comments (vcedit_state *state) { - return state->opened ? state->vc : NULL; + return state->opened ? &state->vc : NULL; } static void vcedit_clear_internals (vcedit_state *state) { - ogg_stream_clear (state->os); - ogg_sync_clear (state->oy); + ogg_stream_clear (&state->os); + ogg_sync_clear (&state->oy); - vorbis_info_clear (state->vi); - vorbis_comment_clear (state->vc); + vorbis_info_clear (&state->vi); + vorbis_comment_clear (&state->vc); free (state->vendor); state->vendor = NULL; @@ -229,7 +209,7 @@ _blocksize (vcedit_state *s, ogg_packet *p) { int this, ret = 0; - this = vorbis_packet_blocksize (s->vi, p); + this = vorbis_packet_blocksize (&s->vi, p); if (s->prevW) ret = (this + s->prevW) / 4; @@ -245,7 +225,7 @@ _fetch_next_packet (vcedit_state *s, ogg_packet *p, ogg_page *page) char *buffer; int result, bytes; - result = ogg_stream_packetout (s->os, p); + result = ogg_stream_packetout (&s->os, p); if (result > 0) return 1; @@ -253,10 +233,10 @@ _fetch_next_packet (vcedit_state *s, ogg_packet *p, ogg_page *page) if (s->eosin) return 0; - while (ogg_sync_pageout (s->oy, page) <= 0) { - buffer = ogg_sync_buffer (s->oy, CHUNKSIZE); + while (ogg_sync_pageout (&s->oy, page) <= 0) { + buffer = ogg_sync_buffer (&s->oy, CHUNKSIZE); bytes = fread (buffer, 1, CHUNKSIZE, s->in); - ogg_sync_wrote (s->oy, bytes); + ogg_sync_wrote (&s->oy, bytes); if (!bytes) return 0; @@ -270,7 +250,7 @@ _fetch_next_packet (vcedit_state *s, ogg_packet *p, ogg_page *page) return 0; } - ogg_stream_pagein (s->os, page); + ogg_stream_pagein (&s->os, page); return _fetch_next_packet (s, p, page); } @@ -290,20 +270,20 @@ vcedit_open (vcedit_state *state) if (!state->in) return VCEDIT_ERR_OPEN; - ogg_sync_init (state->oy); + ogg_sync_init (&state->oy); while (1) { - buffer = ogg_sync_buffer (state->oy, CHUNKSIZE); + buffer = ogg_sync_buffer (&state->oy, CHUNKSIZE); bytes = fread (buffer, 1, CHUNKSIZE, state->in); - ogg_sync_wrote (state->oy, bytes); + ogg_sync_wrote (&state->oy, bytes); - if (ogg_sync_pageout (state->oy, &og) == 1) + if (ogg_sync_pageout (&state->oy, &og) == 1) break; /* Bail if we don't find data in the first 40 kB */ if (chunks++ >= 10) { - ogg_sync_clear (state->oy); + ogg_sync_clear (&state->oy); return VCEDIT_ERR_INVAL; } @@ -311,21 +291,21 @@ vcedit_open (vcedit_state *state) state->serial = ogg_page_serialno (&og); - ogg_stream_init (state->os, state->serial); - vorbis_info_init (state->vi); - vorbis_comment_init (state->vc); + ogg_stream_init (&state->os, state->serial); + vorbis_info_init (&state->vi); + vorbis_comment_init (&state->vc); - if (ogg_stream_pagein (state->os, &og) < 0) { + if (ogg_stream_pagein (&state->os, &og) < 0) { ret = VCEDIT_ERR_INVAL; goto err; } - if (ogg_stream_packetout (state->os, &header_main) != 1) { + if (ogg_stream_packetout (&state->os, &header_main) != 1) { ret = VCEDIT_ERR_INVAL; goto err; } - if (vorbis_synthesis_headerin (state->vi, state->vc, &header_main) < 0) { + if (vorbis_synthesis_headerin (&state->vi, &state->vc, &header_main) < 0) { ret = VCEDIT_ERR_INVAL; goto err; } @@ -339,16 +319,16 @@ vcedit_open (vcedit_state *state) while (i < 2) { while (i < 2) { - int result = ogg_sync_pageout (state->oy, &og); + int result = ogg_sync_pageout (&state->oy, &og); if (!result) break; /* Too little data so far */ if (result == 1) { - ogg_stream_pagein (state->os, &og); + ogg_stream_pagein (&state->os, &og); while (i < 2) { - result = ogg_stream_packetout (state->os, header); + result = ogg_stream_packetout (&state->os, header); if (!result) break; @@ -358,7 +338,7 @@ vcedit_open (vcedit_state *state) goto err; } - vorbis_synthesis_headerin (state->vi, state->vc, header); + vorbis_synthesis_headerin (&state->vi, &state->vc, header); if (i == 1) { state->booklen = header->bytes; @@ -372,7 +352,7 @@ vcedit_open (vcedit_state *state) } } - buffer = ogg_sync_buffer (state->oy, CHUNKSIZE); + buffer = ogg_sync_buffer (&state->oy, CHUNKSIZE); bytes = fread (buffer, 1, CHUNKSIZE, state->in); if (bytes == 0 && i < 2) { @@ -380,11 +360,11 @@ vcedit_open (vcedit_state *state) goto err; } - ogg_sync_wrote (state->oy, bytes); + ogg_sync_wrote (&state->oy, bytes); } /* Copy the vendor tag */ - state->vendor = strdup (state->vc->vendor); + state->vendor = strdup (state->vc.vendor); /* Headers are done! */ state->opened = true; @@ -443,7 +423,7 @@ vcedit_write (vcedit_state *state) ogg_stream_init (&streamout, state->serial); - _commentheader_out (state->vc, state->vendor, &header_comments); + _commentheader_out (&state->vc, state->vendor, &header_comments); ogg_stream_packetin (&streamout, &header_main); ogg_stream_packetin (&streamout, &header_comments); @@ -537,7 +517,7 @@ vcedit_write (vcedit_state *state) * through, a page at a time. */ while (1) { - result = ogg_sync_pageout (state->oy, &ogout); + result = ogg_sync_pageout (&state->oy, &ogout); if (!result) break; @@ -556,9 +536,9 @@ vcedit_write (vcedit_state *state) } } - buffer = ogg_sync_buffer (state->oy, CHUNKSIZE); + buffer = ogg_sync_buffer (&state->oy, CHUNKSIZE); bytes = fread (buffer, 1, CHUNKSIZE, state->in); - ogg_sync_wrote (state->oy, bytes); + ogg_sync_wrote (&state->oy, bytes); if (!bytes) { state->eosin = 1; -- 2.30.2