Ignore:
Timestamp:
Jan 10, 2007, 3:57:22 PM (14 years ago)
Author:
Sam Hocevar
Message:
  • Split load-fd.c into load-fd.c and load-mem.c (mmap, etc.).
File:
1 copied

Legend:

Unmodified
Added
Removed
  • zzuf/trunk/src/load-mem.c

    r1638 r1639  
    11/*
    22 *  zzuf - general purpose fuzzer
    3  *  Copyright (c) 2006 Sam Hocevar <sam@zoy.org>
     3 *  Copyright (c) 2006,2007 Sam Hocevar <sam@zoy.org>
    44 *                All Rights Reserved
    55 *
     
    1414
    1515/*
    16  *  load-fd.c: loaded file descriptor functions
     16 *  load-mem.c: loaded memory handling functions
    1717 */
    1818
    1919#include "config.h"
    2020
    21 /* Can't remember what that's for */
     21/* Need this for RTLD_NEXT */
    2222#define _GNU_SOURCE
    23 /* Use this to get lseek64() on glibc systems */
     23/* Use this to get mmap64() on glibc systems */
    2424#define _LARGEFILE64_SOURCE
    2525
     
    3333#include <dlfcn.h>
    3434
    35 #include <sys/types.h>
    36 #include <sys/socket.h>
     35#include <unistd.h>
    3736#include <sys/mman.h>
    38 #include <unistd.h>
    39 #include <fcntl.h>
    40 #include <stdarg.h>
    4137#if defined HAVE_LIBC_H
    4238#   include <libc.h>
     
    4945#include "fd.h"
    5046
    51 #ifdef HAVE_SOCKLEN_T
    52 #   define SOCKLEN_T socklen_t
    53 #else
    54 #   define SOCKLEN_T int
    55 #endif
    56 
    5747/* Library functions that we divert */
    58 static int     (*open_orig)    (const char *file, int oflag, ...);
    59 #ifdef HAVE_OPEN64
    60 static int     (*open64_orig)  (const char *file, int oflag, ...);
    61 #endif
    62 static int     (*accept_orig)  (int sockfd, struct sockaddr *addr,
    63                                 SOCKLEN_T *addrlen);
    64 static int     (*socket_orig)  (int domain, int type, int protocol);
    65 static ssize_t (*read_orig)    (int fd, void *buf, size_t count);
    66 static off_t   (*lseek_orig)   (int fd, off_t offset, int whence);
    67 #ifdef HAVE_LSEEK64
    68 static off64_t (*lseek64_orig) (int fd, off64_t offset, int whence);
    69 #endif
    7048static void *  (*mmap_orig)    (void *start, size_t length, int prot,
    7149                                int flags, int fd, off_t offset);
    72 #ifdef HAVE_LSEEK64
     50#ifdef HAVE_MMAP64
    7351static void *  (*mmap64_orig)  (void *start, size_t length, int prot,
    7452                                int flags, int fd, off64_t offset);
     
    8058                                     vm_size_t numbytes);
    8159#endif
    82 static int     (*close_orig)   (int fd);
    8360
    84 
    85 void _zz_load_fd(void)
     61void _zz_load_mem(void)
    8662{
    87     LOADSYM(open);
    88 #ifdef HAVE_OPEN64
    89     LOADSYM(open64);
    90 #endif
    91     LOADSYM(accept);
    92     LOADSYM(socket);
    93     LOADSYM(read);
    94     LOADSYM(lseek);
    95 #ifdef HAVE_LSEEK64
    96     LOADSYM(lseek64);
    97 #endif
    9863    LOADSYM(mmap);
    9964#ifdef HAVE_MMAP64
     
    10469    LOADSYM(map_fd);
    10570#endif
    106     LOADSYM(close);
    10771}
    10872
    109 #define OPEN(fn) \
    110     do \
    111     { \
    112         int mode = 0; \
    113         if(!_zz_ready) \
    114             LOADSYM(fn); \
    115         if(oflag & O_CREAT) \
    116         { \
    117             va_list va; \
    118             va_start(va, oflag); \
    119             mode = va_arg(va, int); \
    120             va_end(va); \
    121             ret = ORIG(fn)(file, oflag, mode); \
    122         } \
    123         else \
    124         { \
    125             ret = ORIG(fn)(file, oflag); \
    126         } \
    127         if(!_zz_ready || _zz_disabled) \
    128             return ret; \
    129         if(ret >= 0 \
    130             && ((oflag & (O_RDONLY | O_RDWR | O_WRONLY)) != O_WRONLY) \
    131             && _zz_mustwatch(file)) \
    132         { \
    133             if(oflag & O_CREAT) \
    134                 debug(STR(fn) "(\"%s\", %i, %i) = %i", \
    135                       file, oflag, mode, ret); \
    136             else \
    137                 debug(STR(fn) "(\"%s\", %i) = %i", file, oflag, ret); \
    138             _zz_register(ret); \
    139         } \
    140     } while(0)
    141 
    142 int open(const char *file, int oflag, ...)
    143 {
    144     int ret; OPEN(open); return ret;
    145 }
    146 
    147 #ifdef HAVE_OPEN64
    148 int open64(const char *file, int oflag, ...)
    149 {
    150     int ret; OPEN(open64); return ret;
    151 }
    152 #endif
    153 
    154 int accept(int sockfd, struct sockaddr *addr, SOCKLEN_T *addrlen)
    155 {
    156     int ret;
    157 
    158     if(!_zz_ready)
    159         LOADSYM(accept);
    160     ret = accept_orig(sockfd, addr, addrlen);
    161     if(!_zz_ready || _zz_disabled || !_zz_network)
    162         return ret;
    163 
    164     if(ret >= 0)
    165     {
    166         debug("accept(%i, %p, %p) = %i", sockfd, addr, addrlen, ret);
    167         _zz_register(ret);
    168     }
    169 
    170     return ret;
    171 }
    172 
    173 int socket(int domain, int type, int protocol)
    174 {
    175     int ret;
    176 
    177     if(!_zz_ready)
    178         LOADSYM(socket);
    179     ret = socket_orig(domain, type, protocol);
    180     if(!_zz_ready || _zz_disabled || !_zz_network)
    181         return ret;
    182 
    183     if(ret >= 0)
    184     {
    185         debug("socket(%i, %i, %i) = %i", domain, type, protocol, ret);
    186         _zz_register(ret);
    187     }
    188 
    189     return ret;
    190 }
    191 
    192 ssize_t read(int fd, void *buf, size_t count)
    193 {
    194     int ret;
    195 
    196     if(!_zz_ready)
    197         LOADSYM(read);
    198     ret = read_orig(fd, buf, count);
    199     if(!_zz_ready || !_zz_iswatched(fd) || _zz_disabled)
    200         return ret;
    201 
    202     if(ret > 0)
    203     {
    204         char *b = buf;
    205 
    206         _zz_fuzz(fd, buf, ret);
    207         _zz_addpos(fd, ret);
    208 
    209         if(ret >= 4)
    210             debug("read(%i, %p, %li) = %i \"%c%c%c%c...", fd, buf,
    211                   (long int)count, ret, b[0], b[1], b[2], b[3]);
    212         else
    213             debug("read(%i, %p, %li) = %i \"%c...", fd, buf,
    214                   (long int)count, ret, b[0]);
    215     }
    216     else
    217         debug("read(%i, %p, %li) = %i", fd, buf, (long int)count, ret);
    218 
    219     /* Sanity check, can be OK though (for instance with a character device) */
    220 #ifdef HAVE_LSEEK64
    221     if(lseek64_orig(fd, 0, SEEK_CUR) != _zz_getpos(fd))
    222 #else
    223     if(lseek_orig(fd, 0, SEEK_CUR) != _zz_getpos(fd))
    224 #endif
    225         debug("warning: offset inconsistency");
    226 
    227     return ret;
    228 }
    229 
    230 #define LSEEK(fn, off_t) \
    231     do \
    232     { \
    233         if(!_zz_ready) \
    234             LOADSYM(fn); \
    235         ret = ORIG(fn)(fd, offset, whence); \
    236         if(!_zz_ready || !_zz_iswatched(fd) || _zz_disabled) \
    237             return ret; \
    238         debug(STR(fn)"(%i, %lli, %i) = %lli", \
    239               fd, (long long int)offset, whence, (long long int)ret); \
    240         if(ret != (off_t)-1) \
    241             _zz_setpos(fd, ret); \
    242     } while(0)
    243 
    244 off_t lseek(int fd, off_t offset, int whence)
    245 {
    246     off_t ret;
    247     LSEEK(lseek, off_t);
    248     return ret;
    249 }
    250 
    251 #ifdef HAVE_LSEEK64
    252 off64_t lseek64(int fd, off64_t offset, int whence)
    253 {
    254     off64_t ret;
    255     LSEEK(lseek64, off64_t);
    256     return ret;
    257 }
    258 #endif
    259 
    260 /* Used for mmap() and munmap() */
     73/* Table used for mmap() and munmap() */
    26174void **maps = NULL;
    26275int nbmaps = 0;
     
    380193#endif
    381194
    382 int close(int fd)
    383 {
    384     int ret;
    385 
    386     if(!_zz_ready)
    387         LOADSYM(close);
    388 
    389     /* Hey, it’s our debug channel! Silently pretend we closed it. */
    390     if(fd == DEBUG_FILENO)
    391         return 0;
    392 
    393     ret = close_orig(fd);
    394     if(!_zz_ready || !_zz_iswatched(fd) || _zz_disabled)
    395         return ret;
    396 
    397     debug("close(%i) = %i", fd, ret);
    398     _zz_unregister(fd);
    399 
    400     return ret;
    401 }
    402 
Note: See TracChangeset for help on using the changeset viewer.