Commit 56e71431 authored by Tina Ruchandani's avatar Tina Ruchandani Committed by David Howells
Browse files

afs: Prevent callback expiry timer overflow



get_seconds() returns real wall-clock seconds. On 32-bit systems
this value will overflow in year 2038 and beyond. This patch changes
afs_vnode record to use ktime_get_real_seconds() instead, for the
fields cb_expires and cb_expires_at.

Signed-off-by: default avatarTina Ruchandani <ruchandani.tina@gmail.com>
Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
parent 8a79790b
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -145,7 +145,7 @@ static void xdr_decode_AFSCallBack(const __be32 **_bp, struct afs_vnode *vnode)
	vnode->cb_version	= ntohl(*bp++);
	vnode->cb_expiry	= ntohl(*bp++);
	vnode->cb_type		= ntohl(*bp++);
	vnode->cb_expires	= vnode->cb_expiry + get_seconds();
	vnode->cb_expires	= vnode->cb_expiry + ktime_get_real_seconds();
	*_bp = bp;
}

+4 −3
Original line number Diff line number Diff line
@@ -246,12 +246,13 @@ struct inode *afs_iget(struct super_block *sb, struct key *key,
			vnode->cb_version = 0;
			vnode->cb_expiry = 0;
			vnode->cb_type = 0;
			vnode->cb_expires = get_seconds();
			vnode->cb_expires = ktime_get_real_seconds();
		} else {
			vnode->cb_version = cb->version;
			vnode->cb_expiry = cb->expiry;
			vnode->cb_type = cb->type;
			vnode->cb_expires = vnode->cb_expiry + get_seconds();
			vnode->cb_expires = vnode->cb_expiry +
				ktime_get_real_seconds();
		}
	}

@@ -324,7 +325,7 @@ int afs_validate(struct afs_vnode *vnode, struct key *key)
	    !test_bit(AFS_VNODE_CB_BROKEN, &vnode->flags) &&
	    !test_bit(AFS_VNODE_MODIFIED, &vnode->flags) &&
	    !test_bit(AFS_VNODE_ZAP_DATA, &vnode->flags)) {
		if (vnode->cb_expires < get_seconds() + 10) {
		if (vnode->cb_expires < ktime_get_real_seconds() + 10) {
			_debug("callback expired");
			set_bit(AFS_VNODE_CB_BROKEN, &vnode->flags);
		} else {
+2 −2
Original line number Diff line number Diff line
@@ -377,8 +377,8 @@ struct afs_vnode {
	struct rb_node		server_rb;	/* link in server->fs_vnodes */
	struct rb_node		cb_promise;	/* link in server->cb_promises */
	struct work_struct	cb_broken_work;	/* work to be done on callback break */
	time_t			cb_expires;	/* time at which callback expires */
	time_t			cb_expires_at;	/* time used to order cb_promise */
	time64_t		cb_expires;	/* time at which callback expires */
	time64_t		cb_expires_at;	/* time used to order cb_promise */
	unsigned		cb_version;	/* callback version */
	unsigned		cb_expiry;	/* callback expiry time */
	afs_callback_type_t	cb_type;	/* type of callback */