1- #include < sys/types.h>
21#include < sys/wait.h>
32#include < sys/prctl.h>
43#include < sys/mman.h>
54#include < android/log.h>
6- #include < fcntl.h>
7- #include < unistd.h>
5+ #include < linux/fs.h>
86#include < syscall.h>
9- #include < random>
10- #include < string>
117
128#include < base.hpp>
139#include < flags.h>
@@ -18,6 +14,12 @@ using namespace std;
1814#define __call_bypassing_fortify (fn ) (&fn)
1915#endif
2016
17+ #ifdef __LP64__
18+ static_assert (BLKGETSIZE64 == 0x80081272 );
19+ #else
20+ static_assert (BLKGETSIZE64 == 0x80041272 );
21+ #endif
22+
2123// Override libc++ new implementation to optimize final build size
2224
2325void * operator new (std::size_t s) { return std::malloc (s); }
@@ -29,32 +31,19 @@ void* operator new[](std::size_t s, const std::nothrow_t&) noexcept { return std
2931void operator delete (void *p, const std::nothrow_t &) noexcept { std::free (p); }
3032void operator delete[] (void *p, const std::nothrow_t &) noexcept { std::free (p); }
3133
32- bool byte_view::contains (byte_view pattern) const {
33- return _buf != nullptr && memmem (_buf, _sz, pattern._buf , pattern._sz ) != nullptr ;
34- }
35-
36- bool byte_view::operator ==(byte_view rhs) const {
37- return _sz == rhs._sz && memcmp (_buf, rhs._buf , _sz) == 0 ;
38- }
39-
40- void byte_data::swap (byte_data &o) {
41- std::swap (_buf, o._buf );
42- std::swap (_sz, o._sz );
43- }
44-
4534rust::Vec<size_t > byte_data::patch (byte_view from, byte_view to) const {
4635 rust::Vec<size_t > v;
47- if (_buf == nullptr )
36+ if (ptr == nullptr )
4837 return v;
49- auto p = _buf ;
50- auto eof = _buf + _sz ;
38+ auto p = ptr ;
39+ auto eof = ptr + sz ;
5140 while (p < eof) {
5241 p = static_cast <uint8_t *>(memmem (p, eof - p, from.data (), from.size ()));
5342 if (p == nullptr )
5443 return v;
5544 memset (p, 0 , from.size ());
5645 memcpy (p, to.data (), to.size ());
57- v.push_back (p - _buf );
46+ v.push_back (p - ptr );
5847 p += from.size ();
5948 }
6049 return v;
@@ -374,30 +363,34 @@ sFILE make_file(FILE *fp) {
374363mmap_data::mmap_data (const char *name, bool rw) {
375364 auto slice = rust::map_file (name, rw);
376365 if (!slice.empty ()) {
377- _buf = slice.data ();
378- _sz = slice.size ();
366+ this -> ptr = slice.data ();
367+ this -> sz = slice.size ();
379368 }
380369}
381370
382371mmap_data::mmap_data (int dirfd, const char *name, bool rw) {
383372 auto slice = rust::map_file_at (dirfd, name, rw);
384373 if (!slice.empty ()) {
385- _buf = slice.data ();
386- _sz = slice.size ();
374+ this -> ptr = slice.data ();
375+ this -> sz = slice.size ();
387376 }
388377}
389378
390379mmap_data::mmap_data (int fd, size_t sz, bool rw) {
391380 auto slice = rust::map_fd (fd, sz, rw);
392381 if (!slice.empty ()) {
393- _buf = slice.data ();
394- _sz = slice.size ();
382+ this -> ptr = slice.data ();
383+ this -> sz = slice.size ();
395384 }
396385}
397386
398387mmap_data::~mmap_data () {
399- if (_buf)
400- munmap (_buf, _sz);
388+ if (ptr) munmap (ptr, sz);
389+ }
390+
391+ void mmap_data::swap (mmap_data &o) {
392+ std::swap (ptr, o.ptr );
393+ std::swap (sz, o.sz );
401394}
402395
403396string resolve_preinit_dir (const char *base_dir) {
@@ -420,7 +413,7 @@ extern "C" void cxx$utf8str$new(Utf8CStr *self, const void *s, size_t len);
420413extern " C" const char *cxx$utf8str$ptr(const Utf8CStr *self);
421414extern " C" size_t cxx$utf8str$len(const Utf8CStr *self);
422415
423- Utf8CStr::Utf8CStr (const char *s, size_t len) {
416+ Utf8CStr::Utf8CStr (const char *s, size_t len) : repr{} {
424417 cxx$utf8str$new (this , s, len);
425418}
426419
0 commit comments