Функция 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. Но код выше глючит, когда я печатаю

$ cd ~/code

он выполняется, как и ожидалось, но в приведенном ниже случае он говорит "Неправильный путь". И я не могу понять, почему.

$ cd ~/code / [name_of_some_valid_directory]

2 ответа

Решение

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,

Значение назначено здесь

argv[1] = path;

здесь больше не действует

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

как область ({...}) в котором path определен, действительно уже был оставлен, так argv[1] указывает на неверную память.

Призыв к chdir() затем обращается к этой неверной памяти, которая, в свою очередь, провоцирует печально известное неопределенное поведение, с этого момента может произойти все что угодно.

Другие вопросы по тегам