Index: src/create.c =================================================================== --- src/create.c (revision 1251) +++ src/create.c (revision 1252) @@ -906,6 +906,8 @@ LibraryEntryTypePtr entry = GetLibraryEntryMemory(net); entry->ListEntry = STRDUP(conn); + entry->ListEntry_dontfree = 0; + return (entry); } Index: src/file.c =================================================================== --- src/file.c (revision 1251) +++ src/file.c (revision 1252) @@ -1113,6 +1113,7 @@ /* store pointer to start of footprint name */ entry->ListEntry = entry->AllocatedMemory + strlen(entry->AllocatedMemory); + entry->ListEntry_dontfree = 1; /* Now place footprint name into AllocatedMemory */ strcat(entry->AllocatedMemory, name); @@ -1325,6 +1326,7 @@ else { entry = GetLibraryEntryMemory(menu); entry->ListEntry = strdup(temp); + entry->ListEntry_dontfree = 0; } } } Index: src/global.h =================================================================== --- src/global.h (revision 1251) +++ src/global.h (revision 1252) @@ -246,6 +246,7 @@ */ typedef struct { char *ListEntry; /* the string for the selection box */ + int ListEntry_dontfree; /* do not free(ListEntry) if non-zero */ char *AllocatedMemory, /* pointer to allocated memory; all others */ /* point to parts of the string */ *Package, /* package */ Index: src/main.c =================================================================== --- src/main.c (revision 1251) +++ src/main.c (revision 1252) @@ -1600,6 +1600,8 @@ uninit_strflags_buf(); uninit_strflags_layerlist(); + FreeLibraryMemory(&Library); + #define free0(ptr) \ do { \ if (ptr != NULL) { \ Index: src/mymem.c =================================================================== --- src/mymem.c (revision 1251) +++ src/mymem.c (revision 1252) @@ -704,7 +704,8 @@ ENTRY_LOOP(menu); { free(entry->AllocatedMemory); - free(entry->ListEntry); + if (!entry->ListEntry_dontfree) + free(entry->ListEntry); } END_LOOP; free(menu->Entry); Index: src/rats.c =================================================================== --- src/rats.c (revision 1251) +++ src/rats.c (revision 1252) @@ -872,6 +872,7 @@ } entry = GetLibraryEntryMemory(menu); entry->ListEntry = strdup(name2); + entry->ListEntry_dontfree = 0; netnode_to_netname(name2); goto ratIt; } @@ -880,6 +881,7 @@ if (menu) { entry = GetLibraryEntryMemory(menu); entry->ListEntry = strdup(name1); + entry->ListEntry_dontfree = 0; netnode_to_netname(name1); goto ratIt; } @@ -899,8 +901,11 @@ menu->Name = strdup(ratname); entry = GetLibraryEntryMemory(menu); entry->ListEntry = strdup(name1); + entry->ListEntry_dontfree = 0; + entry = GetLibraryEntryMemory(menu); entry->ListEntry = strdup(name2); + entry->ListEntry_dontfree = 0; menu->flag = 1; ratIt: Index: src/rats_patch.c =================================================================== --- src/rats_patch.c (revision 1251) +++ src/rats_patch.c (revision 1252) @@ -178,6 +178,7 @@ LibraryEntryTypePtr sentry = &smenu->Entry[p]; LibraryEntryTypePtr dentry = &dmenu->Entry[p]; dentry->ListEntry = strdup(sentry->ListEntry); + dentry->ListEntry_dontfree = 0; /* fprintf (stderr, " '%s'/%p", dentry->ListEntry, dentry->ListEntry);*/ } /* fprintf(stderr, "\n");*/ Index: src/undo.c =================================================================== --- src/undo.c (revision 1251) +++ src/undo.c (revision 1252) @@ -808,7 +808,8 @@ for (j = 0; j < lib->Menu[i].EntryN; j++) { if (lib->Menu[i].Entry[j].ListEntry) - free(lib->Menu[i].Entry[j].ListEntry); + if (!lib->Menu[i].Entry[j].ListEntry_dontfree) + free(lib->Menu[i].Entry[j].ListEntry); if (lib->Menu[i].Entry[j].AllocatedMemory) free(lib->Menu[i].Entry[j].AllocatedMemory); @@ -1532,6 +1533,7 @@ for (j = 0; j < lib->Menu[i].EntryN; j++) { old->Menu[i].Entry[j].ListEntry = lib->Menu[i].Entry[j].ListEntry ? strdup(lib->Menu[i].Entry[j].ListEntry) : NULL; + old->Menu[i].Entry[j].ListEntry_dontfree = 0; old->Menu[i].Entry[j].AllocatedMemory = lib->Menu[i].Entry[j].AllocatedMemory ? strdup(lib->Menu[i].Entry[j].AllocatedMemory) : NULL;