diff options
| author | Joseph Hunkeler <jhunkeler@gmail.com> | 2021-06-20 11:39:24 -0400 | 
|---|---|---|
| committer | Joseph Hunkeler <jhunkeler@gmail.com> | 2021-06-20 11:39:24 -0400 | 
| commit | 6b67d8c63bf181350c0d87d488bbacf9e40e71ae (patch) | |
| tree | 5be302e9bafe392dd323b04bbfa55079f55512e4 | |
| parent | d4b05e68917dd057c385e38ee2ba48f2f1216950 (diff) | |
| download | multihome-6b67d8c63bf181350c0d87d488bbacf9e40e71ae.tar.gz | |
Bug fixes:
* Allocate enough memory to handle a long host group name
* Move "already_inside" check before host_group parsing
| -rw-r--r-- | multihome.c | 33 | 
1 files changed, 20 insertions, 13 deletions
| diff --git a/multihome.c b/multihome.c index 04c743f..dccdee6 100644 --- a/multihome.c +++ b/multihome.c @@ -734,6 +734,7 @@ int main(int argc, char *argv[]) {      uid_t uid;      struct passwd *user_info;      struct utsname host_info; +    char *nodename;      // Disable line buffering via macro      DISABLE_BUFFERING @@ -778,6 +779,15 @@ int main(int argc, char *argv[]) {          return errno;      } +    // The short hostname is used to establish the name for the new home directory +    // Allocate enough space to fit a long user-defined name, just in case +    nodename = calloc(PATH_MAX, sizeof(char)); +    if (!nodename) { +        perror("nodename calloc"); +        return 1; +    } +    strcpy(nodename, strip_domainname(host_info.nodename)); +      // Determine the user's home directory      char *path_old;      if (!arguments.update) { @@ -808,6 +818,14 @@ int main(int argc, char *argv[]) {      sprintf(multihome.config_skeleton, "%s/%s", multihome.config_dir, MULTIHOME_CFG_SKEL);      sprintf(multihome.config_host_group, "%s/%s", multihome.config_dir, MULTIHOME_CFG_HOST_GROUP); +    // Refuse to operate within a controlled home directory +    char already_inside[PATH_MAX]; +    sprintf(already_inside, "%s/%s", multihome.path_old, MULTIHOME_MARKER); +    if (arguments.update == 0 && access(already_inside, F_OK) == 0) { +        fprintf(stderr, "error: multihome cannot be nested.\n"); +        return 1; +    } +      // Generate configuration directory      if (access(multihome.config_dir, F_OK) < 0) {          fprintf(stderr, "Creating configuration directory: %s\n", multihome.config_dir); @@ -826,27 +844,16 @@ int main(int argc, char *argv[]) {          }      } -    // The short hostname is used to establish the name for the new home directory -    char *nodename; -    nodename = strip_domainname(host_info.nodename); -      // When this host belongs to a host group, modify the hostname once more      user_host_group(&nodename); -      sprintf(multihome.path_new, "%s/%s/%s", multihome.path_old, multihome.path_root, nodename); +    free(nodename); +      sprintf(multihome.path_topdir, "%s/%s", multihome.path_new, MULTIHOME_TOPDIR);      sprintf(multihome.marker, "%s/%s", multihome.path_new, MULTIHOME_MARKER);      copy_mode = arguments.update; // 0 = normal copy, 1 = update files -    // Refuse to operate within a controlled home directory -    char already_inside[PATH_MAX]; -    sprintf(already_inside, "%s/%s", multihome.path_old, MULTIHOME_MARKER); -    if (arguments.update == 0 && access(already_inside, F_OK) == 0) { -        fprintf(stderr, "error: multihome cannot be nested.\n"); -        return 1; -    } -      // Create new home directory      if (strcmp(multihome.path_new, multihome.path_old) != 0) {          if (access(multihome.path_new, F_OK) < 0) { | 
