showdone;
 
 void newtask(sqlite3 *db){
-    char *cmd = malloc(MAXLINE*sizeof(char));
+    int len = 45+strlen(group)+strlen(task);
+    char *cmd = malloc(len*sizeof(char));
 
     if (exists == 0){
         sprintf(cmd,"%s (%i, '%s', '%s', 0);",INSERT,hash,task,group);
 
 
 char *filepath(void){
     char *dir = getenv("XDG_DATA_HOME");
-    char *db = malloc(MAXLINE * sizeof(char));
+    char *database = malloc(MAXLINE * sizeof(char));
 
     /* set dir to $HOME/.local/share if XDG isn't set */
     if (!dir) {
         if (err) error(DIRERR);
     }
 
-    sprintf(db,"%s/odot.db",dir);
+    sprintf(database,"%s/odot.db",dir);
+    free(dir);
 
-    return db;
+    return database;
 }
 
 void checksame(char *task,char *oldgroup){
 
 
     int err = 0;
     sqlite3 *db;
-    err = sqlite3_open(filepath(),&db);
+
+    char *dbpath = malloc(MAXLINE*sizeof(char));
+    dbpath = filepath();
+    err = sqlite3_open(dbpath,&db);
+    free(dbpath);
+
     if (err < 0) sqlerror(db);
+
     sqlcmd(db,BUILDTABLE,'c');
 
     /* show all tasks if called alone */