source: trunk/server/common/patches/openafs-mvid-NULL-deref.patch @ 2659

Last change on this file since 2659 was 2644, checked in by andersk, 9 years ago
OpenAFS: avoid mvid NULL deref in check_bad_parent Patch from http://gerrit.openafs.org/11616 .
File size: 2.1 KB
RevLine 
[2644]1From 97ca2bad9577380b10e7179ebecfc2dfa3fe4626 Mon Sep 17 00:00:00 2001
2From: Andrew Deason <adeason@sinenomine.net>
3Date: Mon, 1 Dec 2014 10:23:23 -0600
4Subject: [PATCH] Do not submit: LINUX: Avoid mvid NULL deref in
5 check_bad_parent
6
7check_bad_parent dereferences vcp->mvid, assuming it is not NULL (vcp
8is a root vcache here, so mvid refers to the parent fid). However, in
9some situations, vcp->mvid can be NULL.
10
11When we first afs_GetVCache the fid, we try to set mvid by setting
12mvid to the 'dotdot' structure in the volume struct. But we get that
13volume struct from afs_GetVolume, which can fail (at the very least,
14this can fail on network failure when looking up vldb information). If
15it fails, then we do not set the mvid parent. On future lookups for
16the fid, afs_GetVCache will return early for a fastpath, if the vcache
17is already in memory. So, mvid will never get set in such a situation.
18
19We also set the mvid parent fid in afs_lookup if we resolved a
20mountpoint to the root vcache. However, this is skipped if CMValid is
21not set on the vcache, so if CMValid is cleared right after resolving
22the mountpoint (say, perhaps done by some other thread e.g. a callback
23break or other reasons), then the mvid parent fid will not be set.
24
25To avoid crashing in these situations, if vcp->mvid is NULL in
26check_bad_parent, don't check the mvid, and assume it does not match
27(since we don't know what it is).
28
29FIXES 131967
30
31Change-Id: I3550cf5a01811ede17d74770161326667a6e8628
32---
33 src/afs/LINUX/osi_vnodeops.c | 2 +-
34 1 file changed, 1 insertion(+), 1 deletion(-)
35
36diff --git a/src/afs/LINUX/osi_vnodeops.c b/src/afs/LINUX/osi_vnodeops.c
37index 9a164ea..959e320 100644
38--- a/src/afs/LINUX/osi_vnodeops.c
39+++ b/src/afs/LINUX/osi_vnodeops.c
40@@ -949,7 +949,7 @@ check_bad_parent(struct dentry *dp)
41     parent = dget_parent(dp);
42     pvc = VTOAFS(parent->d_inode);
43 
44-    if (vcp->mvid->Fid.Volume != pvc->f.fid.Fid.Volume) {      /* bad parent */
45+    if (!vcp->mvid || vcp->mvid->Fid.Volume != pvc->f.fid.Fid.Volume) {        /* bad parent */
46        credp = crref();
47 
48        /* force a lookup, so vcp->mvid is fixed up */
49--
502.2.0
51
Note: See TracBrowser for help on using the repository browser.