FS_LOCK;
/* date volume instance was created */
if (async) {
- if (avol && avol->header)
+ if (avol)
async->spare1 = avol->header->diskstuff.creationDate;
else
async->spare1 = 0;
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 */
if (!VanillaUser(*client))
(*rights) |= PRSFS_LOOKUP;
#endif /* ADMIN_IMPLICIT_LOOKUP */
+ }
gvpdone:
if (errorCode)
rx_KeepAliveOn(acall);
- }
return errorCode;
} /*GetVolumePackage */
if (size > len)
size = len;
- buff = (char *)malloc(COPYBUFFSIZE);
+ buff = malloc(COPYBUFFSIZE);
if (buff == NULL) {
return EIO;
}
RXGetVolumeStatus(AFSFetchVolumeStatus * status, char **name, char **offMsg,
char **motd, Volume * volptr)
{
- int temp;
status->Vid = V_id(volptr);
status->ParentId = V_parentId(volptr);
status->PartMaxBlocks = RoundInt64ToInt31(volptr->partition->totalUsable);
/* now allocate and copy these things; they're freed by the RXGEN stub */
- temp = strlen(V_name(volptr)) + 1;
- *name = malloc(temp);
+ *name = strdup(V_name(volptr));
if (!*name) {
ViceLogThenPanic(0, ("Failed malloc in RXGetVolumeStatus\n"));
}
- strcpy(*name, V_name(volptr));
- temp = strlen(V_offlineMessage(volptr)) + 1;
- *offMsg = malloc(temp);
+ *offMsg = strdup(V_offlineMessage(volptr));
if (!*offMsg) {
ViceLogThenPanic(0, ("Failed malloc in RXGetVolumeStatus\n"));
}
- strcpy(*offMsg, V_offlineMessage(volptr));
*motd = malloc(1);
if (!*motd) {
ViceLogThenPanic(0, ("Failed malloc in RXGetVolumeStatus\n"));
}
/* allocate space for return output parameters */
- OutStats->AFSBulkStats_val = (struct AFSFetchStatus *)
- malloc(nfiles * sizeof(struct AFSFetchStatus));
+ OutStats->AFSBulkStats_val = malloc(nfiles * sizeof(struct AFSFetchStatus));
if (!OutStats->AFSBulkStats_val) {
ViceLogThenPanic(0, ("Failed malloc in SRXAFS_BulkStatus\n"));
}
OutStats->AFSBulkStats_len = nfiles;
- CallBacks->AFSCBs_val = (struct AFSCallBack *)
- malloc(nfiles * sizeof(struct AFSCallBack));
+ CallBacks->AFSCBs_val = malloc(nfiles * sizeof(struct AFSCallBack));
if (!CallBacks->AFSCBs_val) {
ViceLogThenPanic(0, ("Failed malloc in SRXAFS_BulkStatus\n"));
}
}
/* allocate space for return output parameters */
- OutStats->AFSBulkStats_val = (struct AFSFetchStatus *)
- malloc(nfiles * sizeof(struct AFSFetchStatus));
+ OutStats->AFSBulkStats_val = calloc(nfiles, sizeof(struct AFSFetchStatus));
if (!OutStats->AFSBulkStats_val) {
ViceLogThenPanic(0, ("Failed malloc in SRXAFS_FetchStatus\n"));
}
OutStats->AFSBulkStats_len = nfiles;
- CallBacks->AFSCBs_val = (struct AFSCallBack *)
- malloc(nfiles * sizeof(struct AFSCallBack));
+ CallBacks->AFSCBs_val = calloc(nfiles, sizeof(struct AFSCallBack));
if (!CallBacks->AFSCBs_val) {
ViceLogThenPanic(0, ("Failed malloc in SRXAFS_FetchStatus\n"));
}
CallBacks->AFSCBs_len = nfiles;
/* Zero out return values to avoid leaking information on partial succes */
- memset(OutStats->AFSBulkStats_val, 0, nfiles * sizeof(struct AFSFetchStatus));
- memset(CallBacks->AFSCBs_val, 0, nfiles * sizeof(struct AFSCallBack));
memset(Sync, 0, sizeof(*Sync));
if ((errorCode = CallPreamble(acall, ACTIVECALL, &tcon, &thost))) {
* for the File Server.
*/
dataBytes = sizeof(struct afs_Stats);
- dataBuffP = (afs_int32 *) malloc(dataBytes);
+ dataBuffP = malloc(dataBytes);
memcpy(dataBuffP, &afs_cmstats, dataBytes);
a_dataP->AFS_CollData_len = dataBytes >> 2;
a_dataP->AFS_CollData_val = dataBuffP;
*/
dataBytes = sizeof(struct afs_PerfStats);
- dataBuffP = (afs_int32 *) malloc(dataBytes);
+ dataBuffP = malloc(dataBytes);
memcpy(dataBuffP, &afs_perfstats, dataBytes);
a_dataP->AFS_CollData_len = dataBytes >> 2;
a_dataP->AFS_CollData_val = dataBuffP;
*/
dataBytes = sizeof(struct fs_stats_FullPerfStats);
- dataBuffP = (afs_int32 *) malloc(dataBytes);
+ dataBuffP = malloc(dataBytes);
memcpy(dataBuffP, &afs_FullPerfStats, dataBytes);
a_dataP->AFS_CollData_len = dataBytes >> 2;
a_dataP->AFS_CollData_val = dataBuffP;
afs_perfstats.numPerfCalls++;
dataBytes = sizeof(struct cbcounters);
- dataBuffP = (afs_int32 *) malloc(dataBytes);
+ dataBuffP = malloc(dataBytes);
{
extern struct cbcounters cbstuff;
dataBuffP[0]=cbstuff.DeleteFiles;
goto Bad_GetCaps;
dataBytes = 1 * sizeof(afs_int32);
- dataBuffP = (afs_uint32 *) malloc(dataBytes);
+ dataBuffP = malloc(dataBytes);
dataBuffP[0] = VICED_CAPABILITY_ERRORTRANS | VICED_CAPABILITY_WRITELOCKACL;
dataBuffP[0] |= VICED_CAPABILITY_64BITFILES;
if (saneacls)
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,
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) {
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;
&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:
ViceLog(2, ("SAFS_GetVolumeStatus returns %d\n", errorCode));
/* next is to guarantee out strings exist for stub */
if (*Name == 0) {
- *Name = (char *)malloc(1);
+ *Name = malloc(1);
**Name = 0;
}
if (*Motd == 0) {
- *Motd = (char *)malloc(1);
+ *Motd = malloc(1);
**Motd = 0;
}
if (*OfflineMsg == 0) {
- *OfflineMsg = (char *)malloc(1);
+ *OfflineMsg = malloc(1);
**OfflineMsg = 0;
}
errorCode = CallPostamble(tcon, errorCode, thost);