Fix memory errors in qt_tilewidth and qt_tileheight

* qt_tilewidth and qt_tileheight are allocated with alloc() and need
  to be freed with free().
* Don't use them after they're freed. Instead, retrieve the size from
  the glyphs object.
This commit is contained in:
Ray Chason
2023-06-04 22:17:00 -04:00
parent ee27ec97d1
commit 20fb008012
2 changed files with 17 additions and 14 deletions

View File

@@ -877,17 +877,14 @@ NetHackQtMainWindow::NetHackQtMainWindow(NetHackQtKeyBuffer& ks) :
int w=screensize.width()-10; // XXX arbitrary extra space for frame int w=screensize.width()-10; // XXX arbitrary extra space for frame
int h=screensize.height()-50; int h=screensize.height()-50;
int maxwn; int maxwn = 1400;
int maxhn; int maxhn = 1024;
if (qt_tilewidth != NULL) { if (qt_settings != NULL) {
maxwn = atoi(qt_tilewidth) * COLNO + 10; auto glyphs = &qt_settings->glyphs();
} else { if (glyphs != NULL) {
maxwn = 1400; maxwn = glyphs->width() * COLNO + 10;
} maxhn = glyphs->height() * ROWNO * 6/4;
if (qt_tileheight != NULL) { }
maxhn = atoi(qt_tileheight) * ROWNO * 6/4;
} else {
maxhn = 1024;
} }
// Be exactly the size we want to be - full map... // Be exactly the size we want to be - full map...
@@ -1239,6 +1236,9 @@ void NetHackQtMainWindow::layout()
splittersizes[2] = w / 2 - (d * 1 / 4); // status splittersizes[2] = w / 2 - (d * 1 / 4); // status
splittersizes[1] = d; // invusage splittersizes[1] = d; // invusage
splittersizes[0] = w / 2 - (d * 3 / 4); // messages splittersizes[0] = w / 2 - (d * 3 / 4); // messages
printf("w = %d d = %d splittersizes = %d %d %d\n",
w, d,
splittersizes[0], splittersizes[1], splittersizes[2]);
hsplitter->setSizes(splittersizes); hsplitter->setSizes(splittersizes);
} }
} }

View File

@@ -118,11 +118,13 @@ NetHackQtSettings::NetHackQtSettings() :
// Tile/font sizes read from .nethackrc // Tile/font sizes read from .nethackrc
if (qt_tilewidth != NULL) { if (qt_tilewidth != NULL) {
tilewidth.setValue(atoi(qt_tilewidth)); tilewidth.setValue(atoi(qt_tilewidth));
delete[] qt_tilewidth; free(qt_tilewidth);
qt_tilewidth = NULL;
} }
if (qt_tileheight != NULL) { if (qt_tileheight != NULL) {
tileheight.setValue(atoi(qt_tileheight)); tileheight.setValue(atoi(qt_tileheight));
delete[] qt_tileheight; free(qt_tileheight);
qt_tileheight = NULL;
} }
if (qt_fontsize != NULL) { if (qt_fontsize != NULL) {
switch (tolower(qt_fontsize[0])) { switch (tolower(qt_fontsize[0])) {
@@ -132,7 +134,8 @@ NetHackQtSettings::NetHackQtSettings() :
case 's': default_fontsize = 3; break; case 's': default_fontsize = 3; break;
case 't': default_fontsize = 4; break; case 't': default_fontsize = 4; break;
} }
delete[] qt_fontsize; free(qt_fontsize);
qt_fontsize = NULL;
} }
theglyphs=new NetHackQtGlyphs(); theglyphs=new NetHackQtGlyphs();