[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-core-devel
Subject: Re: Suspicous code in kdelibs-3.5.2
From: Stefan Teleman <steleman () nyc ! rr ! com>
Date: 2006-04-07 17:35:35
Message-ID: 200604071335.35954.steleman () nyc ! rr ! com
[Download RAW message or body]
On Thursday 06 April 2006 13:24, Stefan Teleman wrote:
> On Thursday 06 April 2006 10:18, Dirk Mueller wrote:
> > What is actually missing is somebody fixing the array overrun,
My patch from yesterday was wrong.
Here's the correct patch and test case.
Sorry for the confusion.
--Stefan
--
Stefan Teleman 'Nobody Expects the Spanish Inquisition'
steleman@nyc.rr.com -Monty Python
["kpixmap.cpp.diff" (text/x-diff)]
--- kpixmap.cpp.kde.orig 2005-05-23 08:15:42.000000000 -0400
+++ kpixmap.cpp 2006-04-07 13:22:37.313673000 -0400
@@ -38,35 +38,55 @@
uchar *b;
int y;
- if ( !dst->create(src->width(), src->height(), 8, 256) ) {
+ if ( !dst->create(src->width(), src->height(), 8, 256) )
+ {
qWarning("KPixmap: destination image not valid\n");
return false;
}
int ncols = 256;
- static uint bm[16][16];
- static int init=0;
- if (!init) {
+ static unsigned int* bm = 0L;
+ static const unsigned int maxindex = 16;
+ static bool init = false;
+ if (!init)
+ {
+ unsigned int n, i, j;
+ if (0L == bm)
+ {
+ bm = (unsigned int*) ::malloc(size_t(maxindex * sizeof(unsigned int*)) * \
size_t(maxindex * sizeof(unsigned int))); + for (i = 0; i < maxindex; i++)
+ {
+ for (j = 0; j < maxindex; j++)
+ {
+ *((bm + i * maxindex * sizeof(unsigned int*)) + j * \
sizeof(unsigned int)) = 0; + }
+ }
+ }
// Build a Bayer Matrix for dithering
- init = 1;
- int n, i, j;
-
- bm[0][0]=0;
-
- for (n=1; n<16; n*=2)
+ for (n = 1; n < maxindex; n *= 2)
+ {
for (i=0; i<n; i++)
- for (j=0; j<n; j++) {
- bm[i][j]*=4;
- bm[i+n][j]=bm[i][j]+2;
- bm[i][j+n]=bm[i][j]+3;
- bm[i+n][j+n]=bm[i][j]+1;
+ {
+ for (j = 0; j < n; j++)
+ {
+ *((bm + i * maxindex * sizeof(unsigned int*)) + j * \
sizeof(unsigned int)) *= 4; + *((bm + (i + n) * maxindex * \
sizeof(unsigned int*)) + j * sizeof(unsigned int)) = *((bm + i * maxindex * \
sizeof(unsigned int*)) + j * sizeof(unsigned int)) + 2; + *((bm + \
i * maxindex * sizeof(unsigned int*)) + (j + n) * sizeof(unsigned int)) = *((bm + i * \
maxindex * sizeof(unsigned int*)) + j * sizeof(unsigned int)) + 3; + \
*((bm + (i + n) * maxindex * sizeof(unsigned int*)) + ((j + n) * sizeof(unsigned \
int))) = *((bm + i * maxindex * sizeof(unsigned int*)) + (j * sizeof(unsigned int))) \
+ 1; + }
+ }
}
- for (i=0; i<16; i++)
- for (j=0; j<16; j++)
- bm[i][j]<<=8;
+ for (i = 0; i < maxindex; i++)
+ {
+ for (j = 0; j < maxindex; j++)
+ {
+ *((bm + (i * maxindex * sizeof(unsigned int*))) + (j * \
sizeof(unsigned int))) <<= 8; + }
+ }
+ init = true;
}
dst->setNumColors( ncols );
@@ -413,3 +433,5 @@
: QPixmap(p)
{
}
+
+// vim: ts=4 sw=4 et
["testkdearray.cc" (text/x-c++src)]
#include <iostream>
#include <iomanip>
using namespace std;
static void printMatrix(unsigned int* const x);
static const unsigned int maxindex = 16;
static unsigned int* bm = 0L;
int
main(int argc, char* argv[])
{
unsigned int i, j, n;
bm = (unsigned int*) ::malloc(size_t(maxindex * sizeof(unsigned int*)) * \
size_t(maxindex * sizeof(unsigned int)));
for (i = 0; i < maxindex; i++)
{
for (j = 0; j < maxindex; j++)
{
*((bm + i * maxindex * sizeof(unsigned int*)) + j * sizeof(unsigned int)) = 0;
}
}
for (n = 1; n < maxindex; n *= 2)
{
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
*((bm + i * maxindex * sizeof(unsigned int*)) + j * sizeof(unsigned int)) *= \
4;
*((bm + (i + n) * maxindex * sizeof(unsigned int*)) + j * sizeof(unsigned \
int)) = *((bm + i * maxindex * sizeof(unsigned int*)) + j * sizeof(unsigned int)) + \
2;
*((bm + i * maxindex * sizeof(unsigned int*)) + (j + n) * sizeof(unsigned \
int)) = *((bm + i * maxindex * sizeof(unsigned int*)) + j * sizeof(unsigned int)) + \
3;
*((bm + (i + n) * maxindex * sizeof(unsigned int*)) + ((j + n) * \
sizeof(unsigned int))) = *((bm + i * maxindex * sizeof(unsigned int*)) + (j * \
sizeof(unsigned int))) + 1; }
}
}
for (i = 0; i < maxindex; i++)
{
for (j = 0; j < maxindex; j++)
{
*((bm + (i * maxindex * sizeof(unsigned int*))) + (j * sizeof(unsigned int))) \
<<= 8; }
}
printMatrix(bm);
return 0;
}
void
printMatrix(unsigned int* const x)
{
unsigned int i, j;
std::cerr << "unsigned int x[" << maxindex << "][" << maxindex << "] = {" << endl;
for (i = 0; i < maxindex; i++)
{
if (i > 0)
std::cerr << "," << endl;
std::cerr << " {";
for (j = 0; j < maxindex; j++)
{
if (j > 0)
std::cerr << ", ";
std::cerr << setw(6) << *(x + i * maxindex * sizeof(unsigned int*) + j * \
sizeof(unsigned int)); }
std::cerr << " }";
}
std::cerr << endl << "};" << endl;
}
// vim: ts=2 sw=2 et
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic