diff --git a/cmd/dfs.c b/cmd/dfs.c index 1935be7..91555de 100644 --- a/cmd/dfs.c +++ b/cmd/dfs.c @@ -59,27 +59,34 @@ int builtinCD(char **dir) { char c = *dir[1]; switch (c) { case '~': - changeDir = realloc(changeDir, strlen(getenv("HOME") + strlen(dir[1]))); + changeDir = realloc(changeDir, strlen(getenv("HOME")) + strlen(dir[1]) + 1); strcpy(changeDir, getenv("HOME")); strcat(changeDir, dir[1]+1); break; case '-': - changeDir = realloc(changeDir, strlen(getenv("OLDPWD"))); + // Break early when OLDPWD is not set + if (getenv("OLDPWD") == NULL) { + free(changeDir); + printf("bash: cd: OLDPWD not set\n"); + return 1; + } + changeDir = realloc(changeDir, strlen(getenv("OLDPWD")) + 1); strcpy(changeDir, getenv("OLDPWD")); break; default: - changeDir = dir[1]; + changeDir = realloc(changeDir, strlen(dir[1]) + 1); + strcpy(changeDir, dir[1]); break; } + if (chdir(changeDir) != 0) { status = 1; printf("bash: cd: error\n"); } else { setenv("PWD", dir[1], 1); setenv("OLDPWD", oldPWD, 1); - free(prompt); - prompt = NULL; } + } else { if (chdir(getenv("HOME")) != 0) { status = 1; @@ -87,8 +94,6 @@ int builtinCD(char **dir) { } else { setenv("PWD", getenv("HOME"), 1); setenv("OLDPWD", oldPWD, 1); - free(prompt); - prompt = NULL; } } free(changeDir);