Tue, 06 Jan 2015 21:39:09 +0100
Conditionally force memory storage according to privacy.thirdparty.isolate;
This solves Tor bug #9701, complying with disk avoidance documented in
https://www.torproject.org/projects/torbrowser/design/#disk-avoidance.
1 /* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this
3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5 #include "leaky.h"
7 #ifdef USE_COFF
9 #define LANGUAGE_C
10 #include <sym.h>
11 #include <cmplrs/stsupport.h>
12 #include <symconst.h>
13 #include <filehdr.h>
14 #include <ldfcn.h>
15 #include <string.h>
16 #include <stdlib.h>
18 #ifdef IRIX4
19 extern "C" {
20 extern char *demangle(char const* in);
21 };
22 #else
23 #include <dem.h>
24 #endif
26 static char *Demangle(char *rawName)
27 {
28 #ifdef IRIX4
29 return strdup(demangle(rawName));
30 #else
31 char namebuf[4000];
32 demangle(rawName, namebuf);
33 return strdup(namebuf);
34 #endif
35 }
37 void leaky::readSymbols(const char *fileName)
38 {
39 LDFILE *ldptr;
41 ldptr = ldopen(fileName, nullptr);
42 if (!ldptr) {
43 fprintf(stderr, "%s: unable to open \"%s\"\n", applicationName,
44 fileName);
45 exit(-1);
46 }
47 if (PSYMTAB(ldptr) == 0) {
48 fprintf(stderr, "%s: \"%s\": has no symbol table\n", applicationName,
49 fileName);
50 exit(-1);
51 }
53 long isymMax = SYMHEADER(ldptr).isymMax;
54 long iextMax = SYMHEADER(ldptr).iextMax;
55 long iMax = isymMax + iextMax;
57 long alloced = 10000;
58 Symbol* syms = (Symbol*) malloc(sizeof(Symbol) * 10000);
59 Symbol* sp = syms;
60 Symbol* last = syms + alloced;
61 SYMR symr;
63 for (long isym = 0; isym < iMax; isym++) {
64 if (ldtbread(ldptr, isym, &symr) != SUCCESS) {
65 fprintf(stderr, "%s: can't read symbol #%d\n", applicationName,
66 isym);
67 exit(-1);
68 }
69 if (isym < isymMax) {
70 if ((symr.st == stStaticProc)
71 || ((symr.st == stProc) &&
72 ((symr.sc == scText) || (symr.sc == scAbs)))
73 || ((symr.st == stBlock) &&
74 (symr.sc == scText))) {
75 // Text symbol. Set name field to point to the symbol name
76 sp->name = Demangle(ldgetname(ldptr, &symr));
77 sp->address = symr.value;
78 sp++;
79 if (sp >= last) {
80 long n = alloced + 10000;
81 syms = (Symbol*)
82 realloc(syms, (size_t) (sizeof(Symbol) * n));
83 last = syms + n;
84 sp = syms + alloced;
85 alloced = n;
86 }
87 }
88 }
89 }
91 int interesting = sp - syms;
92 if (!quiet) {
93 printf("Total of %d symbols\n", interesting);
94 }
95 usefulSymbols = interesting;
96 externalSymbols = syms;
97 }
99 #endif /* USE_COFF */