Skip to content

Commit

Permalink
Rename LSUUID and checkLuaSkinInstance to variations of 'GCCanary'
Browse files Browse the repository at this point in the history
  • Loading branch information
cmsj committed May 1, 2021
1 parent 1f5009c commit e5c2ced
Show file tree
Hide file tree
Showing 16 changed files with 88 additions and 88 deletions.
10 changes: 5 additions & 5 deletions LuaSkin/LuaSkin/Skin.h
Expand Up @@ -50,9 +50,9 @@ extern int luaopen_luaskin_internal(lua_State* L) ; // entry vector to luaskin.m
typedef int LSRefTable;

#define LSUUIDLen 37
typedef struct LSUUID {
typedef struct LSGCCanary {
char uuid[LSUUIDLen];
} LSUUID;
} LSGCCanary;

// Define some bits for masking operations in the argument checker
/*!
Expand Down Expand Up @@ -283,9 +283,9 @@ NSString *specMaskToString(int spec);
*/
- (void)resetLuaState;

- (BOOL)checkLuaSkinInstance:(LSUUID)lsUUID;
- (LSUUID)getLuaSkinUUID;
- (void)gcLuaSkinUUID:(LSUUID *)lsUUID;
- (BOOL)checkGCCanary:(LSGCCanary)canary;
- (LSGCCanary)createGCCanary;
- (void)destroyGCCanary:(LSGCCanary *)canary;

#pragma mark - Methods for calling into Lua from C

Expand Down
26 changes: 13 additions & 13 deletions LuaSkin/LuaSkin/Skin.m
Expand Up @@ -333,37 +333,37 @@ - (void)resetLuaState {
[self createLuaState];
}

- (BOOL)checkLuaSkinInstance:(LSUUID)lsUUID {
- (BOOL)checkGCCanary:(LSGCCanary)canary {
if (!self.L) {
[self logBreadcrumb:@"LuaSkin nil lua_State detected"];
return NO;
}

NSString *NSlsUUID = [NSString stringWithCString:lsUUID.uuid encoding:NSUTF8StringEncoding];
if (!NSlsUUID || ![self.uuid.UUIDString isEqualToString:NSlsUUID]) {
[self logKnownBug:[NSString stringWithFormat:@"LuaSkin UUID mismatch detected: %s from the callback, %@ from the current LuaSkin instance", lsUUID.uuid, self.uuid.UUIDString]];
NSString *NSlsCanary = [NSString stringWithCString:canary.uuid encoding:NSUTF8StringEncoding];
if (!NSlsCanary || ![self.uuid.UUIDString isEqualToString:NSlsCanary]) {
[self logWarn:@"LuaSkin has caught an attempt to operate on an object that has been garbage collected."];
return NO;
}

return YES;
}

- (LSUUID)getLuaSkinUUID {
LSUUID lsUUID;
memset(lsUUID.uuid, 0, LSUUIDLen);
strncpy(lsUUID.uuid, "UNINITIALISED", 13);
- (LSGCCanary)createGCCanary {
LSGCCanary canary;
memset(canary.uuid, 0, LSUUIDLen);
strncpy(canary.uuid, "UNINITIALISED", 13);

const char *tmpUUID = [self.uuid.UUIDString cStringUsingEncoding:NSUTF8StringEncoding];
if (tmpUUID) {
strncpy(lsUUID.uuid, tmpUUID, LSUUIDLen);
strncpy(canary.uuid, tmpUUID, LSUUIDLen);
}

return lsUUID;
return canary;
}

- (void)gcLuaSkinUUID:(LSUUID *)lsUUID {
memset(lsUUID->uuid, 0, LSUUIDLen);
strncpy(lsUUID->uuid, "GC", 2);
- (void)destroyGCCanary:(LSGCCanary *)canary {
memset(canary->uuid, 0, LSUUIDLen);
strncpy(canary->uuid, "GC", 2);
}

#pragma mark - Methods for calling into Lua from C
Expand Down
8 changes: 4 additions & 4 deletions extensions/audiodevice/internal.m
Expand Up @@ -19,7 +19,7 @@
AudioDeviceID deviceId;
int callback;
BOOL watcherRunning;
LSUUID luaSkinUUID;
LSGCCanary lsCanary;
} audioDeviceUserData;

// Define a datatype for hs.audiodevice.datasource objects
Expand Down Expand Up @@ -82,7 +82,7 @@ OSStatus audiodevice_callback(AudioDeviceID deviceID, UInt32 numAddresses, const

audioDeviceUserData *userData = (audioDeviceUserData *)clientData;
LuaSkin *skin = [LuaSkin sharedWithState:NULL];
if (![skin checkLuaSkinInstance:userData->luaSkinUUID]) {
if (![skin checkGCCanary:userData->lsCanary]) {
return;
}

Expand Down Expand Up @@ -145,7 +145,7 @@ void new_device(lua_State* L, AudioDeviceID deviceId) {
audioDevice->watcherRunning = NO;

LuaSkin *skin = [LuaSkin sharedWithState:L];
audioDevice->luaSkinUUID = [skin getLuaSkinUUID];
audioDevice->lsCanary = [skin createGCCanary];

luaL_getmetatable(L, USERDATA_TAG);
lua_setmetatable(L, -2);
Expand Down Expand Up @@ -1711,7 +1711,7 @@ static int audiodevice_gc(lua_State* L) {
audiodevice_watcherStop(L);

audioDevice->callback = [skin luaUnref:refTable ref:audioDevice->callback];
[skin gcLuaSkinUUID:&(audioDevice->luaSkinUUID)];
[skin destroyGCCanary:&(audioDevice->lsCanary)];

return 0;
}
Expand Down
8 changes: 4 additions & 4 deletions extensions/battery/watcher.m
Expand Up @@ -21,15 +21,15 @@
CFRunLoopSourceRef t;
int fn;
bool started;
LSUUID luaSkinUUID;
LSGCCanary lsCanary;
} battery_watcher_t;

static void callback(void *info) {
LuaSkin *skin = [LuaSkin sharedWithState:NULL];

battery_watcher_t* t = info;

if (![skin checkLuaSkinInstance:t->luaSkinUUID]) {
if (![skin checkGCCanary:t->lsCanary]) {
return;
}

Expand Down Expand Up @@ -69,7 +69,7 @@ static int battery_watcher_new(lua_State* L) {

watcher->t = IOPSNotificationCreateRunLoopSource(callback, watcher);
watcher->started = false;
watcher->luaSkinUUID = [skin getLuaSkinUUID];
watcher->lsCanary = [skin createGCCanary];
return 1;
}

Expand Down Expand Up @@ -123,7 +123,7 @@ static int battery_watcher_gc(lua_State* L) {
lua_pushcfunction(L, battery_watcher_stop) ; lua_pushvalue(L,1); lua_call(L, 1, 1);

watcher->fn = [skin luaUnref:refTable ref:watcher->fn];
[skin gcLuaSkinUUID:&(watcher->luaSkinUUID)];
[skin destroyGCCanary:&(watcher->lsCanary)];
CFRunLoopSourceInvalidate(watcher->t);
CFRelease(watcher->t);
return 0;
Expand Down
8 changes: 4 additions & 4 deletions extensions/caffeinate/watcher.m
Expand Up @@ -70,7 +70,7 @@
bool running;
int fn;
void* obj;
LSUUID luaSkinUUID;
LSGCCanary lsCanary;
} caffeinatewatcher_t;

typedef enum _event_t {
Expand Down Expand Up @@ -105,7 +105,7 @@ - (id)initWithObject:(caffeinatewatcher_t*)object {
- (void)callback:(NSDictionary* __unused)dict withEvent:(event_t)event {
if (self.object->fn != LUA_NOREF) {
LuaSkin *skin = [LuaSkin sharedWithState:NULL];
[skin checkLuaSkinInstance:self.object->luaSkinUUID];
[skin checkGCCanary:self.object->lsCanary];
lua_State *L = skin.L;
_lua_stackguard_entry(L);

Expand Down Expand Up @@ -188,7 +188,7 @@ static int caffeinate_watcher_new(lua_State* L) {
caffeinateWatcher->fn = [skin luaRef:refTable];
caffeinateWatcher->running = NO;
caffeinateWatcher->obj = (__bridge_retained void*) [[CaffeinateWatcher alloc] initWithObject:caffeinateWatcher];
caffeinateWatcher->luaSkinUUID = [skin getLuaSkinUUID];
caffeinateWatcher->lsCanary = [skin createGCCanary];

luaL_getmetatable(L, USERDATA_TAG);
lua_setmetatable(L, -2);
Expand Down Expand Up @@ -331,7 +331,7 @@ static int caffeinate_watcher_gc(lua_State* L) {
caffeinate_watcher_stop(L);

caffeinateWatcher->fn = [skin luaUnref:refTable ref:caffeinateWatcher->fn];
[skin gcLuaSkinUUID:&(caffeinateWatcher->luaSkinUUID)];
[skin destroyGCCanary:&(caffeinateWatcher->lsCanary)];

CaffeinateWatcher* object = (__bridge_transfer CaffeinateWatcher*)caffeinateWatcher->obj;
object = nil;
Expand Down
8 changes: 4 additions & 4 deletions extensions/eventtap/internal.m
Expand Up @@ -9,7 +9,7 @@
CGEventMask mask;
CFMachPortRef tap;
CFRunLoopSourceRef runloopsrc;
LSUUID luaSkinUUID;
LSGCCanary lsCanary;
} eventtap_t;

CGEventRef eventtap_callback(CGEventTapProxy proxy, CGEventType type, CGEventRef event, void *refcon) {
Expand All @@ -19,7 +19,7 @@ CGEventRef eventtap_callback(CGEventTapProxy proxy, CGEventType type, CGEventRef
eventtap_t* e = refcon;

// Guard against this callback being delivered at a point where LuaSkin has been reset and our references wouldn't make sense anymore
if (![skin checkLuaSkinInstance:e->luaSkinUUID]) {
if (![skin checkGCCanary:e->lsCanary]) {
return event; // Allow the event to pass through unmodified
}

Expand Down Expand Up @@ -166,7 +166,7 @@ static int eventtap_new(lua_State* L) {
memset(eventtap, 0, sizeof(eventtap_t));

eventtap->tap = NULL ;
eventtap->luaSkinUUID = [skin getLuaSkinUUID];
eventtap->lsCanary = [skin createGCCanary];

lua_pushnil(L);
while (lua_next(L, 1) != 0) {
Expand Down Expand Up @@ -447,7 +447,7 @@ static int eventtap_gc(lua_State* L) {
}

eventtap->fn = [skin luaUnref:refTable ref:eventtap->fn];
[skin gcLuaSkinUUID:&(eventtap->luaSkinUUID)];
[skin destroyGCCanary:&(eventtap->lsCanary)];

return 0;
}
Expand Down
8 changes: 4 additions & 4 deletions extensions/hotkey/internal.m
Expand Up @@ -99,7 +99,7 @@ static int remove_hotkey(lua_State* L, int x) {
int repeatfn;
BOOL enabled;
EventHotKeyRef carbonHotKey;
LSUUID luaSkinUUID;
LSGCCanary lsCanary;
} hotkey_t;


Expand Down Expand Up @@ -135,7 +135,7 @@ static int hotkey_new(lua_State* L) {
hotkey_t* hotkey = lua_newuserdata(L, sizeof(hotkey_t));
memset(hotkey, 0, sizeof(hotkey_t));

hotkey->luaSkinUUID = [skin getLuaSkinUUID];
hotkey->lsCanary = [skin createGCCanary];
hotkey->carbonHotKey = nil;
hotkey->keycode = keycode;

Expand Down Expand Up @@ -308,7 +308,7 @@ static int hotkey_gc(lua_State* L) {
hotkey->pressedfn = [skin luaUnref:refTable ref:hotkey->pressedfn];
hotkey->releasedfn = [skin luaUnref:refTable ref:hotkey->releasedfn];
hotkey->repeatfn = [skin luaUnref:refTable ref:hotkey->repeatfn];
[skin gcLuaSkinUUID:&(hotkey->luaSkinUUID)];
[skin destroyGCCanary:&(hotkey->lsCanary)];

return 0;
}
Expand Down Expand Up @@ -343,7 +343,7 @@ static OSStatus trigger_hotkey_callback(int eventUID, int eventKind, BOOL isRepe
hotkey_t* hotkey = push_hotkey(L, eventUID);
lua_pop(L, 1);

if (![skin checkLuaSkinInstance:hotkey->luaSkinUUID]) {
if (![skin checkGCCanary:hotkey->lsCanary]) {
return noErr;
}

Expand Down
8 changes: 4 additions & 4 deletions extensions/network/configurationinternal.m
Expand Up @@ -16,7 +16,7 @@
int callbackRef ;
int selfRef ;
BOOL watcherEnabled ;
LSUUID luaSkinUUID;
LSGCCanary lsCanary;
} dynamicstore_t;

static void doDynamicStoreCallback(__unused SCDynamicStoreRef store, CFArrayRef changedKeys, void *info) {
Expand All @@ -26,7 +26,7 @@ static void doDynamicStoreCallback(__unused SCDynamicStoreRef store, CFArrayRef
if ((thePtr->callbackRef != LUA_NOREF) && (thePtr->selfRef != LUA_NOREF)) {
LuaSkin *skin = [LuaSkin sharedWithState:NULL] ;
lua_State *L = [skin L] ;
if (![skin checkLuaSkinInstance:thePtr->luaSkinUUID]) {
if (![skin checkGCCanary:thePtr->lsCanary]) {
return;
}
_lua_stackguard_entry(L);
Expand Down Expand Up @@ -69,7 +69,7 @@ static int newStoreObject(lua_State *L) {
thePtr->callbackRef = LUA_NOREF ;
thePtr->selfRef = LUA_NOREF ;
thePtr->watcherEnabled = NO ;
thePtr->luaSkinUUID = [skin getLuaSkinUUID];
thePtr->lsCanary = [skin createGCCanary];

luaL_getmetatable(L, USERDATA_TAG) ;
lua_setmetatable(L, -2) ;
Expand Down Expand Up @@ -654,7 +654,7 @@ static int userdata_gc(lua_State* L) {
}
}
thePtr->selfRef = [skin luaUnref:refTable ref:thePtr->selfRef] ;
[skin gcLuaSkinUUID:&(thePtr->luaSkinUUID)];
[skin destroyGCCanary:&(thePtr->lsCanary)];

CFRelease(thePtr->storeObject) ;
lua_pushnil(L) ;
Expand Down
8 changes: 4 additions & 4 deletions extensions/network/hostinternal.m
Expand Up @@ -19,7 +19,7 @@
CFHostInfoType resolveType ;
int selfRef ;
BOOL running ;
LSUUID luaSkinUUID;
LSGCCanary lsCanary;
} hshost_t;

static int pushCFHost(lua_State *L, CFHostRef theHost, CFHostInfoType resolveType) {
Expand All @@ -38,7 +38,7 @@ static int pushCFHost(lua_State *L, CFHostRef theHost, CFHostInfoType resolveTyp
thePtr->resolveType = resolveType ;
thePtr->selfRef = LUA_NOREF ;
thePtr->running = NO ;
thePtr->luaSkinUUID = [skin getLuaSkinUUID];
thePtr->lsCanary = [skin createGCCanary];

luaL_getmetatable(L, USERDATA_TAG) ;
lua_setmetatable(L, -2) ;
Expand Down Expand Up @@ -151,7 +151,7 @@ void handleCallback(__unused CFHostRef theHost, __unused CFHostInfoType typeInfo
LuaSkin *skin = [LuaSkin sharedWithState:NULL] ;
if (theRef->callbackRef != LUA_NOREF) {
lua_State *L = [skin L] ;
if (![skin checkLuaSkinInstance:theRef->luaSkinUUID]) {
if (![skin checkGCCanary:theRef->lsCanary]) {
return;
}
_lua_stackguard_entry(L);
Expand Down Expand Up @@ -421,7 +421,7 @@ static int userdata_gc(lua_State* L) {
theRef->callbackRef = [skin luaUnref:refTable ref:theRef->callbackRef] ;
// in case __gc forced by reload
theRef->selfRef = [skin luaUnref:refTable ref:theRef->selfRef] ;
[skin gcLuaSkinUUID:&(theRef->luaSkinUUID)];
[skin destroyGCCanary:&(theRef->lsCanary)];

lua_pushcfunction(L, cancelResolution) ;
lua_pushvalue(L, 1) ;
Expand Down
8 changes: 4 additions & 4 deletions extensions/network/reachabilityinternal.m
Expand Up @@ -19,7 +19,7 @@
int callbackRef ;
int selfRef ;
BOOL watcherEnabled ;
LSUUID luaSkinUUID;
LSGCCanary lsCanary;
} reachability_t;

static int pushSCNetworkReachability(lua_State *L, SCNetworkReachabilityRef theRef) {
Expand All @@ -31,7 +31,7 @@ static int pushSCNetworkReachability(lua_State *L, SCNetworkReachabilityRef theR
thePtr->callbackRef = LUA_NOREF ;
thePtr->selfRef = LUA_NOREF ;
thePtr->watcherEnabled = NO ;
thePtr->luaSkinUUID = [skin getLuaSkinUUID];
thePtr->lsCanary = [skin createGCCanary];

luaL_getmetatable(L, USERDATA_TAG) ;
lua_setmetatable(L, -2) ;
Expand All @@ -44,7 +44,7 @@ static void doReachabilityCallback(__unused SCNetworkReachabilityRef target, SCN
if ((theRef->callbackRef != LUA_NOREF) && (theRef->selfRef != LUA_NOREF)) {
LuaSkin *skin = [LuaSkin sharedWithState:NULL] ;
lua_State *L = [skin L] ;
if (![skin checkLuaSkinInstance:theRef->luaSkinUUID]) {
if (![skin checkGCCanary:theRef->lsCanary]) {
return;
}
_lua_stackguard_entry(L);
Expand Down Expand Up @@ -386,7 +386,7 @@ static int userdata_gc(lua_State* L) {
SCNetworkReachabilitySetDispatchQueue(theRef->reachabilityObj, NULL);
}
theRef->selfRef = [skin luaUnref:refTable ref:theRef->selfRef] ;
[skin gcLuaSkinUUID:&(theRef->luaSkinUUID)];
[skin destroyGCCanary:&(theRef->lsCanary)];

CFRelease(theRef->reachabilityObj) ;
lua_pushnil(L) ;
Expand Down
8 changes: 4 additions & 4 deletions extensions/pathwatcher/internal.m
Expand Up @@ -12,7 +12,7 @@
int closureref;
FSEventStreamRef stream;
bool started;
LSUUID luaSkinUUID;
LSGCCanary lsCanary;
} watcher_path_t;

#if MAC_OS_X_VERSION_MAX_ALLOWED < 1090
Expand Down Expand Up @@ -55,7 +55,7 @@ void event_callback(ConstFSEventStreamRef __unused streamRef, void *clientCallBa
LuaSkin *skin = [LuaSkin sharedWithState:NULL];
lua_State *L = skin.L;

if (![skin checkLuaSkinInstance:pw->luaSkinUUID]) {
if (![skin checkGCCanary:pw->lsCanary]) {
return;
}

Expand Down Expand Up @@ -125,7 +125,7 @@ static int watcher_path_new(lua_State* L) {

watcher_path_t* watcher_path = lua_newuserdata(L, sizeof(watcher_path_t));
watcher_path->started = NO;
watcher_path->luaSkinUUID = [skin getLuaSkinUUID];
watcher_path->lsCanary = [skin createGCCanary];

luaL_getmetatable(L, USERDATA_TAG);
lua_setmetatable(L, -2);
Expand Down Expand Up @@ -205,7 +205,7 @@ static int watcher_path_gc(lua_State* L) {
FSEventStreamRelease(watcher_path->stream);

watcher_path->closureref = [skin luaUnref:refTable ref:watcher_path->closureref];
[skin gcLuaSkinUUID:&(watcher_path->luaSkinUUID)];
[skin destroyGCCanary:&(watcher_path->lsCanary)];

return 0;
}
Expand Down

0 comments on commit e5c2ced

Please sign in to comment.