TEMP-0000000-B67840.1.d68a455.patch 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  1. Subject: Use pread (...)
  2. Upstream-Author: Christos Zoulas <christos@zoulas.com>
  3. Date: Mon Feb 18 15:40:59 2013 +0000
  4. Origin: FILE5_12-64-gd68a455
  5. Last-Update: 2015-01-05
  6. - use pread
  7. - add reading of section header names to determine if an ELF file is stripped
  8. (Jan Kaluza)
  9. (prequisite for TEMP-0000000-B67840)
  10. diff --git a/configure.ac b/configure.ac
  11. index 1511c9a..97a4689 100644
  12. --- a/configure.ac
  13. +++ b/configure.ac
  14. @@ -159,7 +159,7 @@ dnl Checks for functions
  15. AC_CHECK_FUNCS(mmap strerror strndup strtoul mbrtowc mkstemp utimes utime wcwidth strtof fork)
  16. dnl Provide implementation of some required functions if necessary
  17. -AC_REPLACE_FUNCS(getopt_long asprintf vasprintf strlcpy strlcat getline)
  18. +AC_REPLACE_FUNCS(getopt_long asprintf vasprintf strlcpy strlcat getline pread)
  19. dnl Checks for libraries
  20. AC_CHECK_LIB(z,gzopen)
  21. diff --git a/src/elfclass.h b/src/elfclass.h
  22. index 2e7741b..010958a 100644
  23. --- a/src/elfclass.h
  24. +++ b/src/elfclass.h
  25. @@ -59,7 +59,8 @@
  26. (off_t)elf_getu(swap, elfhdr.e_shoff),
  27. elf_getu16(swap, elfhdr.e_shnum),
  28. (size_t)elf_getu16(swap, elfhdr.e_shentsize),
  29. - fsize, &flags, elf_getu16(swap, elfhdr.e_machine)) == -1)
  30. + fsize, &flags, elf_getu16(swap, elfhdr.e_machine),
  31. + (int)elf_getu16(swap, elfhdr.e_shstrndx)) == -1)
  32. return -1;
  33. break;
  34. diff --git a/src/file.h b/src/file.h
  35. index e02009f..de262b2 100644
  36. --- a/src/file.h
  37. +++ b/src/file.h
  38. @@ -460,6 +460,9 @@ extern char *sys_errlist[];
  39. #define strtoul(a, b, c) strtol(a, b, c)
  40. #endif
  41. +#ifndef HAVE_PREAD
  42. +ssize_t pread(int, void *, size_t, off_t);
  43. +#endif
  44. #ifndef HAVE_VASPRINTF
  45. int vasprintf(char **, const char *, va_list);
  46. #endif
  47. diff --git a/src/pread.c b/src/pread.c
  48. new file mode 100644
  49. index 0000000..94eca15
  50. --- /dev/null
  51. +++ b/src/pread.c
  52. @@ -0,0 +1,14 @@
  53. +#include "file.h"
  54. +#ifndef lint
  55. +FILE_RCSID("@(#)$File: ctime_r.c,v 1.1 2012/05/15 17:14:36 christos Exp $")
  56. +#endif /* lint */
  57. +#include <fcntl.h>
  58. +#include <unistd.h>
  59. +
  60. +ssize_t
  61. +pread(int fd, void *buf, ssize_t len, off_t off) {
  62. + if (lseek(fd, off, SEEK_SET) == (off_t)-1)
  63. + return -1;
  64. +
  65. + return read(fd, buf, len);
  66. +}
  67. diff --git a/src/readelf.c b/src/readelf.c
  68. index 966805a..314adb7 100644
  69. --- a/src/readelf.c
  70. +++ b/src/readelf.c
  71. @@ -48,7 +48,7 @@ private int dophn_core(struct magic_set *, int, int, int, off_t, int, size_t,
  72. private int dophn_exec(struct magic_set *, int, int, int, off_t, int, size_t,
  73. off_t, int *, int);
  74. private int doshn(struct magic_set *, int, int, int, off_t, int, size_t,
  75. - off_t, int *, int);
  76. + off_t, int *, int, int);
  77. private size_t donote(struct magic_set *, void *, size_t, size_t, int,
  78. int, size_t, int *);
  79. @@ -129,19 +129,21 @@ getu64(int swap, uint64_t value)
  80. #define elf_getu32(swap, value) getu32(swap, value)
  81. #ifdef USE_ARRAY_FOR_64BIT_TYPES
  82. # define elf_getu64(swap, array) \
  83. - ((swap ? ((uint64_t)elf_getu32(swap, array[0])) << 32 : elf_getu32(swap, array[0])) + \
  84. - (swap ? elf_getu32(swap, array[1]) : ((uint64_t)elf_getu32(swap, array[1]) << 32)))
  85. + ((swap ? ((uint64_t)elf_getu32(swap, array[0])) << 32 \
  86. + : elf_getu32(swap, array[0])) + \
  87. + (swap ? elf_getu32(swap, array[1]) : \
  88. + ((uint64_t)elf_getu32(swap, array[1]) << 32)))
  89. #else
  90. # define elf_getu64(swap, value) getu64(swap, value)
  91. #endif
  92. #define xsh_addr (clazz == ELFCLASS32 \
  93. - ? (void *) &sh32 \
  94. - : (void *) &sh64)
  95. + ? (void *)&sh32 \
  96. + : (void *)&sh64)
  97. #define xsh_sizeof (clazz == ELFCLASS32 \
  98. - ? sizeof sh32 \
  99. - : sizeof sh64)
  100. -#define xsh_size (clazz == ELFCLASS32 \
  101. + ? sizeof(sh32) \
  102. + : sizeof(sh64))
  103. +#define xsh_size (size_t)(clazz == ELFCLASS32 \
  104. ? elf_getu32(swap, sh32.sh_size) \
  105. : elf_getu64(swap, sh64.sh_size))
  106. #define xsh_offset (off_t)(clazz == ELFCLASS32 \
  107. @@ -150,12 +152,15 @@ getu64(int swap, uint64_t value)
  108. #define xsh_type (clazz == ELFCLASS32 \
  109. ? elf_getu32(swap, sh32.sh_type) \
  110. : elf_getu32(swap, sh64.sh_type))
  111. +#define xsh_name (clazz == ELFCLASS32 \
  112. + ? elf_getu32(swap, sh32.sh_name) \
  113. + : elf_getu32(swap, sh64.sh_name))
  114. #define xph_addr (clazz == ELFCLASS32 \
  115. ? (void *) &ph32 \
  116. : (void *) &ph64)
  117. #define xph_sizeof (clazz == ELFCLASS32 \
  118. - ? sizeof ph32 \
  119. - : sizeof ph64)
  120. + ? sizeof(ph32) \
  121. + : sizeof(ph64))
  122. #define xph_type (clazz == ELFCLASS32 \
  123. ? elf_getu32(swap, ph32.p_type) \
  124. : elf_getu32(swap, ph64.p_type))
  125. @@ -171,8 +176,8 @@ getu64(int swap, uint64_t value)
  126. ? elf_getu32(swap, ph32.p_filesz) \
  127. : elf_getu64(swap, ph64.p_filesz)))
  128. #define xnh_addr (clazz == ELFCLASS32 \
  129. - ? (void *) &nh32 \
  130. - : (void *) &nh64)
  131. + ? (void *)&nh32 \
  132. + : (void *)&nh64)
  133. #define xph_memsz (size_t)((clazz == ELFCLASS32 \
  134. ? elf_getu32(swap, ph32.p_memsz) \
  135. : elf_getu64(swap, ph64.p_memsz)))
  136. @@ -192,8 +197,8 @@ getu64(int swap, uint64_t value)
  137. ? prpsoffsets32[i] \
  138. : prpsoffsets64[i])
  139. #define xcap_addr (clazz == ELFCLASS32 \
  140. - ? (void *) &cap32 \
  141. - : (void *) &cap64)
  142. + ? (void *)&cap32 \
  143. + : (void *)&cap64)
  144. #define xcap_sizeof (clazz == ELFCLASS32 \
  145. ? sizeof cap32 \
  146. : sizeof cap64)
  147. @@ -295,7 +300,7 @@ dophn_core(struct magic_set *ms, int clazz, int swap, int fd, off_t off,
  148. {
  149. Elf32_Phdr ph32;
  150. Elf64_Phdr ph64;
  151. - size_t offset;
  152. + size_t offset, len;
  153. unsigned char nbuf[BUFSIZ];
  154. ssize_t bufsize;
  155. @@ -309,11 +314,7 @@ dophn_core(struct magic_set *ms, int clazz, int swap, int fd, off_t off,
  156. * Loop through all the program headers.
  157. */
  158. for ( ; num; num--) {
  159. - if (lseek(fd, off, SEEK_SET) == (off_t)-1) {
  160. - file_badseek(ms);
  161. - return -1;
  162. - }
  163. - if (read(fd, xph_addr, xph_sizeof) == -1) {
  164. + if (pread(fd, xph_addr, xph_sizeof, off) == -1) {
  165. file_badread(ms);
  166. return -1;
  167. }
  168. @@ -331,13 +332,8 @@ dophn_core(struct magic_set *ms, int clazz, int swap, int fd, off_t off,
  169. * This is a PT_NOTE section; loop through all the notes
  170. * in the section.
  171. */
  172. - if (lseek(fd, xph_offset, SEEK_SET) == (off_t)-1) {
  173. - file_badseek(ms);
  174. - return -1;
  175. - }
  176. - bufsize = read(fd, nbuf,
  177. - ((xph_filesz < sizeof(nbuf)) ? xph_filesz : sizeof(nbuf)));
  178. - if (bufsize == -1) {
  179. + len = xph_filesz < sizeof(nbuf) ? xph_filesz : sizeof(nbuf);
  180. + if ((bufsize = pread(fd, nbuf, len, xph_offset)) == -1) {
  181. file_badread(ms);
  182. return -1;
  183. }
  184. @@ -849,15 +845,16 @@ static const cap_desc_t cap_desc_386[] = {
  185. private int
  186. doshn(struct magic_set *ms, int clazz, int swap, int fd, off_t off, int num,
  187. - size_t size, off_t fsize, int *flags, int mach)
  188. + size_t size, off_t fsize, int *flags, int mach, int strtab)
  189. {
  190. Elf32_Shdr sh32;
  191. Elf64_Shdr sh64;
  192. int stripped = 1;
  193. void *nbuf;
  194. - off_t noff, coff;
  195. + off_t noff, coff, name_off;
  196. uint64_t cap_hw1 = 0; /* SunOS 5.x hardware capabilites */
  197. uint64_t cap_sf1 = 0; /* SunOS 5.x software capabilites */
  198. + char name[50];
  199. if (size != xsh_sizeof) {
  200. if (file_printf(ms, ", corrupted section header size") == -1)
  201. @@ -865,12 +862,19 @@ doshn(struct magic_set *ms, int clazz, int swap, int fd, off_t off, int num,
  202. return 0;
  203. }
  204. + /* Save offset of name section to be able to read section names later */
  205. + name_off = off * size * strtab;
  206. + /* Read the name of this section. */
  207. + if (pread(fd, name, sizeof(name), name_off + xsh_name) == -1) {
  208. + file_badread(ms);
  209. + return -1;
  210. + }
  211. + name[sizeof(name) - 1] = '\0';
  212. + if (strcmp(name, ".debug_info") == 0)
  213. + stripped = 0;
  214. +
  215. for ( ; num; num--) {
  216. - if (lseek(fd, off, SEEK_SET) == (off_t)-1) {
  217. - file_badseek(ms);
  218. - return -1;
  219. - }
  220. - if (read(fd, xsh_addr, xsh_sizeof) == -1) {
  221. + if (pread(fd, xsh_addr, xsh_sizeof, off) == -1) {
  222. file_badread(ms);
  223. return -1;
  224. }
  225. @@ -895,31 +899,23 @@ doshn(struct magic_set *ms, int clazz, int swap, int fd, off_t off, int num,
  226. /* Things we can determine when we seek */
  227. switch (xsh_type) {
  228. case SHT_NOTE:
  229. - if ((nbuf = malloc((size_t)xsh_size)) == NULL) {
  230. + if ((nbuf = malloc(xsh_size)) == NULL) {
  231. file_error(ms, errno, "Cannot allocate memory"
  232. " for note");
  233. return -1;
  234. }
  235. - if ((noff = lseek(fd, (off_t)xsh_offset, SEEK_SET)) ==
  236. - (off_t)-1) {
  237. + if (pread(fd, nbuf, xsh_size, xsh_offset) == -1) {
  238. file_badread(ms);
  239. free(nbuf);
  240. return -1;
  241. }
  242. - if (read(fd, nbuf, (size_t)xsh_size) !=
  243. - (ssize_t)xsh_size) {
  244. - free(nbuf);
  245. - file_badread(ms);
  246. - return -1;
  247. - }
  248. noff = 0;
  249. for (;;) {
  250. if (noff >= (off_t)xsh_size)
  251. break;
  252. noff = donote(ms, nbuf, (size_t)noff,
  253. - (size_t)xsh_size, clazz, swap, 4,
  254. - flags);
  255. + xsh_size, clazz, swap, 4, flags);
  256. if (noff == 0)
  257. break;
  258. }
  259. @@ -1049,7 +1045,7 @@ dophn_exec(struct magic_set *ms, int clazz, int swap, int fd, off_t off,
  260. const char *shared_libraries = "";
  261. unsigned char nbuf[BUFSIZ];
  262. ssize_t bufsize;
  263. - size_t offset, align;
  264. + size_t offset, align, len;
  265. if (size != xph_sizeof) {
  266. if (file_printf(ms, ", corrupted program header size") == -1)
  267. @@ -1058,13 +1054,8 @@ dophn_exec(struct magic_set *ms, int clazz, int swap, int fd, off_t off,
  268. }
  269. for ( ; num; num--) {
  270. - if (lseek(fd, off, SEEK_SET) == (off_t)-1) {
  271. - file_badseek(ms);
  272. - return -1;
  273. - }
  274. -
  275. - if (read(fd, xph_addr, xph_sizeof) == -1) {
  276. - file_badread(ms);
  277. + if (pread(fd, xph_addr, xph_sizeof, off) == -1) {
  278. + file_badread(ms);
  279. return -1;
  280. }
  281. @@ -1102,12 +1093,9 @@ dophn_exec(struct magic_set *ms, int clazz, int swap, int fd, off_t off,
  282. * This is a PT_NOTE section; loop through all the notes
  283. * in the section.
  284. */
  285. - if (lseek(fd, xph_offset, SEEK_SET) == (off_t)-1) {
  286. - file_badseek(ms);
  287. - return -1;
  288. - }
  289. - bufsize = read(fd, nbuf, ((xph_filesz < sizeof(nbuf)) ?
  290. - xph_filesz : sizeof(nbuf)));
  291. + len = xph_filesz < sizeof(nbuf) ? xph_filesz
  292. + : sizeof(nbuf);
  293. + bufsize = pread(fd, nbuf, len, xph_offset);
  294. if (bufsize == -1) {
  295. file_badread(ms);
  296. return -1;