I believe I've fixed a problem where pgAdmin intermittently crashes on
64 bit systems while deleting rows.  The issues seems to be that, among
other things, sqlTable::DeleteRows() in frm/frmEditGrid.cpp attempts to
remove an element in lineIndex by shifting down the remaining elements.
Unfortunately the "sizeof" is taking the size of the wrong thing.

I suspect this is only an issue on systems where pointers and "int"s are
different sizes, which should be 64 bit systems, but I have only have a
64 bit Linux system handy to try.

Increasing the number of rows that follow the row deleted should
increase the probability of getting a crash, but Valgrind always
complains about bad reads and writes for the memmove() in question.

Steps to reproduce the problem:
1) Choose a table that has roughly 200 or more rows.  Here's a dump of
such a table:
  http://selliott.org/pgadmin/table-200-rows.sql
2) Navigate to the "Edit Data" window (the window navigated to by
selecting the View Data / View All Rows for the table in question).
3) Select a low numbered row, such as the fifth row.
4) Right click and select "Delete".  The crash may happen when the
delete is confirmed after the subsequent dialog.

-- 
------------------------------------------------------------------------
|  Steven Elliott  |  http://selliott.org  |  [email protected]  |
------------------------------------------------------------------------
--- pgadmin/frm/frmEditGrid.cpp.orig	2012-03-18 10:24:29.879221155 -0500
+++ pgadmin/frm/frmEditGrid.cpp	2012-03-18 10:25:12.753351092 -0500
@@ -2965,7 +2965,7 @@
 			{
 				rowsDeleted++;
 				if ((int)pos < nRows - rowsDeleted)
-					memmove(lineIndex + pos, lineIndex + pos + 1, sizeof(cacheLine *) * (nRows - rowsDeleted - pos));
+					memmove(lineIndex + pos, lineIndex + pos + 1, sizeof(*lineIndex) * (nRows - rowsDeleted - pos));
 			}
 			else
 			{
-- 
Sent via pgadmin-hackers mailing list ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgadmin-hackers

Reply via email to