diff --git a/src/calc.c b/src/calc.c
index ff1963b9e69cc198be3d0e1d658ef4cdc10d68f8..0a96a8337ce6c8a36da81a1a8d42a2096dff6e9b 100644
--- a/src/calc.c
+++ b/src/calc.c
@@ -60,6 +60,8 @@ char *rpath(const char *from, char *to) {
       strcpy(tmp, cwd);
     else
       tmp[0] = 0;
+    if(strlen(cur) + 2 > PATH_MAX - strlen(tmp))
+      return(NULL);
     strcat(tmp, "/");
     strcat(tmp, cur);
   } else
@@ -357,6 +359,7 @@ struct dir *showCalc(char *path) {
   *lasterr = '\0';
   anpos = 0;
   lastupdate = 999;
+  memset(tmp, 0, PATH_MAX);
 
  /* init parent dir */
   if(rpath(path, tmp) == NULL || lstat(tmp, &fs) != 0 || !S_ISDIR(fs.st_mode)) {
diff --git a/src/main.c b/src/main.c
index 63471f305eff32261e21e19ffaae3a0ea2b6431f..b09b17593522c4af5b1e510bc5a6ccf8aa3ab4e5 100644
--- a/src/main.c
+++ b/src/main.c
@@ -87,7 +87,10 @@ void parseCli(int argc, char **argv) {
             exit(1);
         }
     } else {
-      strcpy(sdir, argv[i]);
+      sdir[PATH_MAX - 1] = 0;
+      strncpy(sdir, argv[i], PATH_MAX);
+      if(sdir[PATH_MAX - 1] != 0)
+        sdir[0] = 0;
     }
   }
   if(s_export && !sdir[0]) {