[CRIU] [PATCH 4/5] sk-unix: Add trivial name resolver for sockets with relative names

Cyrill Gorcunov gorcunov at gmail.com
Tue Jul 28 05:27:57 PDT 2015


On Tue, Jul 28, 2015 at 03:11:48PM +0300, Pavel Emelyanov wrote:
> >  
> > +static int resolve_rel_name(struct unix_sk_desc *sk, const struct fd_parms *p)
> > +{
> > +	rel_name_desc_t *rel_name = sk->rel_name;
> > +	const char *dirs[] = { "cwd", "root" };
> > +	int mntns_root, i;
> > +	struct ns_id *ns;
> > +
> > +	ns = lookup_ns_by_id(root_item->ids->mnt_ns_id, &mnt_ns_desc);
> 
> This should be task's mntns, not some arbitrary one :)

True, thanks!

> >  static int dump_one_unix_fd(int lfd, u32 id, const struct fd_parms *p)
> >  {
> >  	struct unix_sk_desc *sk, *peer;
> 
> > @@ -714,6 +808,9 @@ static int post_open_unix_sk(struct file_desc *d, int fd)
> >  	addr.sun_family = AF_UNIX;
> >  	memcpy(&addr.sun_path, peer->name, peer->ue->name.len);
> >  
> > +	if (prep_unix_sk_cwd(ui))
> 
> You do this to make subsequent connect() resolve the name properly,
> so the prep_ should be called on peer, not on ui, shouldn't it?

Yeah, thanks!

> 
> > +		return -1;
> > +
> >  	if (connect(fd, (struct sockaddr *)&addr,
> >  				sizeof(addr.sun_family) +
> >  				peer->ue->name.len) < 0) {
> > @@ -754,6 +851,9 @@ static int bind_unix_sk(int sk, struct unix_sk_info *ui)
> >  	addr.sun_family = AF_UNIX;
> >  	memcpy(&addr.sun_path, ui->name, ui->ue->name.len);
> >  
> > +	if (prep_unix_sk_cwd(ui))
> > +		return -1;
> > +
> >  	if (bind(sk, (struct sockaddr *)&addr,
> >  				sizeof(addr.sun_family) + ui->ue->name.len)) {
> >  		pr_perror("Can't bind socket");
> > @@ -769,8 +869,11 @@ static int bind_unix_sk(int sk, struct unix_sk_info *ui)
> >  			return -1;
> >  		}
> >  
> > -		memcpy(fname, ui->name, ui->ue->name.len);
> > -		fname[ui->ue->name.len] = '\0';
> > +		if (!ui->name_dir) {
> > +			memcpy(fname, ui->name, ui->ue->name.len);
> > +			fname[ui->ue->name.len] = '\0';
> > +		} else
> > +			snprintf(fname, PATH_MAX, "%s/%s", ui->name_dir, ui->name);
> >  
> >  		if (chown(fname, perms->uid, perms->gid) == -1) {
> 
> Won't chownat() be better?

Sure, won't hurt. I'll update and resend


More information about the CRIU mailing list