/*
- * Copyright (c) 2000-2006, 2009 Apple Inc. All rights reserved.
+ * Copyright (c) 2000-2006, 2009-2011, 2015, 2018, 2019 Apple Inc. All rights reserved.
*
* @APPLE_LICENSE_HEADER_START@
- *
+ *
* This file contains Original Code and/or Modifications of Original Code
* as defined in and that are subject to the Apple Public Source License
* Version 2.0 (the 'License'). You may not use this file except in
* compliance with the License. Please obtain a copy of the License at
* http://www.opensource.apple.com/apsl/ and read it before using this
* file.
- *
+ *
* The Original Code and all software distributed under the License are
* distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
* EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
* FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
* Please see the License for the specific language governing rights and
* limitations under the License.
- *
+ *
* @APPLE_LICENSE_HEADER_END@
*/
#define SNAPSHOT_PATH_STATE _PATH_VARTMP "configd-state"
-#define SNAPSHOT_PATH_STORE _PATH_VARTMP "configd-store.xml"
-#define SNAPSHOT_PATH_PATTERN _PATH_VARTMP "configd-pattern.xml"
-#define SNAPSHOT_PATH_SESSION _PATH_VARTMP "configd-session.xml"
+#define SNAPSHOT_PATH_STORE _PATH_VARTMP "configd-store.plist"
+#define SNAPSHOT_PATH_PATTERN _PATH_VARTMP "configd-pattern.plist"
#define N_QUICK 100
-static CFDictionaryRef
+static CF_RETURNS_RETAINED CFDictionaryRef
_expandStore(CFDictionaryRef storeData)
{
const void * keys_q[N_QUICK];
oValues = CFAllocatorAllocate(NULL, nElements * sizeof(CFTypeRef), 0);
nValues = CFAllocatorAllocate(NULL, nElements * sizeof(CFTypeRef), 0);
}
- bzero(nValues, nElements * sizeof(CFTypeRef));
+ memset(nValues, 0, nElements * sizeof(CFTypeRef));
CFDictionaryGetKeysAndValues(storeData, keys, oValues);
for (i = 0; i < nElements; i++) {
if (data) {
CFPropertyListRef plist;
+ nValues[i] = CFDictionaryCreateMutableCopy(NULL, 0, oValues[i]);
+
if (!_SCUnserialize(&plist, data, NULL, 0)) {
- goto done;
+ SC_log(LOG_NOTICE, "_SCUnserialize() failed, key=%@", keys[i]);
+ continue;
}
- nValues[i] = CFDictionaryCreateMutableCopy(NULL, 0, oValues[i]);
CFDictionarySetValue((CFMutableDictionaryRef)nValues[i],
kSCDData,
plist);
&kCFTypeDictionaryKeyCallBacks,
&kCFTypeDictionaryValueCallBacks);
- done :
-
if (nElements > 0) {
CFIndex i;
for (i = 0; i < nElements; i++) {
- if (nValues[i]) CFRelease(nValues[i]);
+ CFRelease(nValues[i]);
}
if (keys != keys_q) {
int
__SCDynamicStoreSnapshot(SCDynamicStoreRef store)
{
+#pragma unused(store)
CFDictionaryRef expandedStoreData;
FILE *f;
int fd;
- serverSessionRef mySession;
- SCDynamicStorePrivateRef storePrivate = (SCDynamicStorePrivateRef)store;
CFDataRef xmlData;
- /* check credentials */
-
- mySession = getSession(storePrivate->server);
- if (!hasRootAccess(mySession)) {
- return kSCStatusAccessError;
- }
-
/* Save a snapshot of configd's "state" */
(void) unlink(SNAPSHOT_PATH_STATE);
if (f == NULL) {
return kSCStatusFailed;
}
- SCPrint(TRUE, f, CFSTR("Main thread :\n\n"));
+ SCPrint(TRUE, f, CFSTR("Main [plug-in] thread :\n\n"));
SCPrint(TRUE, f, CFSTR("%@\n"), CFRunLoopGetCurrent());
- if (plugin_runLoop != NULL) {
- SCPrint(TRUE, f, CFSTR("Plug-in thread :\n\n"));
- SCPrint(TRUE, f, CFSTR("%@\n"), plugin_runLoop);
- }
listSessions(f);
(void) fclose(f);
}
expandedStoreData = _expandStore(storeData);
- xmlData = CFPropertyListCreateXMLData(NULL, expandedStoreData);
+ xmlData = CFPropertyListCreateData(NULL, expandedStoreData, kCFPropertyListXMLFormat_v1_0, 0, NULL);
CFRelease(expandedStoreData);
- if (!xmlData) {
- SCLog(TRUE, LOG_ERR, CFSTR("__SCDynamicStoreSnapshot CFPropertyListCreateXMLData() failed"));
+ if (xmlData == NULL) {
+ SC_log(LOG_NOTICE, "CFPropertyListCreateData() failed");
close(fd);
return kSCStatusFailed;
}
return kSCStatusFailed;
}
- xmlData = CFPropertyListCreateXMLData(NULL, patternData);
- if (!xmlData) {
- SCLog(TRUE, LOG_ERR, CFSTR("__SCDynamicStoreSnapshot CFPropertyListCreateXMLData() failed"));
- close(fd);
- return kSCStatusFailed;
- }
- (void) write(fd, CFDataGetBytePtr(xmlData), CFDataGetLength(xmlData));
- (void) close(fd);
- CFRelease(xmlData);
-
- /* Save a snapshot of the "session" data */
-
- (void) unlink(SNAPSHOT_PATH_SESSION);
- fd = open(SNAPSHOT_PATH_SESSION, O_WRONLY|O_CREAT|O_TRUNC|O_EXCL, 0644);
- if (fd == -1) {
- return kSCStatusFailed;
- }
-
- xmlData = CFPropertyListCreateXMLData(NULL, sessionData);
- if (!xmlData) {
- SCLog(TRUE, LOG_ERR, CFSTR("__SCDynamicStoreSnapshot CFPropertyListCreateXMLData() failed"));
+ xmlData = CFPropertyListCreateData(NULL, patternData, kCFPropertyListXMLFormat_v1_0, 0, NULL);
+ if (xmlData == NULL) {
+ SC_log(LOG_NOTICE, "CFPropertyListCreateData() failed");
close(fd);
return kSCStatusFailed;
}
__private_extern__
kern_return_t
-_snapshot(mach_port_t server, int *sc_status)
+_snapshot(mach_port_t server, int *sc_status, audit_token_t audit_token)
{
- serverSessionRef mySession = getSession(server);
+ serverSessionRef mySession;
+ mySession = getSession(server);
if (mySession == NULL) {
- *sc_status = kSCStatusNoStoreSession; /* you must have an open session to play */
- return KERN_SUCCESS;
+ mySession = tempSession(server, CFSTR("SCDynamicStoreSnapshot"), audit_token);
+ if (mySession == NULL) {
+ /* you must have an open session to play */
+ return kSCStatusNoStoreSession;
+ }
+ }
+
+ if (!hasRootAccess(mySession)) {
+ return kSCStatusAccessError;
}
*sc_status = __SCDynamicStoreSnapshot(mySession->store);