viced: RXAFS_GetVolumeStatus remove access check
[openafs.git] / src / viced / afsfileprocs.c
index a3070f6..f99326e 100644 (file)
@@ -847,9 +847,10 @@ GetVolumePackageWithCall(struct rx_call *acall, struct VCallByVol *cbv,
        if (!(*client)) {
            if ((errorCode = GetClient(tcon, client)) != 0)
                goto gvpdone;
-           if (!(*client))
+           if (!(*client)) {
                errorCode = EINVAL;
                goto gvpdone;
+           }
        }
        GetRights(*client, aCL, rights, anyrights);
        /* ok, if this is not a dir, set the PRSFS_ADMINISTER bit iff we're the owner */
@@ -5615,6 +5616,25 @@ SRXAFS_GetCapabilities(struct rx_call * acall, Capabilities * capabilities)
     return 0;
 }
 
+/* client is held, but not locked */
+static int
+FlushClientCPS(struct client *client, void *arock)
+{
+    ObtainWriteLock(&client->lock);
+
+    client->prfail = 2;        /* Means re-eval client's cps */
+
+    if ((client->ViceId != ANONYMOUSID) && client->CPS.prlist_val) {
+       free(client->CPS.prlist_val);
+       client->CPS.prlist_val = NULL;
+       client->CPS.prlist_len = 0;
+    }
+
+    ReleaseWriteLock(&client->lock);
+
+    return 0;
+}
+
 afs_int32
 SRXAFS_FlushCPS(struct rx_call * acall, struct ViceIds * vids,
                struct IPAddrs * addrs, afs_int32 spare1, afs_int32 * spare2,
@@ -5624,12 +5644,17 @@ SRXAFS_FlushCPS(struct rx_call * acall, struct ViceIds * vids,
     afs_int32 nids, naddrs;
     afs_int32 *vd, *addr;
     Error errorCode = 0;               /* return code to caller */
-    struct client *client = 0;
 
     ViceLog(1, ("SRXAFS_FlushCPS\n"));
     FS_LOCK;
     AFSCallStats.TotalCalls++;
     FS_UNLOCK;
+
+    if (!viced_SuperUser(acall)) {
+       errorCode = EPERM;
+       goto Bad_FlushCPS;
+    }
+
     nids = vids->ViceIds_len;  /* # of users in here */
     naddrs = addrs->IPAddrs_len;       /* # of hosts in here */
     if (nids < 0 || naddrs < 0) {
@@ -5641,23 +5666,7 @@ SRXAFS_FlushCPS(struct rx_call * acall, struct ViceIds * vids,
     for (i = 0; i < nids; i++, vd++) {
        if (!*vd)
            continue;
-       client = h_ID2Client(*vd);      /* returns write locked and refCounted, or NULL */
-       if (!client)
-           continue;
-
-       client->prfail = 2;     /* Means re-eval client's cps */
-#ifdef notdef
-       if (client->tcon) {
-           rx_SetRock(((struct rx_connection *)client->tcon), 0);
-       }
-#endif
-       if ((client->ViceId != ANONYMOUSID) && client->CPS.prlist_val) {
-           free(client->CPS.prlist_val);
-           client->CPS.prlist_val = NULL;
-           client->CPS.prlist_len = 0;
-       }
-       ReleaseWriteLock(&client->lock);
-       PutClient(&client);
+       h_EnumerateClients(*vd, FlushClientCPS, NULL);
     }
 
     addr = addrs->IPAddrs_val;
@@ -5867,10 +5876,6 @@ SRXAFS_GetVolumeStatus(struct rx_call * acall, afs_int32 avolid,
                          &rights, &anyrights)))
        goto Bad_GetVolumeStatus;
 
-    if ((VanillaUser(client)) && (!(rights & PRSFS_READ))) {
-       errorCode = EACCES;
-       goto Bad_GetVolumeStatus;
-    }
     (void)RXGetVolumeStatus(FetchVolStatus, Name, OfflineMsg, Motd, volptr);
 
   Bad_GetVolumeStatus: