764 pcp->pc_entry.pcd_attr &= ~PCA_RDONLY;
765 pcp->pc_flags |= PC_CHG;
766 }
767 /*
768 * Truncate file. Must have write permission.
769 */
770 if ((mask & AT_SIZE) && (vap->va_size != (u_offset_t)-1)) {
771 if (pcp->pc_entry.pcd_attr & PCA_RDONLY) {
772 error = EACCES;
773 goto out;
774 }
775 if (vap->va_size > UINT32_MAX) {
776 error = EFBIG;
777 goto out;
778 }
779 error = pc_truncate(pcp, (uint_t)vap->va_size);
780
781 if (error)
782 goto out;
783
784 if (vap->va_size == 0)
785 vnevent_truncate(vp, ct);
786 }
787 /*
788 * Change file modified times.
789 */
790 if (mask & (AT_MTIME | AT_CTIME)) {
791 /*
792 * If SysV-compatible option to set access and
793 * modified times if privileged, owner, or write access,
794 * use current time rather than va_mtime.
795 *
796 * XXX - va_mtime.tv_sec == -1 flags this.
797 */
798 timep = &vap->va_mtime;
799 if (vap->va_mtime.tv_sec == -1) {
800 gethrestime(&now);
801 timep = &now;
802 }
803 if ((fsp->pcfs_flags & PCFS_NOCLAMPTIME) == 0 &&
804 timep->tv_sec > INT32_MAX) {
805 error = EOVERFLOW;
806 goto out;
|
764 pcp->pc_entry.pcd_attr &= ~PCA_RDONLY;
765 pcp->pc_flags |= PC_CHG;
766 }
767 /*
768 * Truncate file. Must have write permission.
769 */
770 if ((mask & AT_SIZE) && (vap->va_size != (u_offset_t)-1)) {
771 if (pcp->pc_entry.pcd_attr & PCA_RDONLY) {
772 error = EACCES;
773 goto out;
774 }
775 if (vap->va_size > UINT32_MAX) {
776 error = EFBIG;
777 goto out;
778 }
779 error = pc_truncate(pcp, (uint_t)vap->va_size);
780
781 if (error)
782 goto out;
783
784 if (vap->va_size == 0) {
785 vnevent_truncate(vp, ct);
786 } else {
787 vnevent_resize(vp, ct);
788 }
789 }
790 /*
791 * Change file modified times.
792 */
793 if (mask & (AT_MTIME | AT_CTIME)) {
794 /*
795 * If SysV-compatible option to set access and
796 * modified times if privileged, owner, or write access,
797 * use current time rather than va_mtime.
798 *
799 * XXX - va_mtime.tv_sec == -1 flags this.
800 */
801 timep = &vap->va_mtime;
802 if (vap->va_mtime.tv_sec == -1) {
803 gethrestime(&now);
804 timep = &now;
805 }
806 if ((fsp->pcfs_flags & PCFS_NOCLAMPTIME) == 0 &&
807 timep->tv_sec > INT32_MAX) {
808 error = EOVERFLOW;
809 goto out;
|