dfsan_custom.cpp 105 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835
  1. //===-- dfsan_custom.cpp --------------------------------------------------===//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. //
  9. // This file is a part of DataFlowSanitizer.
  10. //
  11. // This file defines the custom functions listed in done_abilist.txt.
  12. //===----------------------------------------------------------------------===//
  13. #include <arpa/inet.h>
  14. #include <assert.h>
  15. #include <ctype.h>
  16. #include <dlfcn.h>
  17. #include <link.h>
  18. #include <poll.h>
  19. #include <pthread.h>
  20. #include <pwd.h>
  21. #include <sched.h>
  22. #include <signal.h>
  23. #include <stdarg.h>
  24. #include <stdint.h>
  25. #include <stdio.h>
  26. #include <stdlib.h>
  27. #include <string.h>
  28. #include <sys/epoll.h>
  29. #include <sys/resource.h>
  30. #include <sys/select.h>
  31. #include <sys/socket.h>
  32. #include <sys/stat.h>
  33. #include <sys/time.h>
  34. #include <sys/types.h>
  35. #include <time.h>
  36. #include <unistd.h>
  37. #include "dfsan/dfsan.h"
  38. #include "dfsan/dfsan_chained_origin_depot.h"
  39. #include "dfsan/dfsan_flags.h"
  40. #include "dfsan/dfsan_thread.h"
  41. #include "sanitizer_common/sanitizer_common.h"
  42. #include "sanitizer_common/sanitizer_internal_defs.h"
  43. #include "sanitizer_common/sanitizer_linux.h"
  44. #include "sanitizer_common/sanitizer_stackdepot.h"
  45. using namespace __dfsan;
  46. #define CALL_WEAK_INTERCEPTOR_HOOK(f, ...) \
  47. do { \
  48. if (f) \
  49. f(__VA_ARGS__); \
  50. } while (false)
  51. #define DECLARE_WEAK_INTERCEPTOR_HOOK(f, ...) \
  52. SANITIZER_INTERFACE_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void f(__VA_ARGS__);
  53. #define WRAPPER_ALIAS(fun, real) \
  54. SANITIZER_INTERFACE_ATTRIBUTE void __dfsw_##fun() ALIAS(__dfsw_##real); \
  55. SANITIZER_INTERFACE_ATTRIBUTE void __dfso_##fun() ALIAS(__dfso_##real);
  56. // Async-safe, non-reentrant spin lock.
  57. class SignalSpinLocker {
  58. public:
  59. SignalSpinLocker() {
  60. sigset_t all_set;
  61. sigfillset(&all_set);
  62. pthread_sigmask(SIG_SETMASK, &all_set, &saved_thread_mask_);
  63. sigactions_mu.Lock();
  64. }
  65. ~SignalSpinLocker() {
  66. sigactions_mu.Unlock();
  67. pthread_sigmask(SIG_SETMASK, &saved_thread_mask_, nullptr);
  68. }
  69. private:
  70. static StaticSpinMutex sigactions_mu;
  71. sigset_t saved_thread_mask_;
  72. SignalSpinLocker(const SignalSpinLocker &) = delete;
  73. SignalSpinLocker &operator=(const SignalSpinLocker &) = delete;
  74. };
  75. StaticSpinMutex SignalSpinLocker::sigactions_mu;
  76. extern "C" {
  77. SANITIZER_INTERFACE_ATTRIBUTE int
  78. __dfsw_stat(const char *path, struct stat *buf, dfsan_label path_label,
  79. dfsan_label buf_label, dfsan_label *ret_label) {
  80. int ret = stat(path, buf);
  81. if (ret == 0)
  82. dfsan_set_label(0, buf, sizeof(struct stat));
  83. *ret_label = 0;
  84. return ret;
  85. }
  86. SANITIZER_INTERFACE_ATTRIBUTE int __dfso_stat(
  87. const char *path, struct stat *buf, dfsan_label path_label,
  88. dfsan_label buf_label, dfsan_label *ret_label, dfsan_origin path_origin,
  89. dfsan_origin buf_origin, dfsan_origin *ret_origin) {
  90. int ret = __dfsw_stat(path, buf, path_label, buf_label, ret_label);
  91. return ret;
  92. }
  93. SANITIZER_INTERFACE_ATTRIBUTE int __dfsw_fstat(int fd, struct stat *buf,
  94. dfsan_label fd_label,
  95. dfsan_label buf_label,
  96. dfsan_label *ret_label) {
  97. int ret = fstat(fd, buf);
  98. if (ret == 0)
  99. dfsan_set_label(0, buf, sizeof(struct stat));
  100. *ret_label = 0;
  101. return ret;
  102. }
  103. SANITIZER_INTERFACE_ATTRIBUTE int __dfso_fstat(
  104. int fd, struct stat *buf, dfsan_label fd_label, dfsan_label buf_label,
  105. dfsan_label *ret_label, dfsan_origin fd_origin, dfsan_origin buf_origin,
  106. dfsan_origin *ret_origin) {
  107. int ret = __dfsw_fstat(fd, buf, fd_label, buf_label, ret_label);
  108. return ret;
  109. }
  110. static char *dfsan_strchr_with_label(const char *s, int c, size_t *bytes_read,
  111. dfsan_label s_label, dfsan_label c_label,
  112. dfsan_label *ret_label) {
  113. char *match_pos = nullptr;
  114. for (size_t i = 0;; ++i) {
  115. if (s[i] == c || s[i] == 0) {
  116. // If s[i] is the \0 at the end of the string, and \0 is not the
  117. // character we are searching for, then return null.
  118. *bytes_read = i + 1;
  119. match_pos = s[i] == 0 && c != 0 ? nullptr : const_cast<char *>(s + i);
  120. break;
  121. }
  122. }
  123. if (flags().strict_data_dependencies)
  124. *ret_label = s_label;
  125. else
  126. *ret_label = dfsan_union(dfsan_read_label(s, *bytes_read),
  127. dfsan_union(s_label, c_label));
  128. return match_pos;
  129. }
  130. SANITIZER_INTERFACE_ATTRIBUTE char *__dfsw_strchr(const char *s, int c,
  131. dfsan_label s_label,
  132. dfsan_label c_label,
  133. dfsan_label *ret_label) {
  134. size_t bytes_read;
  135. return dfsan_strchr_with_label(s, c, &bytes_read, s_label, c_label,
  136. ret_label);
  137. }
  138. SANITIZER_INTERFACE_ATTRIBUTE char *__dfso_strchr(
  139. const char *s, int c, dfsan_label s_label, dfsan_label c_label,
  140. dfsan_label *ret_label, dfsan_origin s_origin, dfsan_origin c_origin,
  141. dfsan_origin *ret_origin) {
  142. size_t bytes_read;
  143. char *r =
  144. dfsan_strchr_with_label(s, c, &bytes_read, s_label, c_label, ret_label);
  145. if (flags().strict_data_dependencies) {
  146. *ret_origin = s_origin;
  147. } else if (*ret_label) {
  148. dfsan_origin o = dfsan_read_origin_of_first_taint(s, bytes_read);
  149. *ret_origin = o ? o : (s_label ? s_origin : c_origin);
  150. }
  151. return r;
  152. }
  153. SANITIZER_INTERFACE_ATTRIBUTE char *__dfsw_strpbrk(const char *s,
  154. const char *accept,
  155. dfsan_label s_label,
  156. dfsan_label accept_label,
  157. dfsan_label *ret_label) {
  158. const char *ret = strpbrk(s, accept);
  159. if (flags().strict_data_dependencies) {
  160. *ret_label = ret ? s_label : 0;
  161. } else {
  162. size_t s_bytes_read = (ret ? ret - s : strlen(s)) + 1;
  163. *ret_label =
  164. dfsan_union(dfsan_read_label(s, s_bytes_read),
  165. dfsan_union(dfsan_read_label(accept, strlen(accept) + 1),
  166. dfsan_union(s_label, accept_label)));
  167. }
  168. return const_cast<char *>(ret);
  169. }
  170. SANITIZER_INTERFACE_ATTRIBUTE char *__dfso_strpbrk(
  171. const char *s, const char *accept, dfsan_label s_label,
  172. dfsan_label accept_label, dfsan_label *ret_label, dfsan_origin s_origin,
  173. dfsan_origin accept_origin, dfsan_origin *ret_origin) {
  174. const char *ret = __dfsw_strpbrk(s, accept, s_label, accept_label, ret_label);
  175. if (flags().strict_data_dependencies) {
  176. if (ret)
  177. *ret_origin = s_origin;
  178. } else {
  179. if (*ret_label) {
  180. size_t s_bytes_read = (ret ? ret - s : strlen(s)) + 1;
  181. dfsan_origin o = dfsan_read_origin_of_first_taint(s, s_bytes_read);
  182. if (o) {
  183. *ret_origin = o;
  184. } else {
  185. o = dfsan_read_origin_of_first_taint(accept, strlen(accept) + 1);
  186. *ret_origin = o ? o : (s_label ? s_origin : accept_origin);
  187. }
  188. }
  189. }
  190. return const_cast<char *>(ret);
  191. }
  192. SANITIZER_INTERFACE_ATTRIBUTE char *__dfsw_strsep(char **s, const char *delim,
  193. dfsan_label s_label,
  194. dfsan_label delim_label,
  195. dfsan_label *ret_label) {
  196. dfsan_label base_label = dfsan_read_label(s, sizeof(*s));
  197. char *base = *s;
  198. char *res = strsep(s, delim);
  199. if (res != *s) {
  200. char *token_start = res;
  201. int token_length = strlen(res);
  202. // the delimiter byte has been set to NULL
  203. dfsan_set_label(0, token_start + token_length, 1);
  204. }
  205. if (flags().strict_data_dependencies) {
  206. *ret_label = res ? base_label : 0;
  207. } else {
  208. size_t s_bytes_read = (res ? strlen(res) : strlen(base)) + 1;
  209. *ret_label = dfsan_union(
  210. dfsan_union(base_label, dfsan_read_label(base, sizeof(s_bytes_read))),
  211. dfsan_union(dfsan_read_label(delim, strlen(delim) + 1),
  212. dfsan_union(s_label, delim_label)));
  213. }
  214. return res;
  215. }
  216. SANITIZER_INTERFACE_ATTRIBUTE char *__dfso_strsep(
  217. char **s, const char *delim, dfsan_label s_label, dfsan_label delim_label,
  218. dfsan_label *ret_label, dfsan_origin s_origin, dfsan_origin delim_origin,
  219. dfsan_origin *ret_origin) {
  220. dfsan_origin base_origin = dfsan_read_origin_of_first_taint(s, sizeof(*s));
  221. char *res = __dfsw_strsep(s, delim, s_label, delim_label, ret_label);
  222. if (flags().strict_data_dependencies) {
  223. if (res)
  224. *ret_origin = base_origin;
  225. } else {
  226. if (*ret_label) {
  227. if (base_origin) {
  228. *ret_origin = base_origin;
  229. } else {
  230. dfsan_origin o =
  231. dfsan_read_origin_of_first_taint(delim, strlen(delim) + 1);
  232. *ret_origin = o ? o : (s_label ? s_origin : delim_origin);
  233. }
  234. }
  235. }
  236. return res;
  237. }
  238. static int dfsan_memcmp_bcmp(const void *s1, const void *s2, size_t n,
  239. size_t *bytes_read) {
  240. const char *cs1 = (const char *) s1, *cs2 = (const char *) s2;
  241. for (size_t i = 0; i != n; ++i) {
  242. if (cs1[i] != cs2[i]) {
  243. *bytes_read = i + 1;
  244. return cs1[i] - cs2[i];
  245. }
  246. }
  247. *bytes_read = n;
  248. return 0;
  249. }
  250. static dfsan_label dfsan_get_memcmp_label(const void *s1, const void *s2,
  251. size_t pos) {
  252. if (flags().strict_data_dependencies)
  253. return 0;
  254. return dfsan_union(dfsan_read_label(s1, pos), dfsan_read_label(s2, pos));
  255. }
  256. static void dfsan_get_memcmp_origin(const void *s1, const void *s2, size_t pos,
  257. dfsan_label *ret_label,
  258. dfsan_origin *ret_origin) {
  259. *ret_label = dfsan_get_memcmp_label(s1, s2, pos);
  260. if (*ret_label == 0)
  261. return;
  262. dfsan_origin o = dfsan_read_origin_of_first_taint(s1, pos);
  263. *ret_origin = o ? o : dfsan_read_origin_of_first_taint(s2, pos);
  264. }
  265. static int dfsan_memcmp_bcmp_label(const void *s1, const void *s2, size_t n,
  266. dfsan_label *ret_label) {
  267. size_t bytes_read;
  268. int r = dfsan_memcmp_bcmp(s1, s2, n, &bytes_read);
  269. *ret_label = dfsan_get_memcmp_label(s1, s2, bytes_read);
  270. return r;
  271. }
  272. static int dfsan_memcmp_bcmp_origin(const void *s1, const void *s2, size_t n,
  273. dfsan_label *ret_label,
  274. dfsan_origin *ret_origin) {
  275. size_t bytes_read;
  276. int r = dfsan_memcmp_bcmp(s1, s2, n, &bytes_read);
  277. dfsan_get_memcmp_origin(s1, s2, bytes_read, ret_label, ret_origin);
  278. return r;
  279. }
  280. DECLARE_WEAK_INTERCEPTOR_HOOK(dfsan_weak_hook_memcmp, uptr caller_pc,
  281. const void *s1, const void *s2, size_t n,
  282. dfsan_label s1_label, dfsan_label s2_label,
  283. dfsan_label n_label)
  284. DECLARE_WEAK_INTERCEPTOR_HOOK(dfsan_weak_hook_origin_memcmp, uptr caller_pc,
  285. const void *s1, const void *s2, size_t n,
  286. dfsan_label s1_label, dfsan_label s2_label,
  287. dfsan_label n_label, dfsan_origin s1_origin,
  288. dfsan_origin s2_origin, dfsan_origin n_origin)
  289. SANITIZER_INTERFACE_ATTRIBUTE int __dfsw_memcmp(const void *s1, const void *s2,
  290. size_t n, dfsan_label s1_label,
  291. dfsan_label s2_label,
  292. dfsan_label n_label,
  293. dfsan_label *ret_label) {
  294. CALL_WEAK_INTERCEPTOR_HOOK(dfsan_weak_hook_memcmp, GET_CALLER_PC(), s1, s2, n,
  295. s1_label, s2_label, n_label);
  296. return dfsan_memcmp_bcmp_label(s1, s2, n, ret_label);
  297. }
  298. SANITIZER_INTERFACE_ATTRIBUTE int __dfso_memcmp(
  299. const void *s1, const void *s2, size_t n, dfsan_label s1_label,
  300. dfsan_label s2_label, dfsan_label n_label, dfsan_label *ret_label,
  301. dfsan_origin s1_origin, dfsan_origin s2_origin, dfsan_origin n_origin,
  302. dfsan_origin *ret_origin) {
  303. CALL_WEAK_INTERCEPTOR_HOOK(dfsan_weak_hook_origin_memcmp, GET_CALLER_PC(), s1,
  304. s2, n, s1_label, s2_label, n_label, s1_origin,
  305. s2_origin, n_origin);
  306. return dfsan_memcmp_bcmp_origin(s1, s2, n, ret_label, ret_origin);
  307. }
  308. SANITIZER_INTERFACE_ATTRIBUTE int __dfsw_bcmp(const void *s1, const void *s2,
  309. size_t n, dfsan_label s1_label,
  310. dfsan_label s2_label,
  311. dfsan_label n_label,
  312. dfsan_label *ret_label) {
  313. return dfsan_memcmp_bcmp_label(s1, s2, n, ret_label);
  314. }
  315. SANITIZER_INTERFACE_ATTRIBUTE int __dfso_bcmp(
  316. const void *s1, const void *s2, size_t n, dfsan_label s1_label,
  317. dfsan_label s2_label, dfsan_label n_label, dfsan_label *ret_label,
  318. dfsan_origin s1_origin, dfsan_origin s2_origin, dfsan_origin n_origin,
  319. dfsan_origin *ret_origin) {
  320. return dfsan_memcmp_bcmp_origin(s1, s2, n, ret_label, ret_origin);
  321. }
  322. // When n == 0, compare strings without byte limit.
  323. // When n > 0, compare the first (at most) n bytes of s1 and s2.
  324. static int dfsan_strncmp(const char *s1, const char *s2, size_t n,
  325. size_t *bytes_read) {
  326. for (size_t i = 0;; ++i) {
  327. if (s1[i] != s2[i] || s1[i] == 0 || s2[i] == 0 || (n > 0 && i == n - 1)) {
  328. *bytes_read = i + 1;
  329. return s1[i] - s2[i];
  330. }
  331. }
  332. }
  333. DECLARE_WEAK_INTERCEPTOR_HOOK(dfsan_weak_hook_strcmp, uptr caller_pc,
  334. const char *s1, const char *s2,
  335. dfsan_label s1_label, dfsan_label s2_label)
  336. DECLARE_WEAK_INTERCEPTOR_HOOK(dfsan_weak_hook_origin_strcmp, uptr caller_pc,
  337. const char *s1, const char *s2,
  338. dfsan_label s1_label, dfsan_label s2_label,
  339. dfsan_origin s1_origin, dfsan_origin s2_origin)
  340. SANITIZER_INTERFACE_ATTRIBUTE int __dfsw_strcmp(const char *s1, const char *s2,
  341. dfsan_label s1_label,
  342. dfsan_label s2_label,
  343. dfsan_label *ret_label) {
  344. CALL_WEAK_INTERCEPTOR_HOOK(dfsan_weak_hook_strcmp, GET_CALLER_PC(), s1, s2,
  345. s1_label, s2_label);
  346. size_t bytes_read;
  347. int r = dfsan_strncmp(s1, s2, 0, &bytes_read);
  348. *ret_label = dfsan_get_memcmp_label(s1, s2, bytes_read);
  349. return r;
  350. }
  351. SANITIZER_INTERFACE_ATTRIBUTE int __dfso_strcmp(
  352. const char *s1, const char *s2, dfsan_label s1_label, dfsan_label s2_label,
  353. dfsan_label *ret_label, dfsan_origin s1_origin, dfsan_origin s2_origin,
  354. dfsan_origin *ret_origin) {
  355. CALL_WEAK_INTERCEPTOR_HOOK(dfsan_weak_hook_origin_strcmp, GET_CALLER_PC(), s1,
  356. s2, s1_label, s2_label, s1_origin, s2_origin);
  357. size_t bytes_read;
  358. int r = dfsan_strncmp(s1, s2, 0, &bytes_read);
  359. dfsan_get_memcmp_origin(s1, s2, bytes_read, ret_label, ret_origin);
  360. return r;
  361. }
  362. // When n == 0, compare strings without byte limit.
  363. // When n > 0, compare the first (at most) n bytes of s1 and s2.
  364. static int dfsan_strncasecmp(const char *s1, const char *s2, size_t n,
  365. size_t *bytes_read) {
  366. for (size_t i = 0;; ++i) {
  367. char s1_lower = tolower(s1[i]);
  368. char s2_lower = tolower(s2[i]);
  369. if (s1_lower != s2_lower || s1[i] == 0 || s2[i] == 0 ||
  370. (n > 0 && i == n - 1)) {
  371. *bytes_read = i + 1;
  372. return s1_lower - s2_lower;
  373. }
  374. }
  375. }
  376. SANITIZER_INTERFACE_ATTRIBUTE int __dfsw_strcasecmp(const char *s1,
  377. const char *s2,
  378. dfsan_label s1_label,
  379. dfsan_label s2_label,
  380. dfsan_label *ret_label) {
  381. size_t bytes_read;
  382. int r = dfsan_strncasecmp(s1, s2, 0, &bytes_read);
  383. *ret_label = dfsan_get_memcmp_label(s1, s2, bytes_read);
  384. return r;
  385. }
  386. SANITIZER_INTERFACE_ATTRIBUTE int __dfso_strcasecmp(
  387. const char *s1, const char *s2, dfsan_label s1_label, dfsan_label s2_label,
  388. dfsan_label *ret_label, dfsan_origin s1_origin, dfsan_origin s2_origin,
  389. dfsan_origin *ret_origin) {
  390. size_t bytes_read;
  391. int r = dfsan_strncasecmp(s1, s2, 0, &bytes_read);
  392. dfsan_get_memcmp_origin(s1, s2, bytes_read, ret_label, ret_origin);
  393. return r;
  394. }
  395. DECLARE_WEAK_INTERCEPTOR_HOOK(dfsan_weak_hook_strncmp, uptr caller_pc,
  396. const char *s1, const char *s2, size_t n,
  397. dfsan_label s1_label, dfsan_label s2_label,
  398. dfsan_label n_label)
  399. DECLARE_WEAK_INTERCEPTOR_HOOK(dfsan_weak_hook_origin_strncmp, uptr caller_pc,
  400. const char *s1, const char *s2, size_t n,
  401. dfsan_label s1_label, dfsan_label s2_label,
  402. dfsan_label n_label, dfsan_origin s1_origin,
  403. dfsan_origin s2_origin, dfsan_origin n_origin)
  404. SANITIZER_INTERFACE_ATTRIBUTE int __dfsw_strncmp(const char *s1, const char *s2,
  405. size_t n, dfsan_label s1_label,
  406. dfsan_label s2_label,
  407. dfsan_label n_label,
  408. dfsan_label *ret_label) {
  409. if (n == 0) {
  410. *ret_label = 0;
  411. return 0;
  412. }
  413. CALL_WEAK_INTERCEPTOR_HOOK(dfsan_weak_hook_strncmp, GET_CALLER_PC(), s1, s2,
  414. n, s1_label, s2_label, n_label);
  415. size_t bytes_read;
  416. int r = dfsan_strncmp(s1, s2, n, &bytes_read);
  417. *ret_label = dfsan_get_memcmp_label(s1, s2, bytes_read);
  418. return r;
  419. }
  420. SANITIZER_INTERFACE_ATTRIBUTE int __dfso_strncmp(
  421. const char *s1, const char *s2, size_t n, dfsan_label s1_label,
  422. dfsan_label s2_label, dfsan_label n_label, dfsan_label *ret_label,
  423. dfsan_origin s1_origin, dfsan_origin s2_origin, dfsan_origin n_origin,
  424. dfsan_origin *ret_origin) {
  425. if (n == 0) {
  426. *ret_label = 0;
  427. return 0;
  428. }
  429. CALL_WEAK_INTERCEPTOR_HOOK(dfsan_weak_hook_origin_strncmp, GET_CALLER_PC(),
  430. s1, s2, n, s1_label, s2_label, n_label, s1_origin,
  431. s2_origin, n_origin);
  432. size_t bytes_read;
  433. int r = dfsan_strncmp(s1, s2, n, &bytes_read);
  434. dfsan_get_memcmp_origin(s1, s2, bytes_read, ret_label, ret_origin);
  435. return r;
  436. }
  437. SANITIZER_INTERFACE_ATTRIBUTE int __dfsw_strncasecmp(
  438. const char *s1, const char *s2, size_t n, dfsan_label s1_label,
  439. dfsan_label s2_label, dfsan_label n_label, dfsan_label *ret_label) {
  440. if (n == 0) {
  441. *ret_label = 0;
  442. return 0;
  443. }
  444. size_t bytes_read;
  445. int r = dfsan_strncasecmp(s1, s2, n, &bytes_read);
  446. *ret_label = dfsan_get_memcmp_label(s1, s2, bytes_read);
  447. return r;
  448. }
  449. SANITIZER_INTERFACE_ATTRIBUTE int __dfso_strncasecmp(
  450. const char *s1, const char *s2, size_t n, dfsan_label s1_label,
  451. dfsan_label s2_label, dfsan_label n_label, dfsan_label *ret_label,
  452. dfsan_origin s1_origin, dfsan_origin s2_origin, dfsan_origin n_origin,
  453. dfsan_origin *ret_origin) {
  454. if (n == 0) {
  455. *ret_label = 0;
  456. return 0;
  457. }
  458. size_t bytes_read;
  459. int r = dfsan_strncasecmp(s1, s2, n, &bytes_read);
  460. dfsan_get_memcmp_origin(s1, s2, bytes_read, ret_label, ret_origin);
  461. return r;
  462. }
  463. SANITIZER_INTERFACE_ATTRIBUTE size_t
  464. __dfsw_strlen(const char *s, dfsan_label s_label, dfsan_label *ret_label) {
  465. size_t ret = strlen(s);
  466. if (flags().strict_data_dependencies) {
  467. *ret_label = 0;
  468. } else {
  469. *ret_label = dfsan_read_label(s, ret + 1);
  470. }
  471. return ret;
  472. }
  473. SANITIZER_INTERFACE_ATTRIBUTE size_t __dfso_strlen(const char *s,
  474. dfsan_label s_label,
  475. dfsan_label *ret_label,
  476. dfsan_origin s_origin,
  477. dfsan_origin *ret_origin) {
  478. size_t ret = __dfsw_strlen(s, s_label, ret_label);
  479. if (!flags().strict_data_dependencies)
  480. *ret_origin = dfsan_read_origin_of_first_taint(s, ret + 1);
  481. return ret;
  482. }
  483. SANITIZER_INTERFACE_ATTRIBUTE size_t __dfsw_strnlen(const char *s,
  484. size_t maxlen,
  485. dfsan_label s_label,
  486. dfsan_label maxlen_label,
  487. dfsan_label *ret_label) {
  488. size_t ret = strnlen(s, maxlen);
  489. if (flags().strict_data_dependencies) {
  490. *ret_label = 0;
  491. } else {
  492. size_t full_len = strlen(s);
  493. size_t covered_len = maxlen > (full_len + 1) ? (full_len + 1) : maxlen;
  494. *ret_label = dfsan_union(maxlen_label, dfsan_read_label(s, covered_len));
  495. }
  496. return ret;
  497. }
  498. SANITIZER_INTERFACE_ATTRIBUTE size_t __dfso_strnlen(
  499. const char *s, size_t maxlen, dfsan_label s_label, dfsan_label maxlen_label,
  500. dfsan_label *ret_label, dfsan_origin s_origin, dfsan_origin maxlen_origin,
  501. dfsan_origin *ret_origin) {
  502. size_t ret = __dfsw_strnlen(s, maxlen, s_label, maxlen_label, ret_label);
  503. if (!flags().strict_data_dependencies) {
  504. size_t full_len = strlen(s);
  505. size_t covered_len = maxlen > (full_len + 1) ? (full_len + 1) : maxlen;
  506. dfsan_origin o = dfsan_read_origin_of_first_taint(s, covered_len);
  507. *ret_origin = o ? o : maxlen_origin;
  508. }
  509. return ret;
  510. }
  511. static void *dfsan_memmove(void *dest, const void *src, size_t n) {
  512. dfsan_label *sdest = shadow_for(dest);
  513. const dfsan_label *ssrc = shadow_for(src);
  514. internal_memmove((void *)sdest, (const void *)ssrc, n * sizeof(dfsan_label));
  515. return internal_memmove(dest, src, n);
  516. }
  517. static void *dfsan_memmove_with_origin(void *dest, const void *src, size_t n) {
  518. dfsan_mem_origin_transfer(dest, src, n);
  519. return dfsan_memmove(dest, src, n);
  520. }
  521. static void *dfsan_memcpy(void *dest, const void *src, size_t n) {
  522. dfsan_mem_shadow_transfer(dest, src, n);
  523. return internal_memcpy(dest, src, n);
  524. }
  525. static void *dfsan_memcpy_with_origin(void *dest, const void *src, size_t n) {
  526. dfsan_mem_origin_transfer(dest, src, n);
  527. return dfsan_memcpy(dest, src, n);
  528. }
  529. static void dfsan_memset(void *s, int c, dfsan_label c_label, size_t n) {
  530. internal_memset(s, c, n);
  531. dfsan_set_label(c_label, s, n);
  532. }
  533. static void dfsan_memset_with_origin(void *s, int c, dfsan_label c_label,
  534. dfsan_origin c_origin, size_t n) {
  535. internal_memset(s, c, n);
  536. dfsan_set_label_origin(c_label, c_origin, s, n);
  537. }
  538. SANITIZER_INTERFACE_ATTRIBUTE
  539. void *__dfsw_memcpy(void *dest, const void *src, size_t n,
  540. dfsan_label dest_label, dfsan_label src_label,
  541. dfsan_label n_label, dfsan_label *ret_label) {
  542. *ret_label = dest_label;
  543. return dfsan_memcpy(dest, src, n);
  544. }
  545. SANITIZER_INTERFACE_ATTRIBUTE
  546. void *__dfso_memcpy(void *dest, const void *src, size_t n,
  547. dfsan_label dest_label, dfsan_label src_label,
  548. dfsan_label n_label, dfsan_label *ret_label,
  549. dfsan_origin dest_origin, dfsan_origin src_origin,
  550. dfsan_origin n_origin, dfsan_origin *ret_origin) {
  551. *ret_label = dest_label;
  552. *ret_origin = dest_origin;
  553. return dfsan_memcpy_with_origin(dest, src, n);
  554. }
  555. SANITIZER_INTERFACE_ATTRIBUTE
  556. void *__dfsw_memmove(void *dest, const void *src, size_t n,
  557. dfsan_label dest_label, dfsan_label src_label,
  558. dfsan_label n_label, dfsan_label *ret_label) {
  559. *ret_label = dest_label;
  560. return dfsan_memmove(dest, src, n);
  561. }
  562. SANITIZER_INTERFACE_ATTRIBUTE
  563. void *__dfso_memmove(void *dest, const void *src, size_t n,
  564. dfsan_label dest_label, dfsan_label src_label,
  565. dfsan_label n_label, dfsan_label *ret_label,
  566. dfsan_origin dest_origin, dfsan_origin src_origin,
  567. dfsan_origin n_origin, dfsan_origin *ret_origin) {
  568. *ret_label = dest_label;
  569. *ret_origin = dest_origin;
  570. return dfsan_memmove_with_origin(dest, src, n);
  571. }
  572. SANITIZER_INTERFACE_ATTRIBUTE
  573. void *__dfsw_memset(void *s, int c, size_t n,
  574. dfsan_label s_label, dfsan_label c_label,
  575. dfsan_label n_label, dfsan_label *ret_label) {
  576. dfsan_memset(s, c, c_label, n);
  577. *ret_label = s_label;
  578. return s;
  579. }
  580. SANITIZER_INTERFACE_ATTRIBUTE
  581. void *__dfso_memset(void *s, int c, size_t n, dfsan_label s_label,
  582. dfsan_label c_label, dfsan_label n_label,
  583. dfsan_label *ret_label, dfsan_origin s_origin,
  584. dfsan_origin c_origin, dfsan_origin n_origin,
  585. dfsan_origin *ret_origin) {
  586. dfsan_memset_with_origin(s, c, c_label, c_origin, n);
  587. *ret_label = s_label;
  588. *ret_origin = s_origin;
  589. return s;
  590. }
  591. SANITIZER_INTERFACE_ATTRIBUTE char *__dfsw_strcat(char *dest, const char *src,
  592. dfsan_label dest_label,
  593. dfsan_label src_label,
  594. dfsan_label *ret_label) {
  595. size_t dest_len = strlen(dest);
  596. char *ret = strcat(dest, src);
  597. dfsan_mem_shadow_transfer(dest + dest_len, src, strlen(src));
  598. *ret_label = dest_label;
  599. return ret;
  600. }
  601. SANITIZER_INTERFACE_ATTRIBUTE char *__dfso_strcat(
  602. char *dest, const char *src, dfsan_label dest_label, dfsan_label src_label,
  603. dfsan_label *ret_label, dfsan_origin dest_origin, dfsan_origin src_origin,
  604. dfsan_origin *ret_origin) {
  605. size_t dest_len = strlen(dest);
  606. char *ret = strcat(dest, src);
  607. size_t src_len = strlen(src);
  608. dfsan_mem_origin_transfer(dest + dest_len, src, src_len);
  609. dfsan_mem_shadow_transfer(dest + dest_len, src, src_len);
  610. *ret_label = dest_label;
  611. *ret_origin = dest_origin;
  612. return ret;
  613. }
  614. SANITIZER_INTERFACE_ATTRIBUTE char *__dfsw_strncat(
  615. char *dest, const char *src, size_t num, dfsan_label dest_label,
  616. dfsan_label src_label, dfsan_label num_label, dfsan_label *ret_label) {
  617. size_t src_len = strlen(src);
  618. src_len = src_len < num ? src_len : num;
  619. size_t dest_len = strlen(dest);
  620. char *ret = strncat(dest, src, num);
  621. dfsan_mem_shadow_transfer(dest + dest_len, src, src_len);
  622. *ret_label = dest_label;
  623. return ret;
  624. }
  625. SANITIZER_INTERFACE_ATTRIBUTE char *__dfso_strncat(
  626. char *dest, const char *src, size_t num, dfsan_label dest_label,
  627. dfsan_label src_label, dfsan_label num_label, dfsan_label *ret_label,
  628. dfsan_origin dest_origin, dfsan_origin src_origin, dfsan_origin num_origin,
  629. dfsan_origin *ret_origin) {
  630. size_t src_len = strlen(src);
  631. src_len = src_len < num ? src_len : num;
  632. size_t dest_len = strlen(dest);
  633. char *ret = strncat(dest, src, num);
  634. dfsan_mem_origin_transfer(dest + dest_len, src, src_len);
  635. dfsan_mem_shadow_transfer(dest + dest_len, src, src_len);
  636. *ret_label = dest_label;
  637. *ret_origin = dest_origin;
  638. return ret;
  639. }
  640. SANITIZER_INTERFACE_ATTRIBUTE char *
  641. __dfsw_strdup(const char *s, dfsan_label s_label, dfsan_label *ret_label) {
  642. size_t len = strlen(s);
  643. void *p = malloc(len+1);
  644. dfsan_memcpy(p, s, len+1);
  645. *ret_label = 0;
  646. return static_cast<char *>(p);
  647. }
  648. SANITIZER_INTERFACE_ATTRIBUTE char *__dfso_strdup(const char *s,
  649. dfsan_label s_label,
  650. dfsan_label *ret_label,
  651. dfsan_origin s_origin,
  652. dfsan_origin *ret_origin) {
  653. size_t len = strlen(s);
  654. void *p = malloc(len + 1);
  655. dfsan_memcpy_with_origin(p, s, len + 1);
  656. *ret_label = 0;
  657. return static_cast<char *>(p);
  658. }
  659. SANITIZER_INTERFACE_ATTRIBUTE char *
  660. __dfsw_strncpy(char *s1, const char *s2, size_t n, dfsan_label s1_label,
  661. dfsan_label s2_label, dfsan_label n_label,
  662. dfsan_label *ret_label) {
  663. size_t len = strlen(s2);
  664. if (len < n) {
  665. dfsan_memcpy(s1, s2, len+1);
  666. dfsan_memset(s1+len+1, 0, 0, n-len-1);
  667. } else {
  668. dfsan_memcpy(s1, s2, n);
  669. }
  670. *ret_label = s1_label;
  671. return s1;
  672. }
  673. SANITIZER_INTERFACE_ATTRIBUTE char *__dfso_strncpy(
  674. char *s1, const char *s2, size_t n, dfsan_label s1_label,
  675. dfsan_label s2_label, dfsan_label n_label, dfsan_label *ret_label,
  676. dfsan_origin s1_origin, dfsan_origin s2_origin, dfsan_origin n_origin,
  677. dfsan_origin *ret_origin) {
  678. size_t len = strlen(s2);
  679. if (len < n) {
  680. dfsan_memcpy_with_origin(s1, s2, len + 1);
  681. dfsan_memset_with_origin(s1 + len + 1, 0, 0, 0, n - len - 1);
  682. } else {
  683. dfsan_memcpy_with_origin(s1, s2, n);
  684. }
  685. *ret_label = s1_label;
  686. *ret_origin = s1_origin;
  687. return s1;
  688. }
  689. SANITIZER_INTERFACE_ATTRIBUTE ssize_t
  690. __dfsw_pread(int fd, void *buf, size_t count, off_t offset,
  691. dfsan_label fd_label, dfsan_label buf_label,
  692. dfsan_label count_label, dfsan_label offset_label,
  693. dfsan_label *ret_label) {
  694. ssize_t ret = pread(fd, buf, count, offset);
  695. if (ret > 0)
  696. dfsan_set_label(0, buf, ret);
  697. *ret_label = 0;
  698. return ret;
  699. }
  700. SANITIZER_INTERFACE_ATTRIBUTE ssize_t __dfso_pread(
  701. int fd, void *buf, size_t count, off_t offset, dfsan_label fd_label,
  702. dfsan_label buf_label, dfsan_label count_label, dfsan_label offset_label,
  703. dfsan_label *ret_label, dfsan_origin fd_origin, dfsan_origin buf_origin,
  704. dfsan_origin count_origin, dfsan_label offset_origin,
  705. dfsan_origin *ret_origin) {
  706. return __dfsw_pread(fd, buf, count, offset, fd_label, buf_label, count_label,
  707. offset_label, ret_label);
  708. }
  709. SANITIZER_INTERFACE_ATTRIBUTE ssize_t
  710. __dfsw_read(int fd, void *buf, size_t count,
  711. dfsan_label fd_label, dfsan_label buf_label,
  712. dfsan_label count_label,
  713. dfsan_label *ret_label) {
  714. ssize_t ret = read(fd, buf, count);
  715. if (ret > 0)
  716. dfsan_set_label(0, buf, ret);
  717. *ret_label = 0;
  718. return ret;
  719. }
  720. SANITIZER_INTERFACE_ATTRIBUTE ssize_t __dfso_read(
  721. int fd, void *buf, size_t count, dfsan_label fd_label,
  722. dfsan_label buf_label, dfsan_label count_label, dfsan_label *ret_label,
  723. dfsan_origin fd_origin, dfsan_origin buf_origin, dfsan_origin count_origin,
  724. dfsan_origin *ret_origin) {
  725. return __dfsw_read(fd, buf, count, fd_label, buf_label, count_label,
  726. ret_label);
  727. }
  728. SANITIZER_INTERFACE_ATTRIBUTE int __dfsw_clock_gettime(clockid_t clk_id,
  729. struct timespec *tp,
  730. dfsan_label clk_id_label,
  731. dfsan_label tp_label,
  732. dfsan_label *ret_label) {
  733. int ret = clock_gettime(clk_id, tp);
  734. if (ret == 0)
  735. dfsan_set_label(0, tp, sizeof(struct timespec));
  736. *ret_label = 0;
  737. return ret;
  738. }
  739. SANITIZER_INTERFACE_ATTRIBUTE int __dfso_clock_gettime(
  740. clockid_t clk_id, struct timespec *tp, dfsan_label clk_id_label,
  741. dfsan_label tp_label, dfsan_label *ret_label, dfsan_origin clk_id_origin,
  742. dfsan_origin tp_origin, dfsan_origin *ret_origin) {
  743. return __dfsw_clock_gettime(clk_id, tp, clk_id_label, tp_label, ret_label);
  744. }
  745. static void dfsan_set_zero_label(const void *ptr, uptr size) {
  746. dfsan_set_label(0, const_cast<void *>(ptr), size);
  747. }
  748. // dlopen() ultimately calls mmap() down inside the loader, which generally
  749. // doesn't participate in dynamic symbol resolution. Therefore we won't
  750. // intercept its calls to mmap, and we have to hook it here.
  751. SANITIZER_INTERFACE_ATTRIBUTE void *
  752. __dfsw_dlopen(const char *filename, int flag, dfsan_label filename_label,
  753. dfsan_label flag_label, dfsan_label *ret_label) {
  754. void *handle = dlopen(filename, flag);
  755. link_map *map = GET_LINK_MAP_BY_DLOPEN_HANDLE(handle);
  756. if (filename && map)
  757. ForEachMappedRegion(map, dfsan_set_zero_label);
  758. *ret_label = 0;
  759. return handle;
  760. }
  761. SANITIZER_INTERFACE_ATTRIBUTE void *__dfso_dlopen(
  762. const char *filename, int flag, dfsan_label filename_label,
  763. dfsan_label flag_label, dfsan_label *ret_label,
  764. dfsan_origin filename_origin, dfsan_origin flag_origin,
  765. dfsan_origin *ret_origin) {
  766. return __dfsw_dlopen(filename, flag, filename_label, flag_label, ret_label);
  767. }
  768. static void *DFsanThreadStartFunc(void *arg) {
  769. DFsanThread *t = (DFsanThread *)arg;
  770. SetCurrentThread(t);
  771. t->Init();
  772. SetSigProcMask(&t->starting_sigset_, nullptr);
  773. return t->ThreadStart();
  774. }
  775. static int dfsan_pthread_create(pthread_t *thread, const pthread_attr_t *attr,
  776. void *start_routine, void *arg,
  777. dfsan_label *ret_label,
  778. bool track_origins = false) {
  779. pthread_attr_t myattr;
  780. if (!attr) {
  781. pthread_attr_init(&myattr);
  782. attr = &myattr;
  783. }
  784. // Ensure that the thread stack is large enough to hold all TLS data.
  785. AdjustStackSize((void *)(const_cast<pthread_attr_t *>(attr)));
  786. DFsanThread *t =
  787. DFsanThread::Create((thread_callback_t)start_routine, arg, track_origins);
  788. ScopedBlockSignals block(&t->starting_sigset_);
  789. int res = pthread_create(thread, attr, DFsanThreadStartFunc, t);
  790. if (attr == &myattr)
  791. pthread_attr_destroy(&myattr);
  792. *ret_label = 0;
  793. return res;
  794. }
  795. SANITIZER_INTERFACE_ATTRIBUTE int __dfsw_pthread_create(
  796. pthread_t *thread, const pthread_attr_t *attr, void *start_routine,
  797. void *arg, dfsan_label thread_label, dfsan_label attr_label,
  798. dfsan_label start_routine_label, dfsan_label arg_label,
  799. dfsan_label *ret_label) {
  800. return dfsan_pthread_create(thread, attr, start_routine, arg, ret_label);
  801. }
  802. SANITIZER_INTERFACE_ATTRIBUTE int __dfso_pthread_create(
  803. pthread_t *thread, const pthread_attr_t *attr, void *start_routine,
  804. void *arg, dfsan_label thread_label, dfsan_label attr_label,
  805. dfsan_label start_routine_label, dfsan_label arg_label,
  806. dfsan_label *ret_label, dfsan_origin thread_origin,
  807. dfsan_origin attr_origin, dfsan_origin start_routine_origin,
  808. dfsan_origin arg_origin, dfsan_origin *ret_origin) {
  809. return dfsan_pthread_create(thread, attr, start_routine, arg, ret_label,
  810. true);
  811. }
  812. SANITIZER_INTERFACE_ATTRIBUTE int __dfsw_pthread_join(pthread_t thread,
  813. void **retval,
  814. dfsan_label thread_label,
  815. dfsan_label retval_label,
  816. dfsan_label *ret_label) {
  817. int ret = pthread_join(thread, retval);
  818. if (ret == 0 && retval)
  819. dfsan_set_label(0, retval, sizeof(*retval));
  820. *ret_label = 0;
  821. return ret;
  822. }
  823. SANITIZER_INTERFACE_ATTRIBUTE int __dfso_pthread_join(
  824. pthread_t thread, void **retval, dfsan_label thread_label,
  825. dfsan_label retval_label, dfsan_label *ret_label,
  826. dfsan_origin thread_origin, dfsan_origin retval_origin,
  827. dfsan_origin *ret_origin) {
  828. return __dfsw_pthread_join(thread, retval, thread_label, retval_label,
  829. ret_label);
  830. }
  831. struct dl_iterate_phdr_info {
  832. int (*callback)(struct dl_phdr_info *info, size_t size, void *data);
  833. void *data;
  834. };
  835. int dl_iterate_phdr_cb(struct dl_phdr_info *info, size_t size, void *data) {
  836. dl_iterate_phdr_info *dipi = (dl_iterate_phdr_info *)data;
  837. dfsan_set_label(0, *info);
  838. dfsan_set_label(0, const_cast<char *>(info->dlpi_name),
  839. strlen(info->dlpi_name) + 1);
  840. dfsan_set_label(
  841. 0, const_cast<char *>(reinterpret_cast<const char *>(info->dlpi_phdr)),
  842. sizeof(*info->dlpi_phdr) * info->dlpi_phnum);
  843. dfsan_clear_thread_local_state();
  844. return dipi->callback(info, size, dipi->data);
  845. }
  846. SANITIZER_INTERFACE_ATTRIBUTE int __dfsw_dl_iterate_phdr(
  847. int (*callback)(struct dl_phdr_info *info, size_t size, void *data),
  848. void *data, dfsan_label callback_label, dfsan_label data_label,
  849. dfsan_label *ret_label) {
  850. dl_iterate_phdr_info dipi = {callback, data};
  851. *ret_label = 0;
  852. return dl_iterate_phdr(dl_iterate_phdr_cb, &dipi);
  853. }
  854. SANITIZER_INTERFACE_ATTRIBUTE int __dfso_dl_iterate_phdr(
  855. int (*callback)(struct dl_phdr_info *info, size_t size, void *data),
  856. void *data, dfsan_label callback_label, dfsan_label data_label,
  857. dfsan_label *ret_label, dfsan_origin callback_origin,
  858. dfsan_origin data_origin, dfsan_origin *ret_origin) {
  859. dl_iterate_phdr_info dipi = {callback, data};
  860. *ret_label = 0;
  861. return dl_iterate_phdr(dl_iterate_phdr_cb, &dipi);
  862. }
  863. // This function is only available for glibc 2.27 or newer. Mark it weak so
  864. // linking succeeds with older glibcs.
  865. SANITIZER_WEAK_ATTRIBUTE void _dl_get_tls_static_info(size_t *sizep,
  866. size_t *alignp);
  867. SANITIZER_INTERFACE_ATTRIBUTE void __dfsw__dl_get_tls_static_info(
  868. size_t *sizep, size_t *alignp, dfsan_label sizep_label,
  869. dfsan_label alignp_label) {
  870. assert(_dl_get_tls_static_info);
  871. _dl_get_tls_static_info(sizep, alignp);
  872. dfsan_set_label(0, sizep, sizeof(*sizep));
  873. dfsan_set_label(0, alignp, sizeof(*alignp));
  874. }
  875. SANITIZER_INTERFACE_ATTRIBUTE void __dfso__dl_get_tls_static_info(
  876. size_t *sizep, size_t *alignp, dfsan_label sizep_label,
  877. dfsan_label alignp_label, dfsan_origin sizep_origin,
  878. dfsan_origin alignp_origin) {
  879. __dfsw__dl_get_tls_static_info(sizep, alignp, sizep_label, alignp_label);
  880. }
  881. SANITIZER_INTERFACE_ATTRIBUTE
  882. char *__dfsw_ctime_r(const time_t *timep, char *buf, dfsan_label timep_label,
  883. dfsan_label buf_label, dfsan_label *ret_label) {
  884. char *ret = ctime_r(timep, buf);
  885. if (ret) {
  886. dfsan_set_label(dfsan_read_label(timep, sizeof(time_t)), buf,
  887. strlen(buf) + 1);
  888. *ret_label = buf_label;
  889. } else {
  890. *ret_label = 0;
  891. }
  892. return ret;
  893. }
  894. SANITIZER_INTERFACE_ATTRIBUTE
  895. char *__dfso_ctime_r(const time_t *timep, char *buf, dfsan_label timep_label,
  896. dfsan_label buf_label, dfsan_label *ret_label,
  897. dfsan_origin timep_origin, dfsan_origin buf_origin,
  898. dfsan_origin *ret_origin) {
  899. char *ret = ctime_r(timep, buf);
  900. if (ret) {
  901. dfsan_set_label_origin(
  902. dfsan_read_label(timep, sizeof(time_t)),
  903. dfsan_read_origin_of_first_taint(timep, sizeof(time_t)), buf,
  904. strlen(buf) + 1);
  905. *ret_label = buf_label;
  906. *ret_origin = buf_origin;
  907. } else {
  908. *ret_label = 0;
  909. }
  910. return ret;
  911. }
  912. SANITIZER_INTERFACE_ATTRIBUTE
  913. char *__dfsw_fgets(char *s, int size, FILE *stream, dfsan_label s_label,
  914. dfsan_label size_label, dfsan_label stream_label,
  915. dfsan_label *ret_label) {
  916. char *ret = fgets(s, size, stream);
  917. if (ret) {
  918. dfsan_set_label(0, ret, strlen(ret) + 1);
  919. *ret_label = s_label;
  920. } else {
  921. *ret_label = 0;
  922. }
  923. return ret;
  924. }
  925. SANITIZER_INTERFACE_ATTRIBUTE
  926. char *__dfso_fgets(char *s, int size, FILE *stream, dfsan_label s_label,
  927. dfsan_label size_label, dfsan_label stream_label,
  928. dfsan_label *ret_label, dfsan_origin s_origin,
  929. dfsan_origin size_origin, dfsan_origin stream_origin,
  930. dfsan_origin *ret_origin) {
  931. char *ret = __dfsw_fgets(s, size, stream, s_label, size_label, stream_label,
  932. ret_label);
  933. if (ret)
  934. *ret_origin = s_origin;
  935. return ret;
  936. }
  937. SANITIZER_INTERFACE_ATTRIBUTE
  938. char *__dfsw_getcwd(char *buf, size_t size, dfsan_label buf_label,
  939. dfsan_label size_label, dfsan_label *ret_label) {
  940. char *ret = getcwd(buf, size);
  941. if (ret) {
  942. dfsan_set_label(0, ret, strlen(ret) + 1);
  943. *ret_label = buf_label;
  944. } else {
  945. *ret_label = 0;
  946. }
  947. return ret;
  948. }
  949. SANITIZER_INTERFACE_ATTRIBUTE
  950. char *__dfso_getcwd(char *buf, size_t size, dfsan_label buf_label,
  951. dfsan_label size_label, dfsan_label *ret_label,
  952. dfsan_origin buf_origin, dfsan_origin size_origin,
  953. dfsan_origin *ret_origin) {
  954. char *ret = __dfsw_getcwd(buf, size, buf_label, size_label, ret_label);
  955. if (ret)
  956. *ret_origin = buf_origin;
  957. return ret;
  958. }
  959. SANITIZER_INTERFACE_ATTRIBUTE
  960. char *__dfsw_get_current_dir_name(dfsan_label *ret_label) {
  961. char *ret = get_current_dir_name();
  962. if (ret)
  963. dfsan_set_label(0, ret, strlen(ret) + 1);
  964. *ret_label = 0;
  965. return ret;
  966. }
  967. SANITIZER_INTERFACE_ATTRIBUTE
  968. char *__dfso_get_current_dir_name(dfsan_label *ret_label,
  969. dfsan_origin *ret_origin) {
  970. return __dfsw_get_current_dir_name(ret_label);
  971. }
  972. // This function is only available for glibc 2.25 or newer. Mark it weak so
  973. // linking succeeds with older glibcs.
  974. SANITIZER_WEAK_ATTRIBUTE int getentropy(void *buffer, size_t length);
  975. SANITIZER_INTERFACE_ATTRIBUTE int __dfsw_getentropy(void *buffer, size_t length,
  976. dfsan_label buffer_label,
  977. dfsan_label length_label,
  978. dfsan_label *ret_label) {
  979. int ret = getentropy(buffer, length);
  980. if (ret == 0) {
  981. dfsan_set_label(0, buffer, length);
  982. }
  983. *ret_label = 0;
  984. return ret;
  985. }
  986. SANITIZER_INTERFACE_ATTRIBUTE int __dfso_getentropy(void *buffer, size_t length,
  987. dfsan_label buffer_label,
  988. dfsan_label length_label,
  989. dfsan_label *ret_label,
  990. dfsan_origin buffer_origin,
  991. dfsan_origin length_origin,
  992. dfsan_origin *ret_origin) {
  993. return __dfsw_getentropy(buffer, length, buffer_label, length_label,
  994. ret_label);
  995. }
  996. SANITIZER_INTERFACE_ATTRIBUTE
  997. int __dfsw_gethostname(char *name, size_t len, dfsan_label name_label,
  998. dfsan_label len_label, dfsan_label *ret_label) {
  999. int ret = gethostname(name, len);
  1000. if (ret == 0) {
  1001. dfsan_set_label(0, name, strlen(name) + 1);
  1002. }
  1003. *ret_label = 0;
  1004. return ret;
  1005. }
  1006. SANITIZER_INTERFACE_ATTRIBUTE
  1007. int __dfso_gethostname(char *name, size_t len, dfsan_label name_label,
  1008. dfsan_label len_label, dfsan_label *ret_label,
  1009. dfsan_origin name_origin, dfsan_origin len_origin,
  1010. dfsan_label *ret_origin) {
  1011. return __dfsw_gethostname(name, len, name_label, len_label, ret_label);
  1012. }
  1013. SANITIZER_INTERFACE_ATTRIBUTE
  1014. int __dfsw_getrlimit(int resource, struct rlimit *rlim,
  1015. dfsan_label resource_label, dfsan_label rlim_label,
  1016. dfsan_label *ret_label) {
  1017. int ret = getrlimit(resource, rlim);
  1018. if (ret == 0) {
  1019. dfsan_set_label(0, rlim, sizeof(struct rlimit));
  1020. }
  1021. *ret_label = 0;
  1022. return ret;
  1023. }
  1024. SANITIZER_INTERFACE_ATTRIBUTE
  1025. int __dfso_getrlimit(int resource, struct rlimit *rlim,
  1026. dfsan_label resource_label, dfsan_label rlim_label,
  1027. dfsan_label *ret_label, dfsan_origin resource_origin,
  1028. dfsan_origin rlim_origin, dfsan_origin *ret_origin) {
  1029. return __dfsw_getrlimit(resource, rlim, resource_label, rlim_label,
  1030. ret_label);
  1031. }
  1032. SANITIZER_INTERFACE_ATTRIBUTE
  1033. int __dfsw_getrusage(int who, struct rusage *usage, dfsan_label who_label,
  1034. dfsan_label usage_label, dfsan_label *ret_label) {
  1035. int ret = getrusage(who, usage);
  1036. if (ret == 0) {
  1037. dfsan_set_label(0, usage, sizeof(struct rusage));
  1038. }
  1039. *ret_label = 0;
  1040. return ret;
  1041. }
  1042. SANITIZER_INTERFACE_ATTRIBUTE
  1043. int __dfso_getrusage(int who, struct rusage *usage, dfsan_label who_label,
  1044. dfsan_label usage_label, dfsan_label *ret_label,
  1045. dfsan_origin who_origin, dfsan_origin usage_origin,
  1046. dfsan_label *ret_origin) {
  1047. return __dfsw_getrusage(who, usage, who_label, usage_label, ret_label);
  1048. }
  1049. SANITIZER_INTERFACE_ATTRIBUTE
  1050. char *__dfsw_strcpy(char *dest, const char *src, dfsan_label dst_label,
  1051. dfsan_label src_label, dfsan_label *ret_label) {
  1052. char *ret = strcpy(dest, src);
  1053. if (ret) {
  1054. dfsan_mem_shadow_transfer(dest, src, strlen(src) + 1);
  1055. }
  1056. *ret_label = dst_label;
  1057. return ret;
  1058. }
  1059. SANITIZER_INTERFACE_ATTRIBUTE
  1060. char *__dfso_strcpy(char *dest, const char *src, dfsan_label dst_label,
  1061. dfsan_label src_label, dfsan_label *ret_label,
  1062. dfsan_origin dst_origin, dfsan_origin src_origin,
  1063. dfsan_origin *ret_origin) {
  1064. char *ret = strcpy(dest, src);
  1065. if (ret) {
  1066. size_t str_len = strlen(src) + 1;
  1067. dfsan_mem_origin_transfer(dest, src, str_len);
  1068. dfsan_mem_shadow_transfer(dest, src, str_len);
  1069. }
  1070. *ret_label = dst_label;
  1071. *ret_origin = dst_origin;
  1072. return ret;
  1073. }
  1074. }
  1075. template <typename Fn>
  1076. static ALWAYS_INLINE auto dfsan_strtol_impl(
  1077. Fn real, const char *nptr, char **endptr, int base,
  1078. char **tmp_endptr) -> decltype(real(nullptr, nullptr, 0)) {
  1079. assert(tmp_endptr);
  1080. auto ret = real(nptr, tmp_endptr, base);
  1081. if (endptr)
  1082. *endptr = *tmp_endptr;
  1083. return ret;
  1084. }
  1085. extern "C" {
  1086. static void dfsan_strtolong_label(const char *nptr, const char *tmp_endptr,
  1087. dfsan_label base_label,
  1088. dfsan_label *ret_label) {
  1089. if (tmp_endptr > nptr) {
  1090. // If *tmp_endptr is '\0' include its label as well.
  1091. *ret_label = dfsan_union(
  1092. base_label,
  1093. dfsan_read_label(nptr, tmp_endptr - nptr + (*tmp_endptr ? 0 : 1)));
  1094. } else {
  1095. *ret_label = 0;
  1096. }
  1097. }
  1098. static void dfsan_strtolong_origin(const char *nptr, const char *tmp_endptr,
  1099. dfsan_label base_label,
  1100. dfsan_label *ret_label,
  1101. dfsan_origin base_origin,
  1102. dfsan_origin *ret_origin) {
  1103. if (tmp_endptr > nptr) {
  1104. // When multiple inputs are tainted, we propagate one of its origins.
  1105. // Because checking if base_label is tainted does not need additional
  1106. // computation, we prefer to propagating base_origin.
  1107. *ret_origin = base_label
  1108. ? base_origin
  1109. : dfsan_read_origin_of_first_taint(
  1110. nptr, tmp_endptr - nptr + (*tmp_endptr ? 0 : 1));
  1111. }
  1112. }
  1113. static double dfsan_strtod(const char *nptr, char **endptr, char **tmp_endptr) {
  1114. assert(tmp_endptr);
  1115. double ret = strtod(nptr, tmp_endptr);
  1116. if (endptr)
  1117. *endptr = *tmp_endptr;
  1118. return ret;
  1119. }
  1120. static void dfsan_strtod_label(const char *nptr, const char *tmp_endptr,
  1121. dfsan_label *ret_label) {
  1122. if (tmp_endptr > nptr) {
  1123. // If *tmp_endptr is '\0' include its label as well.
  1124. *ret_label = dfsan_read_label(
  1125. nptr,
  1126. tmp_endptr - nptr + (*tmp_endptr ? 0 : 1));
  1127. } else {
  1128. *ret_label = 0;
  1129. }
  1130. }
  1131. SANITIZER_INTERFACE_ATTRIBUTE
  1132. double __dfsw_strtod(const char *nptr, char **endptr, dfsan_label nptr_label,
  1133. dfsan_label endptr_label, dfsan_label *ret_label) {
  1134. char *tmp_endptr;
  1135. double ret = dfsan_strtod(nptr, endptr, &tmp_endptr);
  1136. dfsan_strtod_label(nptr, tmp_endptr, ret_label);
  1137. return ret;
  1138. }
  1139. SANITIZER_INTERFACE_ATTRIBUTE
  1140. double __dfso_strtod(const char *nptr, char **endptr, dfsan_label nptr_label,
  1141. dfsan_label endptr_label, dfsan_label *ret_label,
  1142. dfsan_origin nptr_origin, dfsan_origin endptr_origin,
  1143. dfsan_origin *ret_origin) {
  1144. char *tmp_endptr;
  1145. double ret = dfsan_strtod(nptr, endptr, &tmp_endptr);
  1146. dfsan_strtod_label(nptr, tmp_endptr, ret_label);
  1147. if (tmp_endptr > nptr) {
  1148. // If *tmp_endptr is '\0' include its label as well.
  1149. *ret_origin = dfsan_read_origin_of_first_taint(
  1150. nptr, tmp_endptr - nptr + (*tmp_endptr ? 0 : 1));
  1151. } else {
  1152. *ret_origin = 0;
  1153. }
  1154. return ret;
  1155. }
  1156. WRAPPER_ALIAS(__isoc23_strtod, strtod)
  1157. #define WRAPPER_STRTO(ret_type, fun) \
  1158. SANITIZER_INTERFACE_ATTRIBUTE ret_type __dfsw_##fun( \
  1159. const char *nptr, char **endptr, int base, dfsan_label nptr_label, \
  1160. dfsan_label endptr_label, dfsan_label base_label, \
  1161. dfsan_label *ret_label) { \
  1162. char *tmp_endptr; \
  1163. auto ret = dfsan_strtol_impl(fun, nptr, endptr, base, &tmp_endptr); \
  1164. dfsan_strtolong_label(nptr, tmp_endptr, base_label, ret_label); \
  1165. return ret; \
  1166. } \
  1167. SANITIZER_INTERFACE_ATTRIBUTE ret_type __dfso_##fun( \
  1168. const char *nptr, char **endptr, int base, dfsan_label nptr_label, \
  1169. dfsan_label endptr_label, dfsan_label base_label, \
  1170. dfsan_label *ret_label, dfsan_origin nptr_origin, \
  1171. dfsan_origin endptr_origin, dfsan_origin base_origin, \
  1172. dfsan_origin *ret_origin) { \
  1173. char *tmp_endptr; \
  1174. auto ret = dfsan_strtol_impl(fun, nptr, endptr, base, &tmp_endptr); \
  1175. dfsan_strtolong_label(nptr, tmp_endptr, base_label, ret_label); \
  1176. dfsan_strtolong_origin(nptr, tmp_endptr, base_label, ret_label, \
  1177. base_origin, ret_origin); \
  1178. return ret; \
  1179. }
  1180. WRAPPER_STRTO(long, strtol)
  1181. WRAPPER_STRTO(long long, strtoll)
  1182. WRAPPER_STRTO(unsigned long, strtoul)
  1183. WRAPPER_STRTO(unsigned long long, strtoull)
  1184. WRAPPER_ALIAS(__isoc23_strtol, strtol)
  1185. WRAPPER_ALIAS(__isoc23_strtoll, strtoll)
  1186. WRAPPER_ALIAS(__isoc23_strtoul, strtoul)
  1187. WRAPPER_ALIAS(__isoc23_strtoull, strtoull)
  1188. SANITIZER_INTERFACE_ATTRIBUTE
  1189. time_t __dfsw_time(time_t *t, dfsan_label t_label, dfsan_label *ret_label) {
  1190. time_t ret = time(t);
  1191. if (ret != (time_t) -1 && t) {
  1192. dfsan_set_label(0, t, sizeof(time_t));
  1193. }
  1194. *ret_label = 0;
  1195. return ret;
  1196. }
  1197. SANITIZER_INTERFACE_ATTRIBUTE
  1198. time_t __dfso_time(time_t *t, dfsan_label t_label, dfsan_label *ret_label,
  1199. dfsan_origin t_origin, dfsan_origin *ret_origin) {
  1200. return __dfsw_time(t, t_label, ret_label);
  1201. }
  1202. SANITIZER_INTERFACE_ATTRIBUTE
  1203. int __dfsw_inet_pton(int af, const char *src, void *dst, dfsan_label af_label,
  1204. dfsan_label src_label, dfsan_label dst_label,
  1205. dfsan_label *ret_label) {
  1206. int ret = inet_pton(af, src, dst);
  1207. if (ret == 1) {
  1208. dfsan_set_label(dfsan_read_label(src, strlen(src) + 1), dst,
  1209. af == AF_INET ? sizeof(struct in_addr) : sizeof(in6_addr));
  1210. }
  1211. *ret_label = 0;
  1212. return ret;
  1213. }
  1214. SANITIZER_INTERFACE_ATTRIBUTE
  1215. int __dfso_inet_pton(int af, const char *src, void *dst, dfsan_label af_label,
  1216. dfsan_label src_label, dfsan_label dst_label,
  1217. dfsan_label *ret_label, dfsan_origin af_origin,
  1218. dfsan_origin src_origin, dfsan_origin dst_origin,
  1219. dfsan_origin *ret_origin) {
  1220. int ret = inet_pton(af, src, dst);
  1221. if (ret == 1) {
  1222. int src_len = strlen(src) + 1;
  1223. dfsan_set_label_origin(
  1224. dfsan_read_label(src, src_len),
  1225. dfsan_read_origin_of_first_taint(src, src_len), dst,
  1226. af == AF_INET ? sizeof(struct in_addr) : sizeof(in6_addr));
  1227. }
  1228. *ret_label = 0;
  1229. return ret;
  1230. }
  1231. SANITIZER_INTERFACE_ATTRIBUTE
  1232. struct tm *__dfsw_localtime_r(const time_t *timep, struct tm *result,
  1233. dfsan_label timep_label, dfsan_label result_label,
  1234. dfsan_label *ret_label) {
  1235. struct tm *ret = localtime_r(timep, result);
  1236. if (ret) {
  1237. dfsan_set_label(dfsan_read_label(timep, sizeof(time_t)), result,
  1238. sizeof(struct tm));
  1239. *ret_label = result_label;
  1240. } else {
  1241. *ret_label = 0;
  1242. }
  1243. return ret;
  1244. }
  1245. SANITIZER_INTERFACE_ATTRIBUTE
  1246. struct tm *__dfso_localtime_r(const time_t *timep, struct tm *result,
  1247. dfsan_label timep_label, dfsan_label result_label,
  1248. dfsan_label *ret_label, dfsan_origin timep_origin,
  1249. dfsan_origin result_origin,
  1250. dfsan_origin *ret_origin) {
  1251. struct tm *ret = localtime_r(timep, result);
  1252. if (ret) {
  1253. dfsan_set_label_origin(
  1254. dfsan_read_label(timep, sizeof(time_t)),
  1255. dfsan_read_origin_of_first_taint(timep, sizeof(time_t)), result,
  1256. sizeof(struct tm));
  1257. *ret_label = result_label;
  1258. *ret_origin = result_origin;
  1259. } else {
  1260. *ret_label = 0;
  1261. }
  1262. return ret;
  1263. }
  1264. SANITIZER_INTERFACE_ATTRIBUTE
  1265. int __dfsw_getpwuid_r(id_t uid, struct passwd *pwd,
  1266. char *buf, size_t buflen, struct passwd **result,
  1267. dfsan_label uid_label, dfsan_label pwd_label,
  1268. dfsan_label buf_label, dfsan_label buflen_label,
  1269. dfsan_label result_label, dfsan_label *ret_label) {
  1270. // Store the data in pwd, the strings referenced from pwd in buf, and the
  1271. // address of pwd in *result. On failure, NULL is stored in *result.
  1272. int ret = getpwuid_r(uid, pwd, buf, buflen, result);
  1273. if (ret == 0) {
  1274. dfsan_set_label(0, pwd, sizeof(struct passwd));
  1275. dfsan_set_label(0, buf, strlen(buf) + 1);
  1276. }
  1277. *ret_label = 0;
  1278. dfsan_set_label(0, result, sizeof(struct passwd*));
  1279. return ret;
  1280. }
  1281. SANITIZER_INTERFACE_ATTRIBUTE
  1282. int __dfso_getpwuid_r(id_t uid, struct passwd *pwd, char *buf, size_t buflen,
  1283. struct passwd **result, dfsan_label uid_label,
  1284. dfsan_label pwd_label, dfsan_label buf_label,
  1285. dfsan_label buflen_label, dfsan_label result_label,
  1286. dfsan_label *ret_label, dfsan_origin uid_origin,
  1287. dfsan_origin pwd_origin, dfsan_origin buf_origin,
  1288. dfsan_origin buflen_origin, dfsan_origin result_origin,
  1289. dfsan_origin *ret_origin) {
  1290. return __dfsw_getpwuid_r(uid, pwd, buf, buflen, result, uid_label, pwd_label,
  1291. buf_label, buflen_label, result_label, ret_label);
  1292. }
  1293. SANITIZER_INTERFACE_ATTRIBUTE
  1294. int __dfsw_epoll_wait(int epfd, struct epoll_event *events, int maxevents,
  1295. int timeout, dfsan_label epfd_label,
  1296. dfsan_label events_label, dfsan_label maxevents_label,
  1297. dfsan_label timeout_label, dfsan_label *ret_label) {
  1298. int ret = epoll_wait(epfd, events, maxevents, timeout);
  1299. if (ret > 0)
  1300. dfsan_set_label(0, events, ret * sizeof(*events));
  1301. *ret_label = 0;
  1302. return ret;
  1303. }
  1304. SANITIZER_INTERFACE_ATTRIBUTE
  1305. int __dfso_epoll_wait(int epfd, struct epoll_event *events, int maxevents,
  1306. int timeout, dfsan_label epfd_label,
  1307. dfsan_label events_label, dfsan_label maxevents_label,
  1308. dfsan_label timeout_label, dfsan_label *ret_label,
  1309. dfsan_origin epfd_origin, dfsan_origin events_origin,
  1310. dfsan_origin maxevents_origin,
  1311. dfsan_origin timeout_origin, dfsan_origin *ret_origin) {
  1312. return __dfsw_epoll_wait(epfd, events, maxevents, timeout, epfd_label,
  1313. events_label, maxevents_label, timeout_label,
  1314. ret_label);
  1315. }
  1316. SANITIZER_INTERFACE_ATTRIBUTE
  1317. int __dfsw_poll(struct pollfd *fds, nfds_t nfds, int timeout,
  1318. dfsan_label dfs_label, dfsan_label nfds_label,
  1319. dfsan_label timeout_label, dfsan_label *ret_label) {
  1320. int ret = poll(fds, nfds, timeout);
  1321. if (ret >= 0) {
  1322. for (; nfds > 0; --nfds) {
  1323. dfsan_set_label(0, &fds[nfds - 1].revents, sizeof(fds[nfds - 1].revents));
  1324. }
  1325. }
  1326. *ret_label = 0;
  1327. return ret;
  1328. }
  1329. SANITIZER_INTERFACE_ATTRIBUTE
  1330. int __dfso_poll(struct pollfd *fds, nfds_t nfds, int timeout,
  1331. dfsan_label dfs_label, dfsan_label nfds_label,
  1332. dfsan_label timeout_label, dfsan_label *ret_label,
  1333. dfsan_origin dfs_origin, dfsan_origin nfds_origin,
  1334. dfsan_origin timeout_origin, dfsan_origin *ret_origin) {
  1335. return __dfsw_poll(fds, nfds, timeout, dfs_label, nfds_label, timeout_label,
  1336. ret_label);
  1337. }
  1338. SANITIZER_INTERFACE_ATTRIBUTE
  1339. int __dfsw_select(int nfds, fd_set *readfds, fd_set *writefds,
  1340. fd_set *exceptfds, struct timeval *timeout,
  1341. dfsan_label nfds_label, dfsan_label readfds_label,
  1342. dfsan_label writefds_label, dfsan_label exceptfds_label,
  1343. dfsan_label timeout_label, dfsan_label *ret_label) {
  1344. int ret = select(nfds, readfds, writefds, exceptfds, timeout);
  1345. // Clear everything (also on error) since their content is either set or
  1346. // undefined.
  1347. if (readfds) {
  1348. dfsan_set_label(0, readfds, sizeof(fd_set));
  1349. }
  1350. if (writefds) {
  1351. dfsan_set_label(0, writefds, sizeof(fd_set));
  1352. }
  1353. if (exceptfds) {
  1354. dfsan_set_label(0, exceptfds, sizeof(fd_set));
  1355. }
  1356. dfsan_set_label(0, timeout, sizeof(struct timeval));
  1357. *ret_label = 0;
  1358. return ret;
  1359. }
  1360. SANITIZER_INTERFACE_ATTRIBUTE
  1361. int __dfso_select(int nfds, fd_set *readfds, fd_set *writefds,
  1362. fd_set *exceptfds, struct timeval *timeout,
  1363. dfsan_label nfds_label, dfsan_label readfds_label,
  1364. dfsan_label writefds_label, dfsan_label exceptfds_label,
  1365. dfsan_label timeout_label, dfsan_label *ret_label,
  1366. dfsan_origin nfds_origin, dfsan_origin readfds_origin,
  1367. dfsan_origin writefds_origin, dfsan_origin exceptfds_origin,
  1368. dfsan_origin timeout_origin, dfsan_origin *ret_origin) {
  1369. return __dfsw_select(nfds, readfds, writefds, exceptfds, timeout, nfds_label,
  1370. readfds_label, writefds_label, exceptfds_label,
  1371. timeout_label, ret_label);
  1372. }
  1373. SANITIZER_INTERFACE_ATTRIBUTE
  1374. int __dfsw_sched_getaffinity(pid_t pid, size_t cpusetsize, cpu_set_t *mask,
  1375. dfsan_label pid_label,
  1376. dfsan_label cpusetsize_label,
  1377. dfsan_label mask_label, dfsan_label *ret_label) {
  1378. int ret = sched_getaffinity(pid, cpusetsize, mask);
  1379. if (ret == 0) {
  1380. dfsan_set_label(0, mask, cpusetsize);
  1381. }
  1382. *ret_label = 0;
  1383. return ret;
  1384. }
  1385. SANITIZER_INTERFACE_ATTRIBUTE
  1386. int __dfso_sched_getaffinity(pid_t pid, size_t cpusetsize, cpu_set_t *mask,
  1387. dfsan_label pid_label,
  1388. dfsan_label cpusetsize_label,
  1389. dfsan_label mask_label, dfsan_label *ret_label,
  1390. dfsan_origin pid_origin,
  1391. dfsan_origin cpusetsize_origin,
  1392. dfsan_origin mask_origin,
  1393. dfsan_origin *ret_origin) {
  1394. return __dfsw_sched_getaffinity(pid, cpusetsize, mask, pid_label,
  1395. cpusetsize_label, mask_label, ret_label);
  1396. }
  1397. SANITIZER_INTERFACE_ATTRIBUTE
  1398. int __dfsw_sigemptyset(sigset_t *set, dfsan_label set_label,
  1399. dfsan_label *ret_label) {
  1400. int ret = sigemptyset(set);
  1401. dfsan_set_label(0, set, sizeof(sigset_t));
  1402. *ret_label = 0;
  1403. return ret;
  1404. }
  1405. SANITIZER_INTERFACE_ATTRIBUTE
  1406. int __dfso_sigemptyset(sigset_t *set, dfsan_label set_label,
  1407. dfsan_label *ret_label, dfsan_origin set_origin,
  1408. dfsan_origin *ret_origin) {
  1409. return __dfsw_sigemptyset(set, set_label, ret_label);
  1410. }
  1411. class SignalHandlerScope {
  1412. public:
  1413. SignalHandlerScope() {
  1414. if (DFsanThread *t = GetCurrentThread())
  1415. t->EnterSignalHandler();
  1416. }
  1417. ~SignalHandlerScope() {
  1418. if (DFsanThread *t = GetCurrentThread())
  1419. t->LeaveSignalHandler();
  1420. }
  1421. };
  1422. // Clear DFSan runtime TLS state at the end of a scope.
  1423. //
  1424. // Implementation must be async-signal-safe and use small data size, because
  1425. // instances of this class may live on the signal handler stack.
  1426. //
  1427. // DFSan uses TLS to pass metadata of arguments and return values. When an
  1428. // instrumented function accesses the TLS, if a signal callback happens, and the
  1429. // callback calls other instrumented functions with updating the same TLS, the
  1430. // TLS is in an inconsistent state after the callback ends. This may cause
  1431. // either under-tainting or over-tainting.
  1432. //
  1433. // The current implementation simply resets TLS at restore. This prevents from
  1434. // over-tainting. Although under-tainting may still happen, a taint flow can be
  1435. // found eventually if we run a DFSan-instrumented program multiple times. The
  1436. // alternative option is saving the entire TLS. However the TLS storage takes
  1437. // 2k bytes, and signal calls could be nested. So it does not seem worth.
  1438. class ScopedClearThreadLocalState {
  1439. public:
  1440. ScopedClearThreadLocalState() {}
  1441. ~ScopedClearThreadLocalState() { dfsan_clear_thread_local_state(); }
  1442. };
  1443. // SignalSpinLocker::sigactions_mu guarantees atomicity of sigaction() calls.
  1444. const int kMaxSignals = 1024;
  1445. static atomic_uintptr_t sigactions[kMaxSignals];
  1446. static void SignalHandler(int signo) {
  1447. SignalHandlerScope signal_handler_scope;
  1448. ScopedClearThreadLocalState scoped_clear_tls;
  1449. // Clear shadows for all inputs provided by system.
  1450. dfsan_clear_arg_tls(0, sizeof(dfsan_label));
  1451. typedef void (*signal_cb)(int x);
  1452. signal_cb cb =
  1453. (signal_cb)atomic_load(&sigactions[signo], memory_order_relaxed);
  1454. cb(signo);
  1455. }
  1456. static void SignalAction(int signo, siginfo_t *si, void *uc) {
  1457. SignalHandlerScope signal_handler_scope;
  1458. ScopedClearThreadLocalState scoped_clear_tls;
  1459. // Clear shadows for all inputs provided by system. Similar to SignalHandler.
  1460. dfsan_clear_arg_tls(0, 3 * sizeof(dfsan_label));
  1461. dfsan_set_label(0, si, sizeof(*si));
  1462. dfsan_set_label(0, uc, sizeof(ucontext_t));
  1463. typedef void (*sigaction_cb)(int, siginfo_t *, void *);
  1464. sigaction_cb cb =
  1465. (sigaction_cb)atomic_load(&sigactions[signo], memory_order_relaxed);
  1466. cb(signo, si, uc);
  1467. }
  1468. SANITIZER_INTERFACE_ATTRIBUTE
  1469. int __dfsw_sigaction(int signum, const struct sigaction *act,
  1470. struct sigaction *oldact, dfsan_label signum_label,
  1471. dfsan_label act_label, dfsan_label oldact_label,
  1472. dfsan_label *ret_label) {
  1473. CHECK_LT(signum, kMaxSignals);
  1474. SignalSpinLocker lock;
  1475. uptr old_cb = atomic_load(&sigactions[signum], memory_order_relaxed);
  1476. struct sigaction new_act;
  1477. struct sigaction *pnew_act = act ? &new_act : nullptr;
  1478. if (act) {
  1479. internal_memcpy(pnew_act, act, sizeof(struct sigaction));
  1480. if (pnew_act->sa_flags & SA_SIGINFO) {
  1481. uptr cb = (uptr)(pnew_act->sa_sigaction);
  1482. if (cb != (uptr)SIG_IGN && cb != (uptr)SIG_DFL) {
  1483. atomic_store(&sigactions[signum], cb, memory_order_relaxed);
  1484. pnew_act->sa_sigaction = SignalAction;
  1485. }
  1486. } else {
  1487. uptr cb = (uptr)(pnew_act->sa_handler);
  1488. if (cb != (uptr)SIG_IGN && cb != (uptr)SIG_DFL) {
  1489. atomic_store(&sigactions[signum], cb, memory_order_relaxed);
  1490. pnew_act->sa_handler = SignalHandler;
  1491. }
  1492. }
  1493. }
  1494. int ret = sigaction(signum, pnew_act, oldact);
  1495. if (ret == 0 && oldact) {
  1496. if (oldact->sa_flags & SA_SIGINFO) {
  1497. if (oldact->sa_sigaction == SignalAction)
  1498. oldact->sa_sigaction = (decltype(oldact->sa_sigaction))old_cb;
  1499. } else {
  1500. if (oldact->sa_handler == SignalHandler)
  1501. oldact->sa_handler = (decltype(oldact->sa_handler))old_cb;
  1502. }
  1503. }
  1504. if (oldact) {
  1505. dfsan_set_label(0, oldact, sizeof(struct sigaction));
  1506. }
  1507. *ret_label = 0;
  1508. return ret;
  1509. }
  1510. SANITIZER_INTERFACE_ATTRIBUTE
  1511. int __dfso_sigaction(int signum, const struct sigaction *act,
  1512. struct sigaction *oldact, dfsan_label signum_label,
  1513. dfsan_label act_label, dfsan_label oldact_label,
  1514. dfsan_label *ret_label, dfsan_origin signum_origin,
  1515. dfsan_origin act_origin, dfsan_origin oldact_origin,
  1516. dfsan_origin *ret_origin) {
  1517. return __dfsw_sigaction(signum, act, oldact, signum_label, act_label,
  1518. oldact_label, ret_label);
  1519. }
  1520. static sighandler_t dfsan_signal(int signum, sighandler_t handler,
  1521. dfsan_label *ret_label) {
  1522. CHECK_LT(signum, kMaxSignals);
  1523. SignalSpinLocker lock;
  1524. uptr old_cb = atomic_load(&sigactions[signum], memory_order_relaxed);
  1525. if (handler != SIG_IGN && handler != SIG_DFL) {
  1526. atomic_store(&sigactions[signum], (uptr)handler, memory_order_relaxed);
  1527. handler = &SignalHandler;
  1528. }
  1529. sighandler_t ret = signal(signum, handler);
  1530. if (ret == SignalHandler)
  1531. ret = (sighandler_t)old_cb;
  1532. *ret_label = 0;
  1533. return ret;
  1534. }
  1535. SANITIZER_INTERFACE_ATTRIBUTE
  1536. sighandler_t __dfsw_signal(int signum, sighandler_t handler,
  1537. dfsan_label signum_label, dfsan_label handler_label,
  1538. dfsan_label *ret_label) {
  1539. return dfsan_signal(signum, handler, ret_label);
  1540. }
  1541. SANITIZER_INTERFACE_ATTRIBUTE
  1542. sighandler_t __dfso_signal(int signum, sighandler_t handler,
  1543. dfsan_label signum_label, dfsan_label handler_label,
  1544. dfsan_label *ret_label, dfsan_origin signum_origin,
  1545. dfsan_origin handler_origin,
  1546. dfsan_origin *ret_origin) {
  1547. return dfsan_signal(signum, handler, ret_label);
  1548. }
  1549. SANITIZER_INTERFACE_ATTRIBUTE
  1550. int __dfsw_sigaltstack(const stack_t *ss, stack_t *old_ss, dfsan_label ss_label,
  1551. dfsan_label old_ss_label, dfsan_label *ret_label) {
  1552. int ret = sigaltstack(ss, old_ss);
  1553. if (ret != -1 && old_ss)
  1554. dfsan_set_label(0, old_ss, sizeof(*old_ss));
  1555. *ret_label = 0;
  1556. return ret;
  1557. }
  1558. SANITIZER_INTERFACE_ATTRIBUTE
  1559. int __dfso_sigaltstack(const stack_t *ss, stack_t *old_ss, dfsan_label ss_label,
  1560. dfsan_label old_ss_label, dfsan_label *ret_label,
  1561. dfsan_origin ss_origin, dfsan_origin old_ss_origin,
  1562. dfsan_origin *ret_origin) {
  1563. return __dfsw_sigaltstack(ss, old_ss, ss_label, old_ss_label, ret_label);
  1564. }
  1565. SANITIZER_INTERFACE_ATTRIBUTE
  1566. int __dfsw_gettimeofday(struct timeval *tv, struct timezone *tz,
  1567. dfsan_label tv_label, dfsan_label tz_label,
  1568. dfsan_label *ret_label) {
  1569. int ret = gettimeofday(tv, tz);
  1570. if (tv) {
  1571. dfsan_set_label(0, tv, sizeof(struct timeval));
  1572. }
  1573. if (tz) {
  1574. dfsan_set_label(0, tz, sizeof(struct timezone));
  1575. }
  1576. *ret_label = 0;
  1577. return ret;
  1578. }
  1579. SANITIZER_INTERFACE_ATTRIBUTE
  1580. int __dfso_gettimeofday(struct timeval *tv, struct timezone *tz,
  1581. dfsan_label tv_label, dfsan_label tz_label,
  1582. dfsan_label *ret_label, dfsan_origin tv_origin,
  1583. dfsan_origin tz_origin, dfsan_origin *ret_origin) {
  1584. return __dfsw_gettimeofday(tv, tz, tv_label, tz_label, ret_label);
  1585. }
  1586. SANITIZER_INTERFACE_ATTRIBUTE void *__dfsw_memchr(void *s, int c, size_t n,
  1587. dfsan_label s_label,
  1588. dfsan_label c_label,
  1589. dfsan_label n_label,
  1590. dfsan_label *ret_label) {
  1591. void *ret = memchr(s, c, n);
  1592. if (flags().strict_data_dependencies) {
  1593. *ret_label = ret ? s_label : 0;
  1594. } else {
  1595. size_t len =
  1596. ret ? reinterpret_cast<char *>(ret) - reinterpret_cast<char *>(s) + 1
  1597. : n;
  1598. *ret_label =
  1599. dfsan_union(dfsan_read_label(s, len), dfsan_union(s_label, c_label));
  1600. }
  1601. return ret;
  1602. }
  1603. SANITIZER_INTERFACE_ATTRIBUTE void *__dfso_memchr(
  1604. void *s, int c, size_t n, dfsan_label s_label, dfsan_label c_label,
  1605. dfsan_label n_label, dfsan_label *ret_label, dfsan_origin s_origin,
  1606. dfsan_origin c_origin, dfsan_origin n_origin, dfsan_origin *ret_origin) {
  1607. void *ret = __dfsw_memchr(s, c, n, s_label, c_label, n_label, ret_label);
  1608. if (flags().strict_data_dependencies) {
  1609. if (ret)
  1610. *ret_origin = s_origin;
  1611. } else {
  1612. size_t len =
  1613. ret ? reinterpret_cast<char *>(ret) - reinterpret_cast<char *>(s) + 1
  1614. : n;
  1615. dfsan_origin o = dfsan_read_origin_of_first_taint(s, len);
  1616. *ret_origin = o ? o : (s_label ? s_origin : c_origin);
  1617. }
  1618. return ret;
  1619. }
  1620. SANITIZER_INTERFACE_ATTRIBUTE char *__dfsw_strrchr(char *s, int c,
  1621. dfsan_label s_label,
  1622. dfsan_label c_label,
  1623. dfsan_label *ret_label) {
  1624. char *ret = strrchr(s, c);
  1625. if (flags().strict_data_dependencies) {
  1626. *ret_label = ret ? s_label : 0;
  1627. } else {
  1628. *ret_label =
  1629. dfsan_union(dfsan_read_label(s, strlen(s) + 1),
  1630. dfsan_union(s_label, c_label));
  1631. }
  1632. return ret;
  1633. }
  1634. SANITIZER_INTERFACE_ATTRIBUTE char *__dfso_strrchr(
  1635. char *s, int c, dfsan_label s_label, dfsan_label c_label,
  1636. dfsan_label *ret_label, dfsan_origin s_origin, dfsan_origin c_origin,
  1637. dfsan_origin *ret_origin) {
  1638. char *ret = __dfsw_strrchr(s, c, s_label, c_label, ret_label);
  1639. if (flags().strict_data_dependencies) {
  1640. if (ret)
  1641. *ret_origin = s_origin;
  1642. } else {
  1643. size_t s_len = strlen(s) + 1;
  1644. dfsan_origin o = dfsan_read_origin_of_first_taint(s, s_len);
  1645. *ret_origin = o ? o : (s_label ? s_origin : c_origin);
  1646. }
  1647. return ret;
  1648. }
  1649. SANITIZER_INTERFACE_ATTRIBUTE char *__dfsw_strstr(char *haystack, char *needle,
  1650. dfsan_label haystack_label,
  1651. dfsan_label needle_label,
  1652. dfsan_label *ret_label) {
  1653. char *ret = strstr(haystack, needle);
  1654. if (flags().strict_data_dependencies) {
  1655. *ret_label = ret ? haystack_label : 0;
  1656. } else {
  1657. size_t len = ret ? ret + strlen(needle) - haystack : strlen(haystack) + 1;
  1658. *ret_label =
  1659. dfsan_union(dfsan_read_label(haystack, len),
  1660. dfsan_union(dfsan_read_label(needle, strlen(needle) + 1),
  1661. dfsan_union(haystack_label, needle_label)));
  1662. }
  1663. return ret;
  1664. }
  1665. SANITIZER_INTERFACE_ATTRIBUTE char *__dfso_strstr(char *haystack, char *needle,
  1666. dfsan_label haystack_label,
  1667. dfsan_label needle_label,
  1668. dfsan_label *ret_label,
  1669. dfsan_origin haystack_origin,
  1670. dfsan_origin needle_origin,
  1671. dfsan_origin *ret_origin) {
  1672. char *ret =
  1673. __dfsw_strstr(haystack, needle, haystack_label, needle_label, ret_label);
  1674. if (flags().strict_data_dependencies) {
  1675. if (ret)
  1676. *ret_origin = haystack_origin;
  1677. } else {
  1678. size_t needle_len = strlen(needle);
  1679. size_t len = ret ? ret + needle_len - haystack : strlen(haystack) + 1;
  1680. dfsan_origin o = dfsan_read_origin_of_first_taint(haystack, len);
  1681. if (o) {
  1682. *ret_origin = o;
  1683. } else {
  1684. o = dfsan_read_origin_of_first_taint(needle, needle_len + 1);
  1685. *ret_origin = o ? o : (haystack_label ? haystack_origin : needle_origin);
  1686. }
  1687. }
  1688. return ret;
  1689. }
  1690. SANITIZER_INTERFACE_ATTRIBUTE int __dfsw_nanosleep(const struct timespec *req,
  1691. struct timespec *rem,
  1692. dfsan_label req_label,
  1693. dfsan_label rem_label,
  1694. dfsan_label *ret_label) {
  1695. int ret = nanosleep(req, rem);
  1696. *ret_label = 0;
  1697. if (ret == -1) {
  1698. // Interrupted by a signal, rem is filled with the remaining time.
  1699. dfsan_set_label(0, rem, sizeof(struct timespec));
  1700. }
  1701. return ret;
  1702. }
  1703. SANITIZER_INTERFACE_ATTRIBUTE int __dfso_nanosleep(
  1704. const struct timespec *req, struct timespec *rem, dfsan_label req_label,
  1705. dfsan_label rem_label, dfsan_label *ret_label, dfsan_origin req_origin,
  1706. dfsan_origin rem_origin, dfsan_origin *ret_origin) {
  1707. return __dfsw_nanosleep(req, rem, req_label, rem_label, ret_label);
  1708. }
  1709. static void clear_msghdr_labels(size_t bytes_written, struct msghdr *msg) {
  1710. dfsan_set_label(0, msg, sizeof(*msg));
  1711. dfsan_set_label(0, msg->msg_name, msg->msg_namelen);
  1712. dfsan_set_label(0, msg->msg_control, msg->msg_controllen);
  1713. for (size_t i = 0; bytes_written > 0; ++i) {
  1714. assert(i < msg->msg_iovlen);
  1715. struct iovec *iov = &msg->msg_iov[i];
  1716. size_t iov_written =
  1717. bytes_written < iov->iov_len ? bytes_written : iov->iov_len;
  1718. dfsan_set_label(0, iov->iov_base, iov_written);
  1719. bytes_written -= iov_written;
  1720. }
  1721. }
  1722. SANITIZER_INTERFACE_ATTRIBUTE int __dfsw_recvmmsg(
  1723. int sockfd, struct mmsghdr *msgvec, unsigned int vlen, int flags,
  1724. struct timespec *timeout, dfsan_label sockfd_label,
  1725. dfsan_label msgvec_label, dfsan_label vlen_label, dfsan_label flags_label,
  1726. dfsan_label timeout_label, dfsan_label *ret_label) {
  1727. int ret = recvmmsg(sockfd, msgvec, vlen, flags, timeout);
  1728. for (int i = 0; i < ret; ++i) {
  1729. dfsan_set_label(0, &msgvec[i].msg_len, sizeof(msgvec[i].msg_len));
  1730. clear_msghdr_labels(msgvec[i].msg_len, &msgvec[i].msg_hdr);
  1731. }
  1732. *ret_label = 0;
  1733. return ret;
  1734. }
  1735. SANITIZER_INTERFACE_ATTRIBUTE int __dfso_recvmmsg(
  1736. int sockfd, struct mmsghdr *msgvec, unsigned int vlen, int flags,
  1737. struct timespec *timeout, dfsan_label sockfd_label,
  1738. dfsan_label msgvec_label, dfsan_label vlen_label, dfsan_label flags_label,
  1739. dfsan_label timeout_label, dfsan_label *ret_label,
  1740. dfsan_origin sockfd_origin, dfsan_origin msgvec_origin,
  1741. dfsan_origin vlen_origin, dfsan_origin flags_origin,
  1742. dfsan_origin timeout_origin, dfsan_origin *ret_origin) {
  1743. return __dfsw_recvmmsg(sockfd, msgvec, vlen, flags, timeout, sockfd_label,
  1744. msgvec_label, vlen_label, flags_label, timeout_label,
  1745. ret_label);
  1746. }
  1747. SANITIZER_INTERFACE_ATTRIBUTE ssize_t __dfsw_recvmsg(
  1748. int sockfd, struct msghdr *msg, int flags, dfsan_label sockfd_label,
  1749. dfsan_label msg_label, dfsan_label flags_label, dfsan_label *ret_label) {
  1750. ssize_t ret = recvmsg(sockfd, msg, flags);
  1751. if (ret >= 0)
  1752. clear_msghdr_labels(ret, msg);
  1753. *ret_label = 0;
  1754. return ret;
  1755. }
  1756. SANITIZER_INTERFACE_ATTRIBUTE ssize_t __dfso_recvmsg(
  1757. int sockfd, struct msghdr *msg, int flags, dfsan_label sockfd_label,
  1758. dfsan_label msg_label, dfsan_label flags_label, dfsan_label *ret_label,
  1759. dfsan_origin sockfd_origin, dfsan_origin msg_origin,
  1760. dfsan_origin flags_origin, dfsan_origin *ret_origin) {
  1761. return __dfsw_recvmsg(sockfd, msg, flags, sockfd_label, msg_label,
  1762. flags_label, ret_label);
  1763. }
  1764. SANITIZER_INTERFACE_ATTRIBUTE int
  1765. __dfsw_socketpair(int domain, int type, int protocol, int sv[2],
  1766. dfsan_label domain_label, dfsan_label type_label,
  1767. dfsan_label protocol_label, dfsan_label sv_label,
  1768. dfsan_label *ret_label) {
  1769. int ret = socketpair(domain, type, protocol, sv);
  1770. *ret_label = 0;
  1771. if (ret == 0) {
  1772. dfsan_set_label(0, sv, sizeof(*sv) * 2);
  1773. }
  1774. return ret;
  1775. }
  1776. SANITIZER_INTERFACE_ATTRIBUTE int __dfso_socketpair(
  1777. int domain, int type, int protocol, int sv[2], dfsan_label domain_label,
  1778. dfsan_label type_label, dfsan_label protocol_label, dfsan_label sv_label,
  1779. dfsan_label *ret_label, dfsan_origin domain_origin,
  1780. dfsan_origin type_origin, dfsan_origin protocol_origin,
  1781. dfsan_origin sv_origin, dfsan_origin *ret_origin) {
  1782. return __dfsw_socketpair(domain, type, protocol, sv, domain_label, type_label,
  1783. protocol_label, sv_label, ret_label);
  1784. }
  1785. SANITIZER_INTERFACE_ATTRIBUTE int __dfsw_getsockopt(
  1786. int sockfd, int level, int optname, void *optval, socklen_t *optlen,
  1787. dfsan_label sockfd_label, dfsan_label level_label,
  1788. dfsan_label optname_label, dfsan_label optval_label,
  1789. dfsan_label optlen_label, dfsan_label *ret_label) {
  1790. int ret = getsockopt(sockfd, level, optname, optval, optlen);
  1791. if (ret != -1 && optval && optlen) {
  1792. dfsan_set_label(0, optlen, sizeof(*optlen));
  1793. dfsan_set_label(0, optval, *optlen);
  1794. }
  1795. *ret_label = 0;
  1796. return ret;
  1797. }
  1798. SANITIZER_INTERFACE_ATTRIBUTE int __dfso_getsockopt(
  1799. int sockfd, int level, int optname, void *optval, socklen_t *optlen,
  1800. dfsan_label sockfd_label, dfsan_label level_label,
  1801. dfsan_label optname_label, dfsan_label optval_label,
  1802. dfsan_label optlen_label, dfsan_label *ret_label,
  1803. dfsan_origin sockfd_origin, dfsan_origin level_origin,
  1804. dfsan_origin optname_origin, dfsan_origin optval_origin,
  1805. dfsan_origin optlen_origin, dfsan_origin *ret_origin) {
  1806. return __dfsw_getsockopt(sockfd, level, optname, optval, optlen, sockfd_label,
  1807. level_label, optname_label, optval_label,
  1808. optlen_label, ret_label);
  1809. }
  1810. SANITIZER_INTERFACE_ATTRIBUTE int __dfsw_getsockname(
  1811. int sockfd, struct sockaddr *addr, socklen_t *addrlen,
  1812. dfsan_label sockfd_label, dfsan_label addr_label, dfsan_label addrlen_label,
  1813. dfsan_label *ret_label) {
  1814. socklen_t origlen = addrlen ? *addrlen : 0;
  1815. int ret = getsockname(sockfd, addr, addrlen);
  1816. if (ret != -1 && addr && addrlen) {
  1817. socklen_t written_bytes = origlen < *addrlen ? origlen : *addrlen;
  1818. dfsan_set_label(0, addrlen, sizeof(*addrlen));
  1819. dfsan_set_label(0, addr, written_bytes);
  1820. }
  1821. *ret_label = 0;
  1822. return ret;
  1823. }
  1824. SANITIZER_INTERFACE_ATTRIBUTE int __dfso_getsockname(
  1825. int sockfd, struct sockaddr *addr, socklen_t *addrlen,
  1826. dfsan_label sockfd_label, dfsan_label addr_label, dfsan_label addrlen_label,
  1827. dfsan_label *ret_label, dfsan_origin sockfd_origin,
  1828. dfsan_origin addr_origin, dfsan_origin addrlen_origin,
  1829. dfsan_origin *ret_origin) {
  1830. return __dfsw_getsockname(sockfd, addr, addrlen, sockfd_label, addr_label,
  1831. addrlen_label, ret_label);
  1832. }
  1833. SANITIZER_INTERFACE_ATTRIBUTE int __dfsw_getpeername(
  1834. int sockfd, struct sockaddr *addr, socklen_t *addrlen,
  1835. dfsan_label sockfd_label, dfsan_label addr_label, dfsan_label addrlen_label,
  1836. dfsan_label *ret_label) {
  1837. socklen_t origlen = addrlen ? *addrlen : 0;
  1838. int ret = getpeername(sockfd, addr, addrlen);
  1839. if (ret != -1 && addr && addrlen) {
  1840. socklen_t written_bytes = origlen < *addrlen ? origlen : *addrlen;
  1841. dfsan_set_label(0, addrlen, sizeof(*addrlen));
  1842. dfsan_set_label(0, addr, written_bytes);
  1843. }
  1844. *ret_label = 0;
  1845. return ret;
  1846. }
  1847. SANITIZER_INTERFACE_ATTRIBUTE int __dfso_getpeername(
  1848. int sockfd, struct sockaddr *addr, socklen_t *addrlen,
  1849. dfsan_label sockfd_label, dfsan_label addr_label, dfsan_label addrlen_label,
  1850. dfsan_label *ret_label, dfsan_origin sockfd_origin,
  1851. dfsan_origin addr_origin, dfsan_origin addrlen_origin,
  1852. dfsan_origin *ret_origin) {
  1853. return __dfsw_getpeername(sockfd, addr, addrlen, sockfd_label, addr_label,
  1854. addrlen_label, ret_label);
  1855. }
  1856. // Type of the function passed to dfsan_set_write_callback.
  1857. typedef void (*write_dfsan_callback_t)(int fd, const void *buf, ssize_t count);
  1858. // Calls to dfsan_set_write_callback() set the values in this struct.
  1859. // Calls to the custom version of write() read (and invoke) them.
  1860. static struct {
  1861. write_dfsan_callback_t write_callback = nullptr;
  1862. } write_callback_info;
  1863. SANITIZER_INTERFACE_ATTRIBUTE void __dfsw_dfsan_set_write_callback(
  1864. write_dfsan_callback_t write_callback, dfsan_label write_callback_label,
  1865. dfsan_label *ret_label) {
  1866. write_callback_info.write_callback = write_callback;
  1867. }
  1868. SANITIZER_INTERFACE_ATTRIBUTE void __dfso_dfsan_set_write_callback(
  1869. write_dfsan_callback_t write_callback, dfsan_label write_callback_label,
  1870. dfsan_label *ret_label, dfsan_origin write_callback_origin,
  1871. dfsan_origin *ret_origin) {
  1872. write_callback_info.write_callback = write_callback;
  1873. }
  1874. static inline void setup_tls_args_for_write_callback(
  1875. dfsan_label fd_label, dfsan_label buf_label, dfsan_label count_label,
  1876. bool origins, dfsan_origin fd_origin, dfsan_origin buf_origin,
  1877. dfsan_origin count_origin) {
  1878. // The callback code will expect argument shadow labels in the args TLS,
  1879. // and origin labels in the origin args TLS.
  1880. // Previously this was done by a trampoline, but we want to remove this:
  1881. // https://github.com/llvm/llvm-project/issues/54172
  1882. //
  1883. // Instead, this code is manually setting up the args TLS data.
  1884. //
  1885. // The offsets used need to correspond with the instrumentation code,
  1886. // see llvm/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp
  1887. // DFSanFunction::getShadowForTLSArgument.
  1888. // https://github.com/llvm/llvm-project/blob/0acc9e4b5edd8b39ff3d4c6d0e17f02007671c4e/llvm/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp#L1684
  1889. // https://github.com/llvm/llvm-project/blob/0acc9e4b5edd8b39ff3d4c6d0e17f02007671c4e/llvm/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp#L125
  1890. //
  1891. // Here the arguments are all primitives, but it can be more complex
  1892. // to compute offsets for array/aggregate type arguments.
  1893. //
  1894. // TODO(browneee): Consider a builtin to improve maintainabliity.
  1895. // With a builtin, we would provide the argument labels via builtin,
  1896. // and the builtin would reuse parts of the instrumentation code to ensure
  1897. // that this code and the instrumentation can never be out of sync.
  1898. // Note: Currently DFSan instrumentation does not run on this code, so
  1899. // the builtin may need to be handled outside DFSan instrumentation.
  1900. dfsan_set_arg_tls(0, fd_label);
  1901. dfsan_set_arg_tls(1, buf_label);
  1902. dfsan_set_arg_tls(2, count_label);
  1903. if (origins) {
  1904. dfsan_set_arg_origin_tls(0, fd_origin);
  1905. dfsan_set_arg_origin_tls(1, buf_origin);
  1906. dfsan_set_arg_origin_tls(2, count_origin);
  1907. }
  1908. }
  1909. SANITIZER_INTERFACE_ATTRIBUTE int
  1910. __dfsw_write(int fd, const void *buf, size_t count,
  1911. dfsan_label fd_label, dfsan_label buf_label,
  1912. dfsan_label count_label, dfsan_label *ret_label) {
  1913. if (write_callback_info.write_callback) {
  1914. setup_tls_args_for_write_callback(fd_label, buf_label, count_label, false,
  1915. 0, 0, 0);
  1916. write_callback_info.write_callback(fd, buf, count);
  1917. }
  1918. *ret_label = 0;
  1919. return write(fd, buf, count);
  1920. }
  1921. SANITIZER_INTERFACE_ATTRIBUTE int __dfso_write(
  1922. int fd, const void *buf, size_t count, dfsan_label fd_label,
  1923. dfsan_label buf_label, dfsan_label count_label, dfsan_label *ret_label,
  1924. dfsan_origin fd_origin, dfsan_origin buf_origin, dfsan_origin count_origin,
  1925. dfsan_origin *ret_origin) {
  1926. if (write_callback_info.write_callback) {
  1927. setup_tls_args_for_write_callback(fd_label, buf_label, count_label, true,
  1928. fd_origin, buf_origin, count_origin);
  1929. write_callback_info.write_callback(fd, buf, count);
  1930. }
  1931. *ret_label = 0;
  1932. return write(fd, buf, count);
  1933. }
  1934. } // namespace __dfsan
  1935. // Type used to extract a dfsan_label with va_arg()
  1936. typedef int dfsan_label_va;
  1937. // Formats a chunk either a constant string or a single format directive (e.g.,
  1938. // '%.3f').
  1939. struct Formatter {
  1940. Formatter(char *str_, const char *fmt_, size_t size_)
  1941. : str(str_),
  1942. str_off(0),
  1943. size(size_),
  1944. fmt_start(fmt_),
  1945. fmt_cur(fmt_),
  1946. width(-1),
  1947. num_scanned(-1),
  1948. skip(false) {}
  1949. int format() {
  1950. char *tmp_fmt = build_format_string();
  1951. int retval =
  1952. snprintf(str + str_off, str_off < size ? size - str_off : 0, tmp_fmt,
  1953. 0 /* used only to avoid warnings */);
  1954. free(tmp_fmt);
  1955. return retval;
  1956. }
  1957. template <typename T> int format(T arg) {
  1958. char *tmp_fmt = build_format_string();
  1959. int retval;
  1960. if (width >= 0) {
  1961. retval = snprintf(str + str_off, str_off < size ? size - str_off : 0,
  1962. tmp_fmt, width, arg);
  1963. } else {
  1964. retval = snprintf(str + str_off, str_off < size ? size - str_off : 0,
  1965. tmp_fmt, arg);
  1966. }
  1967. free(tmp_fmt);
  1968. return retval;
  1969. }
  1970. int scan() {
  1971. char *tmp_fmt = build_format_string(true);
  1972. int read_count = 0;
  1973. int retval = sscanf(str + str_off, tmp_fmt, &read_count);
  1974. if (retval > 0) {
  1975. if (-1 == num_scanned)
  1976. num_scanned = 0;
  1977. num_scanned += retval;
  1978. }
  1979. free(tmp_fmt);
  1980. return read_count;
  1981. }
  1982. template <typename T>
  1983. int scan(T arg) {
  1984. char *tmp_fmt = build_format_string(true);
  1985. int read_count = 0;
  1986. int retval = sscanf(str + str_off, tmp_fmt, arg, &read_count);
  1987. if (retval > 0) {
  1988. if (-1 == num_scanned)
  1989. num_scanned = 0;
  1990. num_scanned += retval;
  1991. }
  1992. free(tmp_fmt);
  1993. return read_count;
  1994. }
  1995. // with_n -> toggles adding %n on/off; off by default
  1996. char *build_format_string(bool with_n = false) {
  1997. size_t fmt_size = fmt_cur - fmt_start + 1;
  1998. size_t add_size = 0;
  1999. if (with_n)
  2000. add_size = 2;
  2001. char *new_fmt = (char *)malloc(fmt_size + 1 + add_size);
  2002. assert(new_fmt);
  2003. internal_memcpy(new_fmt, fmt_start, fmt_size);
  2004. if (!with_n) {
  2005. new_fmt[fmt_size] = '\0';
  2006. } else {
  2007. new_fmt[fmt_size] = '%';
  2008. new_fmt[fmt_size + 1] = 'n';
  2009. new_fmt[fmt_size + 2] = '\0';
  2010. }
  2011. return new_fmt;
  2012. }
  2013. char *str_cur() { return str + str_off; }
  2014. size_t num_written_bytes(int retval) {
  2015. if (retval < 0) {
  2016. return 0;
  2017. }
  2018. size_t num_avail = str_off < size ? size - str_off : 0;
  2019. if (num_avail == 0) {
  2020. return 0;
  2021. }
  2022. size_t num_written = retval;
  2023. // A return value of {v,}snprintf of size or more means that the output was
  2024. // truncated.
  2025. if (num_written >= num_avail) {
  2026. num_written -= num_avail;
  2027. }
  2028. return num_written;
  2029. }
  2030. char *str;
  2031. size_t str_off;
  2032. size_t size;
  2033. const char *fmt_start;
  2034. const char *fmt_cur;
  2035. int width;
  2036. int num_scanned;
  2037. bool skip;
  2038. };
  2039. // Formats the input and propagates the input labels to the output. The output
  2040. // is stored in 'str'. 'size' bounds the number of output bytes. 'format' and
  2041. // 'ap' are the format string and the list of arguments for formatting. Returns
  2042. // the return value vsnprintf would return.
  2043. //
  2044. // The function tokenizes the format string in chunks representing either a
  2045. // constant string or a single format directive (e.g., '%.3f') and formats each
  2046. // chunk independently into the output string. This approach allows to figure
  2047. // out which bytes of the output string depends on which argument and thus to
  2048. // propagate labels more precisely.
  2049. //
  2050. // WARNING: This implementation does not support conversion specifiers with
  2051. // positional arguments.
  2052. static int format_buffer(char *str, size_t size, const char *fmt,
  2053. dfsan_label *va_labels, dfsan_label *ret_label,
  2054. dfsan_origin *va_origins, dfsan_origin *ret_origin,
  2055. va_list ap) {
  2056. Formatter formatter(str, fmt, size);
  2057. while (*formatter.fmt_cur) {
  2058. formatter.fmt_start = formatter.fmt_cur;
  2059. formatter.width = -1;
  2060. int retval = 0;
  2061. if (*formatter.fmt_cur != '%') {
  2062. // Ordinary character. Consume all the characters until a '%' or the end
  2063. // of the string.
  2064. for (; *(formatter.fmt_cur + 1) && *(formatter.fmt_cur + 1) != '%';
  2065. ++formatter.fmt_cur) {}
  2066. retval = formatter.format();
  2067. dfsan_set_label(0, formatter.str_cur(),
  2068. formatter.num_written_bytes(retval));
  2069. } else {
  2070. // Conversion directive. Consume all the characters until a conversion
  2071. // specifier or the end of the string.
  2072. bool end_fmt = false;
  2073. for (; *formatter.fmt_cur && !end_fmt; ) {
  2074. switch (*++formatter.fmt_cur) {
  2075. case 'd':
  2076. case 'i':
  2077. case 'o':
  2078. case 'u':
  2079. case 'x':
  2080. case 'X':
  2081. switch (*(formatter.fmt_cur - 1)) {
  2082. case 'h':
  2083. // Also covers the 'hh' case (since the size of the arg is still
  2084. // an int).
  2085. retval = formatter.format(va_arg(ap, int));
  2086. break;
  2087. case 'l':
  2088. if (formatter.fmt_cur - formatter.fmt_start >= 2 &&
  2089. *(formatter.fmt_cur - 2) == 'l') {
  2090. retval = formatter.format(va_arg(ap, long long int));
  2091. } else {
  2092. retval = formatter.format(va_arg(ap, long int));
  2093. }
  2094. break;
  2095. case 'q':
  2096. retval = formatter.format(va_arg(ap, long long int));
  2097. break;
  2098. case 'j':
  2099. retval = formatter.format(va_arg(ap, intmax_t));
  2100. break;
  2101. case 'z':
  2102. case 't':
  2103. retval = formatter.format(va_arg(ap, size_t));
  2104. break;
  2105. default:
  2106. retval = formatter.format(va_arg(ap, int));
  2107. }
  2108. if (va_origins == nullptr)
  2109. dfsan_set_label(*va_labels++, formatter.str_cur(),
  2110. formatter.num_written_bytes(retval));
  2111. else
  2112. dfsan_set_label_origin(*va_labels++, *va_origins++,
  2113. formatter.str_cur(),
  2114. formatter.num_written_bytes(retval));
  2115. end_fmt = true;
  2116. break;
  2117. case 'a':
  2118. case 'A':
  2119. case 'e':
  2120. case 'E':
  2121. case 'f':
  2122. case 'F':
  2123. case 'g':
  2124. case 'G':
  2125. if (*(formatter.fmt_cur - 1) == 'L') {
  2126. retval = formatter.format(va_arg(ap, long double));
  2127. } else {
  2128. retval = formatter.format(va_arg(ap, double));
  2129. }
  2130. if (va_origins == nullptr)
  2131. dfsan_set_label(*va_labels++, formatter.str_cur(),
  2132. formatter.num_written_bytes(retval));
  2133. else
  2134. dfsan_set_label_origin(*va_labels++, *va_origins++,
  2135. formatter.str_cur(),
  2136. formatter.num_written_bytes(retval));
  2137. end_fmt = true;
  2138. break;
  2139. case 'c':
  2140. retval = formatter.format(va_arg(ap, int));
  2141. if (va_origins == nullptr)
  2142. dfsan_set_label(*va_labels++, formatter.str_cur(),
  2143. formatter.num_written_bytes(retval));
  2144. else
  2145. dfsan_set_label_origin(*va_labels++, *va_origins++,
  2146. formatter.str_cur(),
  2147. formatter.num_written_bytes(retval));
  2148. end_fmt = true;
  2149. break;
  2150. case 's': {
  2151. char *arg = va_arg(ap, char *);
  2152. retval = formatter.format(arg);
  2153. if (va_origins) {
  2154. va_origins++;
  2155. dfsan_mem_origin_transfer(formatter.str_cur(), arg,
  2156. formatter.num_written_bytes(retval));
  2157. }
  2158. va_labels++;
  2159. dfsan_mem_shadow_transfer(formatter.str_cur(), arg,
  2160. formatter.num_written_bytes(retval));
  2161. end_fmt = true;
  2162. break;
  2163. }
  2164. case 'p':
  2165. retval = formatter.format(va_arg(ap, void *));
  2166. if (va_origins == nullptr)
  2167. dfsan_set_label(*va_labels++, formatter.str_cur(),
  2168. formatter.num_written_bytes(retval));
  2169. else
  2170. dfsan_set_label_origin(*va_labels++, *va_origins++,
  2171. formatter.str_cur(),
  2172. formatter.num_written_bytes(retval));
  2173. end_fmt = true;
  2174. break;
  2175. case 'n': {
  2176. int *ptr = va_arg(ap, int *);
  2177. *ptr = (int)formatter.str_off;
  2178. va_labels++;
  2179. if (va_origins)
  2180. va_origins++;
  2181. dfsan_set_label(0, ptr, sizeof(ptr));
  2182. end_fmt = true;
  2183. break;
  2184. }
  2185. case '%':
  2186. retval = formatter.format();
  2187. dfsan_set_label(0, formatter.str_cur(),
  2188. formatter.num_written_bytes(retval));
  2189. end_fmt = true;
  2190. break;
  2191. case '*':
  2192. formatter.width = va_arg(ap, int);
  2193. va_labels++;
  2194. if (va_origins)
  2195. va_origins++;
  2196. break;
  2197. default:
  2198. break;
  2199. }
  2200. }
  2201. }
  2202. if (retval < 0) {
  2203. return retval;
  2204. }
  2205. formatter.fmt_cur++;
  2206. formatter.str_off += retval;
  2207. }
  2208. *ret_label = 0;
  2209. if (ret_origin)
  2210. *ret_origin = 0;
  2211. // Number of bytes written in total.
  2212. return formatter.str_off;
  2213. }
  2214. // This function is an inverse of format_buffer: we take the input buffer,
  2215. // scan it in search for format strings and store the results in the varargs.
  2216. // The labels are propagated from the input buffer to the varargs.
  2217. static int scan_buffer(char *str, size_t size, const char *fmt,
  2218. dfsan_label *va_labels, dfsan_label *ret_label,
  2219. dfsan_origin *str_origin, dfsan_origin *ret_origin,
  2220. va_list ap) {
  2221. Formatter formatter(str, fmt, size);
  2222. while (*formatter.fmt_cur) {
  2223. formatter.fmt_start = formatter.fmt_cur;
  2224. formatter.width = -1;
  2225. formatter.skip = false;
  2226. int read_count = 0;
  2227. void *dst_ptr = 0;
  2228. size_t write_size = 0;
  2229. if (*formatter.fmt_cur != '%') {
  2230. // Ordinary character. Consume all the characters until a '%' or the end
  2231. // of the string.
  2232. for (; *(formatter.fmt_cur + 1) && *(formatter.fmt_cur + 1) != '%';
  2233. ++formatter.fmt_cur) {
  2234. }
  2235. read_count = formatter.scan();
  2236. dfsan_set_label(0, formatter.str_cur(),
  2237. formatter.num_written_bytes(read_count));
  2238. } else {
  2239. // Conversion directive. Consume all the characters until a conversion
  2240. // specifier or the end of the string.
  2241. bool end_fmt = false;
  2242. for (; *formatter.fmt_cur && !end_fmt;) {
  2243. switch (*++formatter.fmt_cur) {
  2244. case 'd':
  2245. case 'i':
  2246. case 'o':
  2247. case 'u':
  2248. case 'x':
  2249. case 'X':
  2250. if (formatter.skip) {
  2251. read_count = formatter.scan();
  2252. } else {
  2253. switch (*(formatter.fmt_cur - 1)) {
  2254. case 'h':
  2255. // Also covers the 'hh' case (since the size of the arg is still
  2256. // an int).
  2257. dst_ptr = va_arg(ap, int *);
  2258. read_count = formatter.scan((int *)dst_ptr);
  2259. write_size = sizeof(int);
  2260. break;
  2261. case 'l':
  2262. if (formatter.fmt_cur - formatter.fmt_start >= 2 &&
  2263. *(formatter.fmt_cur - 2) == 'l') {
  2264. dst_ptr = va_arg(ap, long long int *);
  2265. read_count = formatter.scan((long long int *)dst_ptr);
  2266. write_size = sizeof(long long int);
  2267. } else {
  2268. dst_ptr = va_arg(ap, long int *);
  2269. read_count = formatter.scan((long int *)dst_ptr);
  2270. write_size = sizeof(long int);
  2271. }
  2272. break;
  2273. case 'q':
  2274. dst_ptr = va_arg(ap, long long int *);
  2275. read_count = formatter.scan((long long int *)dst_ptr);
  2276. write_size = sizeof(long long int);
  2277. break;
  2278. case 'j':
  2279. dst_ptr = va_arg(ap, intmax_t *);
  2280. read_count = formatter.scan((intmax_t *)dst_ptr);
  2281. write_size = sizeof(intmax_t);
  2282. break;
  2283. case 'z':
  2284. case 't':
  2285. dst_ptr = va_arg(ap, size_t *);
  2286. read_count = formatter.scan((size_t *)dst_ptr);
  2287. write_size = sizeof(size_t);
  2288. break;
  2289. default:
  2290. dst_ptr = va_arg(ap, int *);
  2291. read_count = formatter.scan((int *)dst_ptr);
  2292. write_size = sizeof(int);
  2293. }
  2294. // get the label associated with the string at the corresponding
  2295. // place
  2296. dfsan_label l = dfsan_read_label(
  2297. formatter.str_cur(), formatter.num_written_bytes(read_count));
  2298. dfsan_set_label(l, dst_ptr, write_size);
  2299. if (str_origin != nullptr) {
  2300. dfsan_set_label(l, dst_ptr, write_size);
  2301. size_t scan_count = formatter.num_written_bytes(read_count);
  2302. size_t size = scan_count > write_size ? write_size : scan_count;
  2303. dfsan_mem_origin_transfer(dst_ptr, formatter.str_cur(), size);
  2304. }
  2305. }
  2306. end_fmt = true;
  2307. break;
  2308. case 'a':
  2309. case 'A':
  2310. case 'e':
  2311. case 'E':
  2312. case 'f':
  2313. case 'F':
  2314. case 'g':
  2315. case 'G':
  2316. if (formatter.skip) {
  2317. read_count = formatter.scan();
  2318. } else {
  2319. if (*(formatter.fmt_cur - 1) == 'L') {
  2320. dst_ptr = va_arg(ap, long double *);
  2321. read_count = formatter.scan((long double *)dst_ptr);
  2322. write_size = sizeof(long double);
  2323. } else if (*(formatter.fmt_cur - 1) == 'l') {
  2324. dst_ptr = va_arg(ap, double *);
  2325. read_count = formatter.scan((double *)dst_ptr);
  2326. write_size = sizeof(double);
  2327. } else {
  2328. dst_ptr = va_arg(ap, float *);
  2329. read_count = formatter.scan((float *)dst_ptr);
  2330. write_size = sizeof(float);
  2331. }
  2332. dfsan_label l = dfsan_read_label(
  2333. formatter.str_cur(), formatter.num_written_bytes(read_count));
  2334. dfsan_set_label(l, dst_ptr, write_size);
  2335. if (str_origin != nullptr) {
  2336. dfsan_set_label(l, dst_ptr, write_size);
  2337. size_t scan_count = formatter.num_written_bytes(read_count);
  2338. size_t size = scan_count > write_size ? write_size : scan_count;
  2339. dfsan_mem_origin_transfer(dst_ptr, formatter.str_cur(), size);
  2340. }
  2341. }
  2342. end_fmt = true;
  2343. break;
  2344. case 'c':
  2345. if (formatter.skip) {
  2346. read_count = formatter.scan();
  2347. } else {
  2348. dst_ptr = va_arg(ap, char *);
  2349. read_count = formatter.scan((char *)dst_ptr);
  2350. write_size = sizeof(char);
  2351. dfsan_label l = dfsan_read_label(
  2352. formatter.str_cur(), formatter.num_written_bytes(read_count));
  2353. dfsan_set_label(l, dst_ptr, write_size);
  2354. if (str_origin != nullptr) {
  2355. size_t scan_count = formatter.num_written_bytes(read_count);
  2356. size_t size = scan_count > write_size ? write_size : scan_count;
  2357. dfsan_mem_origin_transfer(dst_ptr, formatter.str_cur(), size);
  2358. }
  2359. }
  2360. end_fmt = true;
  2361. break;
  2362. case 's': {
  2363. if (formatter.skip) {
  2364. read_count = formatter.scan();
  2365. } else {
  2366. dst_ptr = va_arg(ap, char *);
  2367. read_count = formatter.scan((char *)dst_ptr);
  2368. if (1 == read_count) {
  2369. // special case: we have parsed a single string and we need to
  2370. // update read_count with the string size
  2371. read_count = strlen((char *)dst_ptr);
  2372. }
  2373. if (str_origin)
  2374. dfsan_mem_origin_transfer(dst_ptr, formatter.str_cur(),
  2375. formatter.num_written_bytes(read_count));
  2376. va_labels++;
  2377. dfsan_mem_shadow_transfer(dst_ptr, formatter.str_cur(),
  2378. formatter.num_written_bytes(read_count));
  2379. }
  2380. end_fmt = true;
  2381. break;
  2382. }
  2383. case 'p':
  2384. if (formatter.skip) {
  2385. read_count = formatter.scan();
  2386. } else {
  2387. dst_ptr = va_arg(ap, void *);
  2388. read_count =
  2389. formatter.scan((int *)dst_ptr); // note: changing void* to int*
  2390. // since we need to call sizeof
  2391. write_size = sizeof(int);
  2392. dfsan_label l = dfsan_read_label(
  2393. formatter.str_cur(), formatter.num_written_bytes(read_count));
  2394. dfsan_set_label(l, dst_ptr, write_size);
  2395. if (str_origin != nullptr) {
  2396. dfsan_set_label(l, dst_ptr, write_size);
  2397. size_t scan_count = formatter.num_written_bytes(read_count);
  2398. size_t size = scan_count > write_size ? write_size : scan_count;
  2399. dfsan_mem_origin_transfer(dst_ptr, formatter.str_cur(), size);
  2400. }
  2401. }
  2402. end_fmt = true;
  2403. break;
  2404. case 'n': {
  2405. if (!formatter.skip) {
  2406. int *ptr = va_arg(ap, int *);
  2407. *ptr = (int)formatter.str_off;
  2408. *va_labels++ = 0;
  2409. dfsan_set_label(0, ptr, sizeof(*ptr));
  2410. if (str_origin != nullptr)
  2411. *str_origin++ = 0;
  2412. }
  2413. end_fmt = true;
  2414. break;
  2415. }
  2416. case '%':
  2417. read_count = formatter.scan();
  2418. end_fmt = true;
  2419. break;
  2420. case '*':
  2421. formatter.skip = true;
  2422. break;
  2423. default:
  2424. break;
  2425. }
  2426. }
  2427. }
  2428. if (read_count < 0) {
  2429. // There was an error.
  2430. return read_count;
  2431. }
  2432. formatter.fmt_cur++;
  2433. formatter.str_off += read_count;
  2434. }
  2435. (void)va_labels; // Silence unused-but-set-parameter warning
  2436. *ret_label = 0;
  2437. if (ret_origin)
  2438. *ret_origin = 0;
  2439. // Number of items scanned in total.
  2440. return formatter.num_scanned;
  2441. }
  2442. extern "C" {
  2443. SANITIZER_INTERFACE_ATTRIBUTE
  2444. int __dfsw_sprintf(char *str, const char *format, dfsan_label str_label,
  2445. dfsan_label format_label, dfsan_label *va_labels,
  2446. dfsan_label *ret_label, ...) {
  2447. va_list ap;
  2448. va_start(ap, ret_label);
  2449. int ret = format_buffer(str, INT32_MAX, format, va_labels, ret_label, nullptr,
  2450. nullptr, ap);
  2451. va_end(ap);
  2452. return ret;
  2453. }
  2454. SANITIZER_INTERFACE_ATTRIBUTE
  2455. int __dfso_sprintf(char *str, const char *format, dfsan_label str_label,
  2456. dfsan_label format_label, dfsan_label *va_labels,
  2457. dfsan_label *ret_label, dfsan_origin str_origin,
  2458. dfsan_origin format_origin, dfsan_origin *va_origins,
  2459. dfsan_origin *ret_origin, ...) {
  2460. va_list ap;
  2461. va_start(ap, ret_origin);
  2462. int ret = format_buffer(str, INT32_MAX, format, va_labels, ret_label,
  2463. va_origins, ret_origin, ap);
  2464. va_end(ap);
  2465. return ret;
  2466. }
  2467. SANITIZER_INTERFACE_ATTRIBUTE
  2468. int __dfsw_snprintf(char *str, size_t size, const char *format,
  2469. dfsan_label str_label, dfsan_label size_label,
  2470. dfsan_label format_label, dfsan_label *va_labels,
  2471. dfsan_label *ret_label, ...) {
  2472. va_list ap;
  2473. va_start(ap, ret_label);
  2474. int ret = format_buffer(str, size, format, va_labels, ret_label, nullptr,
  2475. nullptr, ap);
  2476. va_end(ap);
  2477. return ret;
  2478. }
  2479. SANITIZER_INTERFACE_ATTRIBUTE
  2480. int __dfso_snprintf(char *str, size_t size, const char *format,
  2481. dfsan_label str_label, dfsan_label size_label,
  2482. dfsan_label format_label, dfsan_label *va_labels,
  2483. dfsan_label *ret_label, dfsan_origin str_origin,
  2484. dfsan_origin size_origin, dfsan_origin format_origin,
  2485. dfsan_origin *va_origins, dfsan_origin *ret_origin, ...) {
  2486. va_list ap;
  2487. va_start(ap, ret_origin);
  2488. int ret = format_buffer(str, size, format, va_labels, ret_label, va_origins,
  2489. ret_origin, ap);
  2490. va_end(ap);
  2491. return ret;
  2492. }
  2493. SANITIZER_INTERFACE_ATTRIBUTE
  2494. int __dfsw_sscanf(char *str, const char *format, dfsan_label str_label,
  2495. dfsan_label format_label, dfsan_label *va_labels,
  2496. dfsan_label *ret_label, ...) {
  2497. va_list ap;
  2498. va_start(ap, ret_label);
  2499. int ret = scan_buffer(str, ~0ul, format, va_labels, ret_label, nullptr,
  2500. nullptr, ap);
  2501. va_end(ap);
  2502. return ret;
  2503. }
  2504. SANITIZER_INTERFACE_ATTRIBUTE
  2505. int __dfso_sscanf(char *str, const char *format, dfsan_label str_label,
  2506. dfsan_label format_label, dfsan_label *va_labels,
  2507. dfsan_label *ret_label, dfsan_origin str_origin,
  2508. dfsan_origin format_origin, dfsan_origin *va_origins,
  2509. dfsan_origin *ret_origin, ...) {
  2510. va_list ap;
  2511. va_start(ap, ret_origin);
  2512. int ret = scan_buffer(str, ~0ul, format, va_labels, ret_label, &str_origin,
  2513. ret_origin, ap);
  2514. va_end(ap);
  2515. return ret;
  2516. }
  2517. WRAPPER_ALIAS(__isoc99_sscanf, sscanf)
  2518. WRAPPER_ALIAS(__isoc23_sscanf, sscanf)
  2519. static void BeforeFork() {
  2520. StackDepotLockBeforeFork();
  2521. ChainedOriginDepotLockBeforeFork();
  2522. }
  2523. static void AfterFork(bool fork_child) {
  2524. ChainedOriginDepotUnlockAfterFork(fork_child);
  2525. StackDepotUnlockAfterFork(fork_child);
  2526. }
  2527. SANITIZER_INTERFACE_ATTRIBUTE
  2528. pid_t __dfsw_fork(dfsan_label *ret_label) {
  2529. pid_t pid = fork();
  2530. *ret_label = 0;
  2531. return pid;
  2532. }
  2533. SANITIZER_INTERFACE_ATTRIBUTE
  2534. pid_t __dfso_fork(dfsan_label *ret_label, dfsan_origin *ret_origin) {
  2535. BeforeFork();
  2536. pid_t pid = __dfsw_fork(ret_label);
  2537. AfterFork(/* fork_child= */ pid == 0);
  2538. return pid;
  2539. }
  2540. // Default empty implementations (weak). Users should redefine them.
  2541. SANITIZER_INTERFACE_WEAK_DEF(void, __sanitizer_cov_trace_pc_guard, u32 *) {}
  2542. SANITIZER_INTERFACE_WEAK_DEF(void, __sanitizer_cov_trace_pc_guard_init, u32 *,
  2543. u32 *) {}
  2544. SANITIZER_INTERFACE_WEAK_DEF(void, __sanitizer_cov_pcs_init, const uptr *beg,
  2545. const uptr *end) {}
  2546. SANITIZER_INTERFACE_WEAK_DEF(void, __sanitizer_cov_trace_pc_indir, void) {}
  2547. SANITIZER_INTERFACE_WEAK_DEF(void, __dfsw___sanitizer_cov_trace_cmp, void) {}
  2548. SANITIZER_INTERFACE_WEAK_DEF(void, __dfsw___sanitizer_cov_trace_cmp1, void) {}
  2549. SANITIZER_INTERFACE_WEAK_DEF(void, __dfsw___sanitizer_cov_trace_cmp2, void) {}
  2550. SANITIZER_INTERFACE_WEAK_DEF(void, __dfsw___sanitizer_cov_trace_cmp4, void) {}
  2551. SANITIZER_INTERFACE_WEAK_DEF(void, __dfsw___sanitizer_cov_trace_cmp8, void) {}
  2552. SANITIZER_INTERFACE_WEAK_DEF(void, __dfsw___sanitizer_cov_trace_const_cmp1,
  2553. void) {}
  2554. SANITIZER_INTERFACE_WEAK_DEF(void, __dfsw___sanitizer_cov_trace_const_cmp2,
  2555. void) {}
  2556. SANITIZER_INTERFACE_WEAK_DEF(void, __dfsw___sanitizer_cov_trace_const_cmp4,
  2557. void) {}
  2558. SANITIZER_INTERFACE_WEAK_DEF(void, __dfsw___sanitizer_cov_trace_const_cmp8,
  2559. void) {}
  2560. SANITIZER_INTERFACE_WEAK_DEF(void, __dfsw___sanitizer_cov_trace_switch, void) {}
  2561. } // extern "C"