Skip to content

Commit 7f3c0cc

Browse files
committed
dotu bug fixes
1 parent 8fa0ffb commit 7f3c0cc

File tree

2 files changed

+47
-8
lines changed

2 files changed

+47
-8
lines changed

kext/fcall.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,14 +134,17 @@ statcheck(uchar *buf, uint nbuf, int dotu)
134134

135135
ebuf = buf + nbuf;
136136

137-
buf += STAT_FIX_LEN(dotu) - STAT_NSTRINGS(dotu) * BIT16SZ;
137+
buf += STATFIXLEN - 4 * BIT16SZ;
138138

139139
for(i = 0; i < STAT_NSTRINGS(dotu); i++){
140140
if(buf + BIT16SZ > ebuf)
141141
return -1;
142142
buf += BIT16SZ + GBIT16(buf);
143143
}
144144

145+
if (dotu)
146+
buf += STATUEXTRALEN-BIT16SZ;
147+
145148
if(buf != ebuf)
146149
return -1;
147150

kext/vnops.c

Lines changed: 43 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -395,7 +395,7 @@ ncreate_9p(vnode_t dvp, vnode_t *vpp, struct componentname *cnp, struct vnode_at
395395
cache_purge_negatives(dvp);
396396
np = NTO9P(*vpp);
397397
np->iounit = iounit;
398-
op = &np->openfid[mode];
398+
op = &np->openfid[vap->va_type==VDIR? OREAD: ORDWR];
399399
op->fid = openfid;
400400
OSIncrementAtomic(&op->ref);
401401
nunlock_9p(np);
@@ -423,6 +423,19 @@ vnop_mknod_9p(struct vnop_mknod_args *ap)
423423
return ncreate_9p(ap->a_dvp, ap->a_vpp, ap->a_cnp, ap->a_vap, ap->a_context, NULL);
424424
}
425425

426+
static openfid_9p*
427+
ofidget(node_9p *np, int fflag)
428+
{
429+
switch (fflag & (FREAD|FWRITE)) {
430+
case FREAD|FWRITE:
431+
return &np->openfid[ORDWR];
432+
case FWRITE:
433+
return &np->openfid[OWRITE];
434+
default:
435+
return &np->openfid[OREAD];
436+
}
437+
}
438+
426439
static int
427440
vnop_open_9p(struct vnop_open_args *ap)
428441
{
@@ -434,7 +447,10 @@ vnop_open_9p(struct vnop_open_args *ap)
434447
int e, flags, mode;
435448

436449
TRACE();
437-
flags = OFLAGS(ap->a_mode);
450+
flags = 0;
451+
if (ap->a_mode)
452+
flags = OFLAGS(ap->a_mode);
453+
438454
mode = flags & O_ACCMODE;
439455
CLR(flags, O_ACCMODE);
440456
CLR(flags, O_DIRECTORY|O_NONBLOCK|O_EXCL|O_NOFOLLOW);
@@ -465,7 +481,7 @@ vnop_open_9p(struct vnop_open_args *ap)
465481

466482
np = NTO9P(ap->a_vp);
467483
nlock_9p(np, NODE_LCK_EXCLUSIVE);
468-
op = &np->openfid[mode&ORDWR];
484+
op = ofidget(np, ap->a_mode);
469485
if (op->fid == NOFID) {
470486
if ((e=walk_9p(np->nmp, np->fid, NULL, 0, &fid, &qid)))
471487
goto error;
@@ -493,13 +509,14 @@ vnop_close_9p(struct vnop_close_args *ap)
493509
int e;
494510

495511
TRACE();
512+
e = 0;
496513
np = NTO9P(ap->a_vp);
497514
nlock_9p(np, NODE_LCK_EXCLUSIVE);
498-
e = EINVAL;
499-
op = &np->openfid[OFLAGS(ap->a_fflag)&ORDWR];
500-
if (op->fid == NOFID)
515+
op = ofidget(np, ap->a_fflag);
516+
if (op->fid == NOFID) {
517+
e = EBADF;
501518
goto error;
502-
519+
}
503520
if (OSDecrementAtomic(&op->ref) == 1) {
504521
if (ISSET(np->flags, NODE_MMAPPED))
505522
ubc_msync(np->vp, 0, ubc_getsize(np->vp), NULL, UBC_PUSHDIRTY|UBC_SYNC);
@@ -623,6 +640,25 @@ vnop_setattr_9p(struct vnop_setattr_args *ap)
623640
d.mode = vap->va_mode & 0777;
624641
if (vnode_isdir(vp))
625642
SET(d.mode, DMDIR);
643+
if (ISSET(np->nmp->flags, F_DOTU)) {
644+
switch (vnode_vtype(vp)) {
645+
case VBLK:
646+
case VCHR:
647+
SET(d.mode, DMDEVICE);
648+
break;
649+
case VLNK:
650+
SET(d.mode, DMSYMLINK);
651+
break;
652+
case VSOCK:
653+
SET(d.mode, DMSOCKET);
654+
break;
655+
case VFIFO:
656+
SET(d.mode, DMNAMEDPIPE);
657+
break;
658+
default:
659+
break;
660+
}
661+
}
626662
}
627663
VATTR_SET_SUPPORTED(vap, va_mode);
628664

0 commit comments

Comments
 (0)