if (uc &&
((uc->mu_valid == UCRED_OLD) || (uc->mu_valid == UCRED_NEW))) {
uid = uc->mu_fsuid;
- gid = uc->mu_fsgid;
+ if (la->la_mode & S_ISGID)
+ gid = la->la_gid;
+ else
+ gid = uc->mu_fsgid;
cap = uc->mu_cap;
if (uc->mu_ginfo || (uc->mu_valid == UCRED_OLD))
mci->mci_opdata.suppgids[0] = uc->mu_suppgids[0];
if (op != REINT_SETATTR) {
if ((attr->la_valid & LA_UID) && (attr->la_uid != -1))
attr->la_uid = uc->mu_fsuid;
- if ((attr->la_valid & LA_GID) && (attr->la_gid != -1))
- attr->la_gid = uc->mu_fsgid;
+ if (op != REINT_CREATE) {
+ if ((attr->la_valid & LA_GID) && (attr->la_gid != -1))
+ attr->la_gid = uc->mu_fsgid;
+ } else {
+ if (!(attr->la_mode & S_ISGID) && (attr->la_gid != -1))
+ attr->la_gid = uc->mu_fsgid;
+ }
} else if (med->med_rmtclient) {
/* NB: -1 case will be handled by mdt_fix_attr() later. */
if ((attr->la_valid & LA_UID) && (attr->la_uid != -1)) {