diff --git a/src/calc.c b/src/calc.c
index 87e426d1885ccaab918b68afba40097d8a1ca902..e54eb01fe2a96246634e2abc83660184a3fc9ab2 100644
--- a/src/calc.c
+++ b/src/calc.c
@@ -169,6 +169,7 @@ int calc_dir(struct dir *dest, char *name) {
     t = dest;
     while((t = t->parent) != NULL)
       t->flags |= FF_SERR;
+    calc_leavepath();
     return 0;
   }
 
@@ -177,8 +178,10 @@ int calc_dir(struct dir *dest, char *name) {
     calc_enterpath(dr->d_name);
     if(calc_item(dest, dr->d_name))
       dest->flags |= FF_ERR;
-    if(input_handle(1))
+    if(input_handle(1)) {
+      calc_leavepath();
       return 1;
+    }
     calc_leavepath();
     errno = 0;
   }
@@ -203,13 +206,16 @@ int calc_dir(struct dir *dest, char *name) {
   ch = 0;
   for(t=dest->sub; t!=NULL; t=t->next)
     if(t->flags & FF_DIR && !(t->flags & FF_EXL || t->flags & FF_OTHFS))
-      if(calc_dir(t, t->name))
+      if(calc_dir(t, t->name)) {
+        calc_leavepath();
         return 1;
+      }
 
   /* chdir back */
   if(chdir("..") < 0) {
     failed = 1;
     strcpy(errmsg, "Couldn't chdir to previous directory");
+    calc_leavepath();
     return 1;
   }
   calc_leavepath();