From c563262006d6630626cf7c36e4d5ce3587505813 Mon Sep 17 00:00:00 2001 From: giraffedata Date: Sun, 2 Mar 2008 23:45:49 +0000 Subject: Fix double free git-svn-id: http://svn.code.sf.net/p/netpbm/code/trunk@592 9d0c8265-081b-0410-96cb-a4ca84ce46f8 --- editor/pgmmedian.c | 273 +++++++++++++++++++++++++++-------------------------- 1 file changed, 138 insertions(+), 135 deletions(-) (limited to 'editor') diff --git a/editor/pgmmedian.c b/editor/pgmmedian.c index 9ca2bbb1..9c423e26 100644 --- a/editor/pgmmedian.c +++ b/editor/pgmmedian.c @@ -52,7 +52,6 @@ static int format; static gray maxval; static gray **grays; static gray *grayrow; -static gray **rowptr; static int ccolso2, crowso2; static int row; @@ -125,10 +124,10 @@ parseCommandLine(int argc, char ** argv, static void -select_489(gray * const a, - int * const parray, - int const n, - int const k) { +select489(gray * const a, + int * const parray, + int const n, + int const k) { gray t; int i, j, l, r; @@ -180,206 +179,220 @@ select_489(gray * const a, static void -select_median(FILE * const ifp, - int const ccols, - int const crows, - int const cols, - int const rows, - int const median) { - - int ccol, col; - int crow; - int rownum, irow, temprow; - gray *temprptr; - int i, leftcol; - int num_values; - gray *garray; - - int *parray; - int addcol; - int *subcol; - int tsum; - - /* Allocate storage for array of the current gray values. */ - garray = pgm_allocrow( crows * ccols ); +selectMedian(FILE * const ifP, + unsigned int const ccols, + unsigned int const crows, + unsigned int const cols, + unsigned int const rows, + unsigned int const median) { + + unsigned int const numValues = crows * ccols; + + unsigned int col; + gray * garray; + /* Array of the currenty gray values */ + int * parray; + int * subcol; + gray ** rowptr; + + garray = pgm_allocrow(numValues); - num_values = crows * ccols; + MALLOCARRAY(rowptr, crows); + MALLOCARRAY(parray, numValues); + MALLOCARRAY(subcol, cols); - parray = (int *) pm_allocrow( crows * ccols, sizeof(int) ); - subcol = (int *) pm_allocrow( cols, sizeof(int) ); + if (rowptr == NULL || parray == NULL || subcol == NULL) + pm_error("Unable to allocate memory"); - for ( i = 0; i < cols; ++i ) - subcol[i] = ( i - (ccolso2 + 1) ) % ccols; + for (col = 0; col < cols; ++col) + subcol[col] = (col - (ccolso2 + 1)) % ccols; /* Apply median to main part of image. */ - for ( ; row < rows; ++row ) { - temprow = row % crows; - pgm_readpgmrow( ifp, grays[temprow], cols, maxval, format ); + for ( ; row < rows; ++row) { + int crow; + int rownum, irow, temprow; + unsigned int col; + + pgm_readpgmrow(ifP, grays[row % crows], cols, maxval, format); /* Rotate pointers to rows, so rows can be accessed in order. */ - temprow = ( row + 1 ) % crows; + temprow = (row + 1) % crows; rownum = 0; - for ( irow = temprow; irow < crows; ++rownum, ++irow ) + for (irow = temprow; irow < crows; ++rownum, ++irow) rowptr[rownum] = grays[irow]; - for ( irow = 0; irow < temprow; ++rownum, ++irow ) + for (irow = 0; irow < temprow; ++rownum, ++irow) rowptr[rownum] = grays[irow]; - for ( col = 0; col < cols; ++col ) { - if ( col < ccolso2 || col >= cols - ccolso2 ) { + for (col = 0; col < cols; ++col) { + if (col < ccolso2 || col >= cols - ccolso2) { grayrow[col] = rowptr[crowso2][col]; - } else if ( col == ccolso2 ) { - leftcol = col - ccolso2; + } else if (col == ccolso2) { + unsigned int const leftcol = col - ccolso2; + unsigned int i; i = 0; - for ( crow = 0; crow < crows; ++crow ) { - temprptr = rowptr[crow] + leftcol; - for ( ccol = 0; ccol < ccols; ++ccol ) { - garray[i] = *( temprptr + ccol ); + for (crow = 0; crow < crows; ++crow) { + gray * const temprptr = rowptr[crow] + leftcol; + unsigned int ccol; + for (ccol = 0; ccol < ccols; ++ccol) { + garray[i] = *(temprptr + ccol); parray[i] = i; ++i; } } - select_489( garray, parray, num_values, median ); + select489(garray, parray, numValues, median); grayrow[col] = garray[parray[median]]; } else { - addcol = col + ccolso2; + unsigned int const addcol = col + ccolso2; + unsigned int crow; + unsigned int tsum; for (crow = 0, tsum = 0; crow < crows; ++crow, tsum += ccols) garray[tsum + subcol[col]] = *(rowptr[crow] + addcol ); - select_489( garray, parray, num_values, median ); + select489( garray, parray, numValues, median ); grayrow[col] = garray[parray[median]]; } } pgm_writepgmrow( stdout, grayrow, cols, maxval, forceplain ); } - /* Write out remaining unchanged rows. */ - for ( irow = crowso2 + 1; irow < crows; ++irow ) - pgm_writepgmrow( stdout, rowptr[irow], cols, maxval, forceplain ); - - pgm_freerow( garray ); - pm_freerow( (char *) parray ); - pm_freerow( (char *) subcol ); + { + unsigned int irow; + /* Write out remaining unchanged rows. */ + for (irow = crowso2 + 1; irow < crows; ++irow) + pgm_writepgmrow(stdout, rowptr[irow], cols, maxval, forceplain); + } + free(subcol); + free(parray); + free(rowptr); + pgm_freerow(garray); } static void -histogram_sort_median(FILE * const ifp, - int const ccols, - int const crows, - int const cols, - int const rows, - int const median) { +histogramSortMedian(FILE * const ifP, + unsigned int const ccols, + unsigned int const crows, + unsigned int const cols, + unsigned int const rows, + unsigned int const median) { - int const histmax = maxval + 1; + unsigned int const histmax = maxval + 1; - int *hist; - int mdn, ltmdn; - gray *left_col, *right_col; + unsigned int * hist; + unsigned int mdn, ltmdn; + gray * leftCol; + gray * rghtCol; + gray ** rowptr; - hist = (int *) pm_allocrow( histmax, sizeof( int ) ); - left_col = pgm_allocrow( crows ); - right_col = pgm_allocrow( crows ); + MALLOCARRAY(rowptr, crows); + MALLOCARRAY(hist, histmax); + + if (rowptr == NULL || hist == NULL) + pm_error("Unable to allocate memory"); + + leftCol = pgm_allocrow(crows); + rghtCol = pgm_allocrow(crows); /* Apply median to main part of image. */ - for ( ; row < rows; ++row ) { - int col; - int temprow; - int rownum; - int irow; - int i; + for ( ; row < rows; ++row) { + unsigned int col; + unsigned int temprow; + unsigned int rownum; + unsigned int irow; + unsigned int i; /* initialize hist[] */ - for ( i = 0; i < histmax; ++i ) + for (i = 0; i < histmax; ++i) hist[i] = 0; - temprow = row % crows; - pgm_readpgmrow( ifp, grays[temprow], cols, maxval, format ); + pgm_readpgmrow(ifP, grays[row % crows], cols, maxval, format); /* Rotate pointers to rows, so rows can be accessed in order. */ - temprow = ( row + 1 ) % crows; + temprow = (row + 1) % crows; rownum = 0; - for ( irow = temprow; irow < crows; ++rownum, ++irow ) + for (irow = temprow; irow < crows; ++rownum, ++irow) rowptr[rownum] = grays[irow]; - for ( irow = 0; irow < temprow; ++rownum, ++irow ) + for (irow = 0; irow < temprow; ++rownum, ++irow) rowptr[rownum] = grays[irow]; - for ( col = 0; col < cols; ++col ) { - if ( col < ccolso2 || col >= cols - ccolso2 ) + for (col = 0; col < cols; ++col) { + if (col < ccolso2 || col >= cols - ccolso2) grayrow[col] = rowptr[crowso2][col]; - else if ( col == ccolso2 ) { - int crow; - int const leftcol = col - ccolso2; + else if (col == ccolso2) { + unsigned int crow; + unsigned int const leftcol = col - ccolso2; i = 0; - for ( crow = 0; crow < crows; ++crow ) { - int ccol; + for (crow = 0; crow < crows; ++crow) { + unsigned int ccol; gray * const temprptr = rowptr[crow] + leftcol; - for ( ccol = 0; ccol < ccols; ++ccol ) { - gray const g = *( temprptr + ccol ); + for (ccol = 0; ccol < ccols; ++ccol) { + gray const g = *(temprptr + ccol); ++hist[g]; ++i; } } ltmdn = 0; - for ( mdn = 0; ltmdn <= median; ++mdn ) + for (mdn = 0; ltmdn <= median; ++mdn) ltmdn += hist[mdn]; - mdn--; - if ( ltmdn > median ) + --mdn; + if (ltmdn > median) ltmdn -= hist[mdn]; grayrow[col] = mdn; } else { - int crow; - int const subcol = col - ( ccolso2 + 1 ); - int const addcol = col + ccolso2; - for ( crow = 0; crow < crows; ++crow ) { - left_col[crow] = *( rowptr[crow] + subcol ); - right_col[crow] = *( rowptr[crow] + addcol ); + unsigned int crow; + unsigned int const subcol = col - (ccolso2 + 1); + unsigned int const addcol = col + ccolso2; + for (crow = 0; crow < crows; ++crow) { + leftCol[crow] = *(rowptr[crow] + subcol); + rghtCol[crow] = *(rowptr[crow] + addcol); } - for ( crow = 0; crow < crows; ++crow ) { + for (crow = 0; crow < crows; ++crow) { { - gray const g = left_col[crow]; - hist[(int) g]--; - if ( (int) g < mdn ) - ltmdn--; + gray const g = leftCol[crow]; + --hist[(unsigned int) g]; + if ((unsigned int) g < mdn) + --ltmdn; } { - gray const g = right_col[crow]; - hist[(int) g]++; - if ( (int) g < mdn ) - ltmdn++; + gray const g = rghtCol[crow]; + ++hist[(unsigned int) g]; + if ((unsigned int) g < mdn) + ++ltmdn; } } - if ( ltmdn > median ) + if (ltmdn > median) do { - mdn--; + --mdn; ltmdn -= hist[mdn]; - } while ( ltmdn > median ); + } while (ltmdn > median); else { /* This one change from Pitas algorithm can reduce run ** time by up to 10%. */ - while ( ltmdn <= median ) { + while (ltmdn <= median) { ltmdn += hist[mdn]; - mdn++; + ++mdn; } - mdn--; - if ( ltmdn > median ) + --mdn; + if (ltmdn > median) ltmdn -= hist[mdn]; } grayrow[col] = mdn; } } - pgm_writepgmrow( stdout, grayrow, cols, maxval, forceplain ); + pgm_writepgmrow(stdout, grayrow, cols, maxval, forceplain); } { /* Write out remaining unchanged rows. */ - int irow; - for ( irow = crowso2 + 1; irow < crows; ++irow ) - pgm_writepgmrow( stdout, rowptr[irow], cols, maxval, forceplain ); + unsigned int irow; + for (irow = crowso2 + 1; irow < crows; ++irow) + pgm_writepgmrow(stdout, rowptr[irow], cols, maxval, forceplain); } - pm_freerow( (char *) hist ); - pgm_freerow( left_col ); - pgm_freerow( right_col ); + pgm_freerow(leftCol); + pgm_freerow(rghtCol); + free(hist); + free(rowptr); } @@ -410,9 +423,6 @@ main(int argc, grays = pgm_allocarray(cols, cmdline.height); grayrow = pgm_allocrow(cols); - /* Allocate pointers to mask row buffer. */ - rowptr = pgm_allocarray(1, cmdline.height); - /* Read in and write out initial rows that won't get changed. */ for (row = 0; row < cmdline.height - 1; ++row) { pgm_readpgmrow(ifP, grays[row], cols, maxval, format); @@ -434,12 +444,12 @@ main(int argc, switch (medianMethod) { case SELECT_MEDIAN: - select_median(ifP, cmdline.width, cmdline.height, cols, rows, median); + selectMedian(ifP, cmdline.width, cmdline.height, cols, rows, median); break; case HISTOGRAM_SORT_MEDIAN: - histogram_sort_median(ifP, cmdline.width, cmdline.height, - cols, rows, median); + histogramSortMedian(ifP, cmdline.width, cmdline.height, + cols, rows, median); break; case MEDIAN_UNSPECIFIED: pm_error("INTERNAL ERROR: median unspecified"); @@ -450,13 +460,6 @@ main(int argc, pgm_freearray(grays, cmdline.height); pgm_freerow(grayrow); - pgm_freearray(rowptr, cmdline.height); return 0; } - - - - - - -- cgit 1.4.1