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