unsigned state;
};
+// String Helpers {{{
+static const UChar *(*_ZNK7WebCore6String10charactersEv)(const WebCore::String *);
+static const UChar *(*_ZN7WebCore6String29charactersWithNullTerminationEv)(const WebCore::String *);
+static unsigned (*_ZNK7WebCore6String6lengthEv)(const WebCore::String *);
+
+static bool StringGet(const WebCore::String &string, const UChar *&data, size_t &length) {
+ bool terminated;
+
+ if (_ZNK7WebCore6String10charactersEv != NULL) {
+ data = (*_ZNK7WebCore6String10charactersEv)(&string);
+ terminated = false;
+ } else if (_ZN7WebCore6String29charactersWithNullTerminationEv != NULL) {
+ data = (*_ZN7WebCore6String29charactersWithNullTerminationEv)(&string);
+ terminated = true;
+ } else return false;
+
+ if (_ZNK7WebCore6String6lengthEv != NULL)
+ length = (*_ZNK7WebCore6String6lengthEv)(&string);
+ else if (terminated)
+ for (length = 0; data[length] != 0; ++length);
+ else return false;
+
+ return true;
+}
+
+static bool StringEquals(const WebCore::String &string, const char *value) {
+ const UChar *data;
+ size_t size;
+ if (!StringGet(string, data, size))
+ return false;
+
+ size_t length(strlen(value));
+ if (size != length)
+ return false;
+
+ for (size_t index(0); index != length; ++index)
+ if (data[index] != value[index])
+ return false;
+
+ return true;
+}
+// }}}
// State Machine {{{
static bool cycript_;
MSHook(bool, _ZN7WebCore16MIMETypeRegistry29isSupportedJavaScriptMIMETypeERKNS_6StringE, const WebCore::String &mime) {
_trace();
- if (mime != "text/cycript") {
+ if (!StringEquals(mime, "text/cycript")) {
cycript_ = false;
return __ZN7WebCore16MIMETypeRegistry29isSupportedJavaScriptMIMETypeERKNS_6StringE(mime);
}
// }}}
// Script Compiler {{{
static void Log(const WebCore::String &string) {
- size_t length(string.length());
- UChar data[length + 1];
- data[length] = 0;
- memcpy(data, string.characters(), length * 2);
- NSLog(@"wtf %p:%S:", &string, data);
+ const UChar *data;
+ size_t length;
+ if (!StringGet(string, data, length))
+ return;
+
+ UChar terminated[length + 1];
+ terminated[length] = 0;
+ memcpy(terminated, data, length * 2);
+ NSLog(@"wtf %p:%zu:%S:", &string, length, terminated);
}
static void Cycriptify(apr_pool_t *pool, const uint16_t *&data, size_t &size) {
cycript_ = false;
- _trace();
if (void *handle = dlopen("/usr/lib/libcycript.dylib", RTLD_LAZY | RTLD_GLOBAL))
- if (void (*CYParseUChar)(apr_pool_t *, const uint16_t **, size_t *) = reinterpret_cast<void (*)(apr_pool_t *, const uint16_t **, size_t *)>(dlsym(handle, "CydgetPoolParse")))
- CYParseUChar(pool, &data, &size);
+ if (void (*CydgetPoolParse)(apr_pool_t *, const uint16_t **, size_t *) = reinterpret_cast<void (*)(apr_pool_t *, const uint16_t **, size_t *)>(dlsym(handle, "CydgetPoolParse")))
+ CydgetPoolParse(pool, &data, &size);
}
static void (*_ZN7WebCore6String6appendEPKtj)(WebCore::String *, const UChar *, unsigned);
if (!cycript_)
return;
- const uint16_t *data(source.characters());
- size_t length(source.length()), size(length);
+ const UChar *data;
+ size_t length;
+
+ if (!StringGet(source, data, length)) {
+ _trace();
+ return;
+ }
+
+ size_t size(length);
apr_pool_t *pool;
apr_pool_create(&pool, NULL);
function = reinterpret_cast<Type_>(dlsym(RTLD_DEFAULT, name));
}
+template <typename Type_>
+static void msset_(Type_ &function, const char *name, MSImageRef handle) {
+ function = reinterpret_cast<Type_>(MSFindSymbol(handle, name));
+}
+
+#define msset(function, handle) \
+ msset_(function, "_" #function, handle)
+
@implementation WebCycriptLockScreenController
+ (void) initialize {
nlset(_ZN7WebCore6String6appendEPKtj, nl, 6);
nlset(_ZN7WebCore6String8truncateEj, nl, 7);
+
+ MSImageRef JavaScriptCore(MSGetImageByName("/System/Library/PrivateFrameworks/JavaScriptCore.framework/JavaScriptCore"));
+ //MSImageRef WebCore(MSGetImageByName("/System/Library/PrivateFrameworks/WebCore.framework/WebCore"));
+
+ if (_ZN7WebCore6String6appendEPKtj == NULL)
+ msset(_ZN7WebCore6String6appendEPKtj, JavaScriptCore);
+
+ if (_ZN7WebCore6String8truncateEj == NULL)
+ msset(_ZN7WebCore6String8truncateEj, JavaScriptCore);
+
+ msset(_ZNK7WebCore6String10charactersEv, JavaScriptCore);
+ msset(_ZN7WebCore6String29charactersWithNullTerminationEv, JavaScriptCore);
+ msset(_ZNK7WebCore6String6lengthEv, JavaScriptCore);
}
+ (id) rootViewController {