Fix crash on switching sound in Vista
authorH.G. Muller <h.g.muller@hccnet.nl>
Tue, 14 Jun 2011 10:40:11 +0000 (12:40 +0200)
committerH.G. Muller <h.g.muller@hccnet.nl>
Tue, 14 Jun 2011 11:11:42 +0000 (13:11 +0200)
When choosing a new sound the wave form of the old one was free'ed, but
because built-in sounds are not really malloc'ed, this led to a crash.

winboard/winboard.c
winboard/winboard.h

index b5ba50d..b86a399 100644 (file)
@@ -5621,7 +5621,7 @@ MyLoadSound(MySound *ms)
   struct stat st;\r
   FILE *f;\r
 \r
   struct stat st;\r
   FILE *f;\r
 \r
-  if (ms->data) free(ms->data);\r
+  if (ms->data && ms->flag) free(ms->data);\r
   ms->data = NULL;\r
 \r
   switch (ms->name[0]) {\r
   ms->data = NULL;\r
 \r
   switch (ms->name[0]) {\r
@@ -5642,6 +5642,7 @@ MyLoadSound(MySound *ms)
       HANDLE h = FindResource(hInst, ms->name + 1, "WAVE");\r
       if (h == NULL) break;\r
       ms->data = (void *)LoadResource(hInst, h);\r
       HANDLE h = FindResource(hInst, ms->name + 1, "WAVE");\r
       if (h == NULL) break;\r
       ms->data = (void *)LoadResource(hInst, h);\r
+      ms->flag = 0; // not maloced, so cannot be freed!\r
       if (h == NULL) break;\r
       ok = TRUE;\r
     }\r
       if (h == NULL) break;\r
       ok = TRUE;\r
     }\r
@@ -5652,6 +5653,7 @@ MyLoadSound(MySound *ms)
     if (f == NULL) break;\r
     if (fstat(fileno(f), &st) < 0) break;\r
     ms->data = malloc(st.st_size);\r
     if (f == NULL) break;\r
     if (fstat(fileno(f), &st) < 0) break;\r
     ms->data = malloc(st.st_size);\r
+    ms->flag = 1;\r
     if (fread(ms->data, st.st_size, 1, f) < 1) break;\r
     fclose(f);\r
     ok = TRUE;\r
     if (fread(ms->data, st.st_size, 1, f) < 1) break;\r
     fclose(f);\r
     ok = TRUE;\r
index 89c50ab..3ac652c 100644 (file)
@@ -85,6 +85,7 @@ typedef struct {
 typedef struct {\r
   char* name;\r
   void* data;\r
 typedef struct {\r
   char* name;\r
   void* data;\r
+  int flag; // [HGM] needed to indicate if data was malloc'ed or not\r
 } MySound;\r
 \r
 typedef struct {\r
 } MySound;\r
 \r
 typedef struct {\r