]> git.saurik.com Git - cycript.git/blame - Select.cpp
Fix pointer crashes and round-trip const void *.
[cycript.git] / Select.cpp
CommitLineData
604ed881
JF
1/* Cycript - Optimizing JavaScript Compiler/Runtime
2 * Copyright (C) 2009-2013 Jay Freeman (saurik)
3*/
4
5/* GNU General Public License, Version 3 {{{ */
6/*
7 * Cycript is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published
9 * by the Free Software Foundation, either version 3 of the License,
10 * or (at your option) any later version.
11 *
12 * Cycript is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with Cycript. If not, see <http://www.gnu.org/licenses/>.
19**/
20/* }}} */
21
22#include <cstring>
23
24#include <stdint.h>
25
26#include <dlfcn.h>
27#include <syslog.h>
28#include <unistd.h>
29
30#include <mach-o/dyld.h>
31
8e8e69a7 32extern "C" void CYHandleServer(pid_t pid, char *data, size_t size) {
604ed881
JF
33 Dl_info addr;
34 if (dladdr(reinterpret_cast<void *>(&CYHandleServer), &addr) == 0)
35 return;
36
37 const char *fname(addr.dli_fname);
38 size_t length(strlen(fname));
39
3370d0c0 40 const char *target;
604ed881
JF
41#ifdef __APPLE__
42 // XXX: THIS IS HORRIBLE OMG I NEED TO FIX THIS ASAP
43 bool simulator(false);
44 for (uint32_t i(0), e(_dyld_image_count()); i != e; ++i) {
45 if (strstr(_dyld_get_image_name(i), "/SDKs/iPhoneSimulator") != NULL)
46 simulator = true;
47 }
48 if (simulator)
3370d0c0 49 target = "sim";
604ed881
JF
50 else
51#endif
52 // someone threw a fit about dangling #endif + else
53 // the idea that this bothers someone gives me glee
3370d0c0 54 target = "sys";
604ed881 55
3370d0c0
JF
56 char library[length + 1];
57 memcpy(library, fname, length);
58 memcpy(library + length - 6 - 3, target, 3);
59 library[length] = '\0';
604ed881
JF
60
61 void *handle(dlopen(library, RTLD_LOCAL | RTLD_LAZY));
62 if (handle == NULL) {
8e8e69a7 63 strlcpy(data, dlerror(), size);
604ed881
JF
64 return;
65 }
66
67 void *symbol(dlsym(handle, "CYHandleServer"));
8e8e69a7
JF
68 if (symbol == NULL) {
69 strlcpy(data, dlerror(), size);
604ed881 70 return;
8e8e69a7 71 }
604ed881
JF
72
73 reinterpret_cast<void (*)(pid_t)>(symbol)(pid);
74}