Minha página man do getenv diz:
As typically implemented, getenv() returns a pointer to a string within
the environment list. The caller must take care not to modify this
string, since that would change the environment of the process.
Você quebrou essa regra aqui:
char *di_settings_file_path = (char *) getenv("HOME");
strcat(di_settings_file_path, "/");
strcat(di_settings_file_path, di_default_settings_file);
strcat(di_settings_file_path, "asprintf(&di_settings_file_path , "%s/%s",
getenv("HOME"), di_default_settings_file);
/* ... use it ... */
free(di_settings_file_path);
");
Então você está modificando a memória que você não deveria modificar, em particular você está modificando o valor da variável de ambiente HOME (além disso, você provavelmente está matando alguma outra variável de ambiente, ou corrompendo o que vier depois de HOME na memória).
vim
herda o novo valor de $HOME
e tenta usá-lo como seu diretório pessoal, incluindo o depósito de suas viminfo
stuff.
Você precisa copiar getenv ("HOME") para o seu próprio buffer e certificar-se de que o buffer tenha espaço suficiente para a cópia, além do que você deseja anexar a ela. Uma maneira de fazer isso é com asprintf
:
As typically implemented, getenv() returns a pointer to a string within
the environment list. The caller must take care not to modify this
string, since that would change the environment of the process.