函数chdir()表现得很奇怪

时间:2015-10-01 14:49:36

标签: c linux shell chdir

int cmd_cd(char* argv[]) {
  if(argv[1] == NULL || strncmp("~", argv[1], 1) == 0){
    struct passwd *pw = getpwuid(getuid());
    if(argv[1] == NULL || strlen(argv[1]) == 1){
      argv[1] = pw->pw_dir;
    }
    else{
      char path[strlen(pw->pw_dir) + strlen(arg[1])];
      strcpy(path, pw->pw_dir);
      argv[1] = &argv[1][1];
      strcat(path, argv[1]);
      argv[1] = path;
    }
  }

  if(chdir(argv[1])<0) {
    printf("Not a valid path\n");
    return -1;
  }
  return 0;
}

上面是一段代码,我试图制作一个玩具linux shell。但是当我输入

时,上面的代码就是错误的
  

$ cd~ / code

它按预期执行,但在下面的情况下,它表示&#34;不是有效路径&#34;。我无法弄清楚原因。

  

$ cd~ / code / [name_of_some_valid_directory] ​​

2 个答案:

答案 0 :(得分:3)

path在退出定义的块时被删除。

试试这个:

int cmd_cd(char* argv[]) {
  char *path = NULL;
  if(argv[1] == NULL || strncmp("~", argv[1], 1) == 0){
    struct passwd *pw = getpwuid(getuid());
    if(argv[1] == NULL || strlen(argv[1]) == 1){
      argv[1] = pw->pw_dir;
    }
    else{
      path = malloc(strlen(pw->pw_dir) + strlen(arg[1]));
      if (path == NULL){
        printf("Memory allocation failed\n");
        return -1;
      }
      strcpy(path, pw->pw_dir);
      argv[1] = &argv[1][1];
      strcat(path, argv[1]);
      argv[1] = path;
    }
  }

  if(chdir(argv[1])<0) {
    printf("Not a valid path\n");
    if (path != NULL) free(path);
    return -1;
  }
  if (path != NULL) free(path);
  return 0;
}

如果需要使用#include <stdlib.h>malloc,请将free添加到代码的头部。

答案 1 :(得分:2)

此处指定的值

argv[1] = path;

此处无效

if(chdir(argv[1])<0) {

作为定义{...}的范围(path)已经有效,因此argv[1]指向无效的内存。

chdir()的调用然后访问这个无效的内存,从而引发臭名昭着的未定义行为,从那时起就会发生任何事情。