1*4d9fdb46SRobert Mustacchi /*
2*4d9fdb46SRobert Mustacchi Copyright (c) 2018, David Anderson
3*4d9fdb46SRobert Mustacchi All rights reserved.
4*4d9fdb46SRobert Mustacchi
5*4d9fdb46SRobert Mustacchi Redistribution and use in source and binary forms, with
6*4d9fdb46SRobert Mustacchi or without modification, are permitted provided that the
7*4d9fdb46SRobert Mustacchi following conditions are met:
8*4d9fdb46SRobert Mustacchi
9*4d9fdb46SRobert Mustacchi Redistributions of source code must retain the above
10*4d9fdb46SRobert Mustacchi copyright notice, this list of conditions and the following
11*4d9fdb46SRobert Mustacchi disclaimer.
12*4d9fdb46SRobert Mustacchi
13*4d9fdb46SRobert Mustacchi Redistributions in binary form must reproduce the above
14*4d9fdb46SRobert Mustacchi copyright notice, this list of conditions and the following
15*4d9fdb46SRobert Mustacchi disclaimer in the documentation and/or other materials
16*4d9fdb46SRobert Mustacchi provided with the distribution.
17*4d9fdb46SRobert Mustacchi
18*4d9fdb46SRobert Mustacchi THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
19*4d9fdb46SRobert Mustacchi CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
20*4d9fdb46SRobert Mustacchi INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
21*4d9fdb46SRobert Mustacchi OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22*4d9fdb46SRobert Mustacchi ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
23*4d9fdb46SRobert Mustacchi CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24*4d9fdb46SRobert Mustacchi SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
25*4d9fdb46SRobert Mustacchi NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
26*4d9fdb46SRobert Mustacchi LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27*4d9fdb46SRobert Mustacchi HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28*4d9fdb46SRobert Mustacchi CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
29*4d9fdb46SRobert Mustacchi OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
30*4d9fdb46SRobert Mustacchi EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31*4d9fdb46SRobert Mustacchi */
32*4d9fdb46SRobert Mustacchi
33*4d9fdb46SRobert Mustacchi #ifdef _WIN32
34*4d9fdb46SRobert Mustacchi #define _CRT_SECURE_NO_WARNINGS
35*4d9fdb46SRobert Mustacchi #endif /* _WIN32 */
36*4d9fdb46SRobert Mustacchi
37*4d9fdb46SRobert Mustacchi #include "config.h"
38*4d9fdb46SRobert Mustacchi #include <stdio.h>
39*4d9fdb46SRobert Mustacchi #include <string.h> /* memcpy */
40*4d9fdb46SRobert Mustacchi #include <sys/types.h> /* lseek and read */
41*4d9fdb46SRobert Mustacchi #ifdef HAVE_UNISTD_H
42*4d9fdb46SRobert Mustacchi #include <unistd.h> /* lseek read close */
43*4d9fdb46SRobert Mustacchi #elif defined(_WIN32) && defined(_MSC_VER)
44*4d9fdb46SRobert Mustacchi #include <io.h>
45*4d9fdb46SRobert Mustacchi #include <basetsd.h>
46*4d9fdb46SRobert Mustacchi typedef SSIZE_T ssize_t; /* MSVC does not have POSIX ssize_t */
47*4d9fdb46SRobert Mustacchi #endif /* HAVE_UNISTD_H */
48*4d9fdb46SRobert Mustacchi
49*4d9fdb46SRobert Mustacchi /* Windows specific header files */
50*4d9fdb46SRobert Mustacchi #if defined(_WIN32) && defined(HAVE_STDAFX_H)
51*4d9fdb46SRobert Mustacchi #include "stdafx.h"
52*4d9fdb46SRobert Mustacchi #endif /* HAVE_STDAFX_H */
53*4d9fdb46SRobert Mustacchi
54*4d9fdb46SRobert Mustacchi #include "libdwarf.h" /* For error codes. */
55*4d9fdb46SRobert Mustacchi #include "dwarf_object_read_common.h"
56*4d9fdb46SRobert Mustacchi
57*4d9fdb46SRobert Mustacchi /* Neither off_t nor ssize_t is in C90.
58*4d9fdb46SRobert Mustacchi However, both are in Posix:
59*4d9fdb46SRobert Mustacchi IEEE Std 1003.1-1990, aka
60*4d9fdb46SRobert Mustacchi ISO/IEC 9954-1:1990. */
61*4d9fdb46SRobert Mustacchi int
_dwarf_object_read_random(int fd,char * buf,off_t loc,size_t size,off_t filesize,int * errc)62*4d9fdb46SRobert Mustacchi _dwarf_object_read_random(int fd, char *buf, off_t loc,
63*4d9fdb46SRobert Mustacchi size_t size, off_t filesize, int *errc)
64*4d9fdb46SRobert Mustacchi {
65*4d9fdb46SRobert Mustacchi off_t scode = 0;
66*4d9fdb46SRobert Mustacchi ssize_t rcode = 0;
67*4d9fdb46SRobert Mustacchi off_t endpoint = 0;
68*4d9fdb46SRobert Mustacchi
69*4d9fdb46SRobert Mustacchi if (loc >= filesize) {
70*4d9fdb46SRobert Mustacchi /* Seek can seek off the end. Lets not allow that.
71*4d9fdb46SRobert Mustacchi The object is corrupt. */
72*4d9fdb46SRobert Mustacchi *errc = DW_DLE_SEEK_OFF_END;
73*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
74*4d9fdb46SRobert Mustacchi }
75*4d9fdb46SRobert Mustacchi endpoint = loc+size;
76*4d9fdb46SRobert Mustacchi if (endpoint > filesize) {
77*4d9fdb46SRobert Mustacchi /* Let us -not- try to read past end of object.
78*4d9fdb46SRobert Mustacchi The object is corrupt. */
79*4d9fdb46SRobert Mustacchi *errc = DW_DLE_READ_OFF_END;
80*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
81*4d9fdb46SRobert Mustacchi }
82*4d9fdb46SRobert Mustacchi scode = lseek(fd,loc,SEEK_SET);
83*4d9fdb46SRobert Mustacchi if (scode == (off_t)-1) {
84*4d9fdb46SRobert Mustacchi *errc = DW_DLE_SEEK_ERROR;
85*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
86*4d9fdb46SRobert Mustacchi }
87*4d9fdb46SRobert Mustacchi rcode = read(fd,buf,size);
88*4d9fdb46SRobert Mustacchi if (rcode == -1 ||
89*4d9fdb46SRobert Mustacchi (size_t)rcode != size) {
90*4d9fdb46SRobert Mustacchi *errc = DW_DLE_READ_ERROR;
91*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
92*4d9fdb46SRobert Mustacchi }
93*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
94*4d9fdb46SRobert Mustacchi }
95*4d9fdb46SRobert Mustacchi
96*4d9fdb46SRobert Mustacchi void
_dwarf_safe_strcpy(char * out,long outlen,const char * in,long inlen)97*4d9fdb46SRobert Mustacchi _dwarf_safe_strcpy(char *out, long outlen, const char *in, long inlen)
98*4d9fdb46SRobert Mustacchi {
99*4d9fdb46SRobert Mustacchi if (inlen >= (outlen - 1)) {
100*4d9fdb46SRobert Mustacchi strncpy(out, in, outlen - 1);
101*4d9fdb46SRobert Mustacchi out[outlen - 1] = 0;
102*4d9fdb46SRobert Mustacchi } else {
103*4d9fdb46SRobert Mustacchi strcpy(out, in);
104*4d9fdb46SRobert Mustacchi }
105*4d9fdb46SRobert Mustacchi }
106