Free up the original buffer pointer instead of the one we advanced.
Only call getDrive() once inside of addDrive().

diff --git a/programs/winecfg/drive.c b/programs/winecfg/drive.c
index 1f0a0ce..a22b151 100644
--- a/programs/winecfg/drive.c
+++ b/programs/winecfg/drive.c
@@ -70,18 +70,20 @@
 
 BOOL addDrive(char letter, char *targetpath, char *label, char *serial, uint type)
 {
-    if(drives[getDrive(letter)].in_use)
+    int driveIndex = getDrive(letter);
+
+    if(drives[driveIndex].in_use)
         return FALSE;
 
     WINE_TRACE("letter == '%c', unixpath == '%s', label == '%s', serial == '%s', type == %d\n",
                letter, targetpath, label, serial, type);
 
-    drives[getDrive(letter)].letter = toupper(letter);
-    drives[getDrive(letter)].unixpath = strdup(targetpath);
-    drives[getDrive(letter)].label = strdup(label);
-    drives[getDrive(letter)].serial = strdup(serial);
-    drives[getDrive(letter)].type = type;
-    drives[getDrive(letter)].in_use = TRUE;
+    drives[driveIndex].letter   = toupper(letter);
+    drives[driveIndex].unixpath = strdup(targetpath);
+    drives[driveIndex].label    = strdup(label);
+    drives[driveIndex].serial   = strdup(serial);
+    drives[driveIndex].type     = type;
+    drives[driveIndex].in_use   = TRUE;
 
     return TRUE;
 }
@@ -696,7 +698,7 @@
 
 void onDriveInitDialog(void)
 {
-  char *pDevices;
+  char *pDevices, *pDev;
   int ret;
   int i;
   int retval;
@@ -704,7 +706,7 @@
   WINE_TRACE("\n");
 
   /* setup the drives array */
-  pDevices = (char*)malloc(512);
+  pDev = pDevices = malloc(512);
   ret = GetLogicalDriveStrings(512, pDevices);
 
   /* make all devices unused */
@@ -786,7 +788,7 @@
 
   WINE_TRACE("found %d drives\n", i);
 
-  free(pDevices);
+  free(pDev);
 }