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