wineconsole crashes with curses backend

Pavel Roskin proski at gnu.org
Thu Dec 1 02:21:55 CST 2005


Hello, Eric and everybody!

wineconsole crashes in WCCURSES_Refresh() when run without arguments.
PRIVATE(data)->line is NULL in curses.c on line 354.  Checking
PRIVATE(data)->line fixes the problem.

The breakage was introduced by revision 1.39 of wineconsole.c.  Removing
call to WINECON_GetServerConfig() fixes the crash.

Although WINECON_GetServerConfig() gets data that is mostly irrelevant
to the curses backend, the harmful part is setting data->cells.
Commenting it out also helps (but the "user" backend stops working).

I think setting data->cells doesn't belong to WINECON_GetServerConfig().
Since setting data->cell suppresses handling of
CONSOLE_RENDERER_SB_RESIZE_EVENT, data->fnResizeScreenBuffer and
data->fnComputePositions should be called explicitly.

Below is the patch I think is most reasonable.  Still, I'd like someone
more knowledgeable to look at it.

I moved the code under init_success outside the switch statement, as it
was getting too long.

--- wineconsole.c
+++ wineconsole.c
@@ -557,9 +557,6 @@ static BOOL WINECON_GetServerConfig(stru
     }
     SERVER_END_REQ;
     WINECON_DumpConfig("first cfg: ", &data->curcfg);
-    data->cells = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
-                            data->curcfg.sb_width * data->curcfg.sb_height * sizeof(CHAR_INFO));
-    if (!data->cells) WINECON_Fatal("OOM\n");
 
     return ret;
 }
@@ -654,13 +651,9 @@ static struct inner_data* WINECON_Init(H
     switch ((*backend)(data))
     {
     case init_success:
-        WINECON_GetServerConfig(data);
-        WINECON_SetConfig(data, &cfg);
-        data->curcfg.registry = cfg.registry;
-        WINECON_DumpConfig("fint", &data->curcfg);
-        return data;
-    case init_failed:
         break;
+    case init_failed:
+        goto error;
     case init_not_supported:
         if (backend == WCCURSES_InitBackend)
         {
@@ -673,6 +666,17 @@ static struct inner_data* WINECON_Init(H
         break;
     }
 
+    WINECON_GetServerConfig(data);
+    data->cells = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
+                            data->curcfg.sb_width * data->curcfg.sb_height * sizeof(CHAR_INFO));
+    if (!data->cells) WINECON_Fatal("OOM\n");
+    data->fnResizeScreenBuffer(data);
+    data->fnComputePositions(data);
+    WINECON_SetConfig(data, &cfg);
+    data->curcfg.registry = cfg.registry;
+    WINECON_DumpConfig("fint", &data->curcfg);
+    return data;
+
  error:
     WINE_ERR("failed to init.\n");
 


-- 
Regards,
Pavel Roskin




More information about the wine-devel mailing list