Projects STRLCPY criu Commits 5c8cdcee
🤬
  • sk-unix: rework unix_resolve_name

    - use exit_code instead of returning ret
    - replace -errno return with -1
    - move fallback to if (!kdat.sk_unix_file)
    - fix readlinkat error checking (ret < 0 && ret >= PATH_MAX) by using
      read_fd_link helper
    
    Signed-off-by: Pavel Tikhomirov <[email protected]>
  • Loading...
  • Pavel Tikhomirov committed with Andrei Vagin 1 year ago
    5c8cdcee
    1 parent de39bd2b
  • ■ ■ ■ ■ ■ ■
    criu/sk-unix.c
    skipped 644 lines
    645 645  static int unix_resolve_name(int lfd, uint32_t id, struct unix_sk_desc *d, UnixSkEntry *ue, const struct fd_parms *p)
    646 646  {
    647 647   char *name = d->name;
    648  - char path[PATH_MAX], tmp[PATH_MAX];
     648 + char path[PATH_MAX];
    649 649   struct stat st;
    650  - int fd, proc_fd, mnt_id, ret;
     650 + int fd, ret;
     651 + int exit_code = -1;
    651 652   
    652 653   if (d->namelen == 0 || name[0] == '\0')
    653 654   return 0;
    654 655   
    655  - if (kdat.sk_unix_file && (root_ns_mask & CLONE_NEWNS)) {
    656  - if (get_mnt_id(lfd, &mnt_id))
     656 + if (!kdat.sk_unix_file) {
     657 + pr_warn("Trying to resolve unix socket with obsolete method\n");
     658 + if (unix_resolve_name_old(lfd, id, d, ue, p)) {
     659 + pr_err("Unable to resolve unix socket name with obsolete method. "
     660 + "Try a linux kernel newer than 4.10\n");
    657 661   return -1;
    658  - ue->mnt_id = mnt_id;
    659  - ue->has_mnt_id = true;
     662 + }
     663 + return 0;
    660 664   }
    661 665   
    662 666   fd = ioctl(lfd, SIOCUNIXFILE);
    663 667   if (fd < 0) {
    664  - pr_warn("Unable to get a socket file descriptor with SIOCUNIXFILE ioctl: %s\n", strerror(errno));
    665  - goto fallback;
     668 + pr_perror("Unable to get a socket file descriptor with SIOCUNIXFILE ioctl");
     669 + return -1;
     670 + }
     671 + 
     672 + if (root_ns_mask & CLONE_NEWNS) {
     673 + struct fdinfo_common fdinfo = { .mnt_id = -1 };
     674 + 
     675 + if (parse_fdinfo(fd, FD_TYPES__UND, &fdinfo))
     676 + goto out;
     677 + 
     678 + ue->mnt_id = fdinfo.mnt_id;
     679 + ue->has_mnt_id = true;
    666 680   }
    667 681   
    668  - ret = fstat(fd, &st);
    669  - if (ret) {
     682 + if (fstat(fd, &st)) {
    670 683   pr_perror("Unable to fstat socket fd");
    671  - return -1;
     684 + goto out;
    672 685   }
    673 686   d->mode = st.st_mode;
    674 687   d->uid = st.st_uid;
    675 688   d->gid = st.st_gid;
    676 689   
    677  - proc_fd = get_service_fd(PROC_FD_OFF);
    678  - if (proc_fd < 0) {
    679  - pr_err("Unable to get service fd for proc\n");
    680  - return -1;
    681  - }
    682  - 
    683  - snprintf(tmp, sizeof(tmp), "self/fd/%d", fd);
    684  - ret = readlinkat(proc_fd, tmp, path, PATH_MAX);
    685  - if (ret < 0 && ret >= PATH_MAX) {
    686  - pr_perror("Unable to readlink %s", tmp);
     690 + ret = read_fd_link(fd, path, sizeof(path));
     691 + if (ret < 0)
    687 692   goto out;
    688  - }
    689  - path[ret] = 0;
    690 693   
    691 694   d->deleted = strip_deleted(path, ret);
    692 695   
    693 696   if (name[0] != '/') {
    694  - ret = cut_path_ending(path, name);
    695  - if (ret) {
    696  - pr_err("Unable too resolve %s from %s\n", name, path);
     697 + if (cut_path_ending(path, name)) {
     698 + pr_err("Unable too cut %s from %s\n", name, path);
    697 699   goto out;
    698 700   }
    699 701   
    700 702   ue->name_dir = xstrdup(path);
    701  - if (!ue->name_dir) {
    702  - ret = -ENOMEM;
     703 + if (!ue->name_dir)
    703 704   goto out;
    704  - }
    705 705   
    706 706   pr_debug("Resolved socket relative name %s to %s/%s\n", name, ue->name_dir, name);
    707 707   }
    708 708   
    709  - ret = 0;
     709 + exit_code = 0;
    710 710  out:
    711 711   close(fd);
    712  - return ret;
    713  - 
    714  -fallback:
    715  - pr_warn("Trying to resolve unix socket with obsolete method\n");
    716  - ret = unix_resolve_name_old(lfd, id, d, ue, p);
    717  - if (ret < 0)
    718  - pr_err("Unable to resolve unix socket name with obsolete method. Try a linux kernel newer than 4.10\n");
    719  - return ret;
     712 + return exit_code;
    720 713  }
    721 714   
    722 715  /*
    skipped 1655 lines
Please wait...
Page is in error, reload to recover