Changeset 4372 for zzuf


Ignore:
Timestamp:
Feb 27, 2010, 7:17:14 PM (10 years ago)
Author:
Sam Hocevar
Message:

Add support for fortified glibc functions (fgets_chk, read_chk, etc.).

Location:
zzuf/trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • zzuf/trunk/configure.ac

    r4364 r4372  
    4949
    5050AC_CHECK_FUNCS(setenv waitpid setrlimit gettimeofday fork kill pipe _pipe)
    51 AC_CHECK_FUNCS(open64 __open64 lseek64 __lseek64 mmap64 fopen64 __fopen64 freopen64 __freopen64 dup dup2 ftello ftello64 __ftello64 fseeko fseeko64 __fseeko64 fsetpos64 __fsetpos64 _IO_getc getline getdelim __getdelim fgetln __srefill __filbuf __srget __uflow map_fd memalign posix_memalign aio_read accept bind connect socket readv pread recv recvfrom recvmsg mmap valloc sigaction getpagesize getc_unlocked getchar_unlocked fgetc_unlocked fread_unlocked fgets_unlocked)
     51AC_CHECK_FUNCS(dup dup2 ftello fseeko _IO_getc getline getdelim fgetln map_fd memalign posix_memalign aio_read accept bind connect socket readv pread recv recvfrom recvmsg mmap valloc sigaction getpagesize)
     52AC_CHECK_FUNCS(getc_unlocked getchar_unlocked fgetc_unlocked fread_unlocked fgets_unlocked)
     53AC_CHECK_FUNCS(__getdelim __srefill __filbuf __srget __uflow)
     54AC_CHECK_FUNCS(open64 lseek64 mmap64 fopen64 freopen64 ftello64 fseeko64 fsetpos64)
     55AC_CHECK_FUNCS(__open64 __lseek64 __fopen64 __freopen64 __ftello64 __fseeko64 __fsetpos64)
     56AC_CHECK_FUNCS(__fgets_chk __fgets_unlocked_chk __fread_chk __fread_unlocked_chk __read_chk __recv_chk __recvfrom_chk)
    5257
    5358AC_CHECK_TYPES(sighandler_t, [], [],
  • zzuf/trunk/msvc/config.h

    r4285 r4372  
    104104/* #undef HAVE__IO_GETC */
    105105#define HAVE__PIPE 1
     106/* #undef HAVE___FGETS_CHK */
     107/* #undef HAVE___FGETS_UNLOCKED_CHK */
    106108/* #undef HAVE___FILBUF */
    107109/* #undef HAVE___FOPEN64 */
     110/* #undef HAVE___FREAD_CHK */
     111/* #undef HAVE___FREAD_UNLOCKED_CHK */
    108112/* #undef HAVE___FREOPEN64 */
    109113/* #undef HAVE___FSEEKO64 */
     
    113117/* #undef HAVE___LSEEK64 */
    114118/* #undef HAVE___OPEN64 */
     119/* #undef HAVE___READ_CHK */
     120/* #undef HAVE___RECVFROM_CHK */
     121/* #undef HAVE___RECV_CHK */
    115122/* #undef HAVE___SREFILL */
    116123/* #undef HAVE___SRGET */
  • zzuf/trunk/src/libzzuf/lib-fd.c

    r4285 r4372  
    123123static RECV_T  (*ORIG(recv))    (int s, void *buf, size_t len, int flags);
    124124#endif
     125#if defined HAVE___RECV_CHK
     126static RECV_T  (*ORIG(__recv_chk)) (int s, void *buf, size_t len, int flags);
     127#endif
    125128#if defined HAVE_RECVFROM
    126129static RECV_T  (*ORIG(recvfrom))(int s, void *buf, size_t len, int flags,
    127130                                 SOCKADDR_T *from, SOCKLEN_T *fromlen);
     131#endif
     132#if defined HAVE___RECVFROM_CHK
     133static RECV_T  (*ORIG(__recvfrom_chk))(int s, void *buf, size_t len, int flags,
     134                                       SOCKADDR_T *from, SOCKLEN_T *fromlen);
    128135#endif
    129136#if defined HAVE_RECVMSG
     
    134141#else
    135142static int     (*ORIG(read))    (int fd, void *buf, unsigned int count);
     143#endif
     144#if defined HAVE___READ_CHK
     145static ssize_t (*ORIG(__read_chk)) (int fd, void *buf, size_t count);
    136146#endif
    137147#if defined HAVE_READV
     
    353363#endif
    354364
     365#define ZZ_RECV(myrecv) \
     366    do \
     367    { \
     368        LOADSYM(myrecv); \
     369        ret = ORIG(myrecv)(s, buf, len, flags); \
     370        if(!_zz_ready || !_zz_iswatched(s) || !_zz_hostwatched(s) \
     371             || _zz_islocked(s) || !_zz_isactive(s)) \
     372            return ret; \
     373        if(ret > 0) \
     374        { \
     375            char *b = buf; \
     376            _zz_fuzz(s, buf, ret); \
     377            _zz_addpos(s, ret); \
     378            if(ret >= 4) \
     379                debug("%s(%i, %p, %li, 0x%x) = %i \"%c%c%c%c...", __func__, \
     380                      s, buf, (long int)len, flags, ret, \
     381                      b[0], b[1], b[2], b[3]); \
     382            else \
     383                debug("%s(%i, %p, %li, 0x%x) = %i \"%c...", __func__, \
     384                      s, buf, (long int)len, flags, ret, b[0]); \
     385        } \
     386        else \
     387            debug("%s(%i, %p, %li, 0x%x) = %i", __func__, \
     388                  s, buf, (long int)len, flags, ret); \
     389    } while(0);
     390
    355391#if defined HAVE_RECV
    356392RECV_T NEW(recv)(int s, void *buf, size_t len, int flags)
    357393{
    358     int ret;
    359 
    360     LOADSYM(recv);
    361     ret = ORIG(recv)(s, buf, len, flags);
    362     if(!_zz_ready || !_zz_iswatched(s) || !_zz_hostwatched(s)
    363          || _zz_islocked(s) || !_zz_isactive(s))
    364         return ret;
    365 
    366     if(ret > 0)
    367     {
    368         char *b = buf;
    369 
    370         _zz_fuzz(s, buf, ret);
    371         _zz_addpos(s, ret);
    372 
    373         if(ret >= 4)
    374             debug("%s(%i, %p, %li, 0x%x) = %i \"%c%c%c%c...", __func__,
    375                   s, buf, (long int)len, flags, ret, b[0], b[1], b[2], b[3]);
    376         else
    377             debug("%s(%i, %p, %li, 0x%x) = %i \"%c...", __func__,
    378                   s, buf, (long int)len, flags, ret, b[0]);
    379     }
    380     else
    381         debug("%s(%i, %p, %li, 0x%x) = %i", __func__,
    382               s, buf, (long int)len, flags, ret);
    383 
    384     return ret;
    385 }
    386 #endif
     394    int ret; ZZ_RECV(recv); return ret;
     395}
     396#endif
     397
     398#if defined HAVE___RECV_CHK
     399RECV_T NEW(__recv_chk)(int s, void *buf, size_t len, int flags)
     400{
     401    int ret; ZZ_RECV(__recv_chk); return ret;
     402}
     403#endif
     404
     405#define ZZ_RECVFROM(myrecvfrom) \
     406    do \
     407    { \
     408        LOADSYM(myrecvfrom); \
     409        ret = ORIG(myrecvfrom)(s, buf, len, flags, from, fromlen); \
     410        if(!_zz_ready || !_zz_iswatched(s) || !_zz_hostwatched(s) \
     411             || _zz_islocked(s) || !_zz_isactive(s)) \
     412            return ret; \
     413        if(ret > 0) \
     414        { \
     415            char tmp[128]; \
     416            char *b = buf; \
     417            _zz_fuzz(s, buf, ret); \
     418            _zz_addpos(s, ret); \
     419            if (fromlen) \
     420                sprintf(tmp, "&%i", (int)*fromlen); \
     421            else \
     422                strcpy(tmp, "NULL"); \
     423            if (ret >= 4) \
     424                debug("%s(%i, %p, %li, 0x%x, %p, %s) = %i \"%c%c%c%c...", \
     425                      __func__, s, buf, (long int)len, flags, from, tmp, \
     426                      ret, b[0], b[1], b[2], b[3]); \
     427            else \
     428                debug("%s(%i, %p, %li, 0x%x, %p, %s) = %i \"%c...", \
     429                      __func__, s, buf, (long int)len, flags, from, tmp, \
     430                      ret, b[0]); \
     431        } \
     432        else \
     433            debug("%s(%i, %p, %li, 0x%x, %p, %p) = %i", __func__, \
     434                  s, buf, (long int)len, flags, from, fromlen, ret); \
     435    } while(0)
    387436
    388437#if defined HAVE_RECVFROM
     
    390439                     SOCKADDR_T *from, SOCKLEN_T *fromlen)
    391440{
    392     int ret;
    393 
    394     LOADSYM(recvfrom);
    395     ret = ORIG(recvfrom)(s, buf, len, flags, from, fromlen);
    396     if(!_zz_ready || !_zz_iswatched(s) || !_zz_hostwatched(s)
    397          || _zz_islocked(s) || !_zz_isactive(s))
    398         return ret;
    399 
    400     if(ret > 0)
    401     {
    402         char tmp[128];
    403         char *b = buf;
    404 
    405         _zz_fuzz(s, buf, ret);
    406         _zz_addpos(s, ret);
    407 
    408         if (fromlen)
    409             sprintf(tmp, "&%i", (int)*fromlen);
    410         else
    411             strcpy(tmp, "NULL");
    412 
    413         if (ret >= 4)
    414             debug("%s(%i, %p, %li, 0x%x, %p, %s) = %i \"%c%c%c%c...",
    415                   __func__, s, buf, (long int)len, flags, from, tmp,
    416                   ret, b[0], b[1], b[2], b[3]);
    417         else
    418             debug("%s(%i, %p, %li, 0x%x, %p, %s) = %i \"%c...",
    419                   __func__, s, buf, (long int)len, flags, from, tmp,
    420                   ret, b[0]);
    421     }
    422     else
    423         debug("%s(%i, %p, %li, 0x%x, %p, %p) = %i", __func__,
    424               s, buf, (long int)len, flags, from, fromlen, ret);
    425 
    426     return ret;
     441    int ret; ZZ_RECVFROM(recvfrom); return ret;
     442}
     443#endif
     444
     445#if defined HAVE___RECVFROM_CHK
     446RECV_T NEW(__recvfrom_chk)(int s, void *buf, size_t len, int flags,
     447                           SOCKADDR_T *from, SOCKLEN_T *fromlen)
     448{
     449    int ret; ZZ_RECVFROM(__recvfrom_chk); return ret;
    427450}
    428451#endif
     
    446469#endif
    447470
     471#define ZZ_READ(myread) \
     472    do \
     473    { \
     474        LOADSYM(myread); \
     475        ret = ORIG(read)(fd, buf, count); \
     476        if(!_zz_ready || !_zz_iswatched(fd) || !_zz_hostwatched(fd) \
     477             || _zz_islocked(fd) || !_zz_isactive(fd)) \
     478            return ret; \
     479        if(ret > 0) \
     480        { \
     481            char *b = buf; \
     482            _zz_fuzz(fd, buf, ret); \
     483            _zz_addpos(fd, ret); \
     484            if(ret >= 4) \
     485                debug("%s(%i, %p, %li) = %i \"%c%c%c%c...", __func__, fd, \
     486                      buf, (long int)count, ret, b[0], b[1], b[2], b[3]); \
     487            else \
     488                debug("%s(%i, %p, %li) = %i \"%c...", __func__, fd, \
     489                      buf, (long int)count, ret, b[0]); \
     490        } \
     491        else \
     492            debug("%s(%i, %p, %li) = %i", __func__, fd, \
     493                  buf, (long int)count, ret); \
     494        offset_check(fd); \
     495    } while(0)
     496
    448497#if defined READ_USES_SSIZE_T
    449498ssize_t NEW(read)(int fd, void *buf, size_t count)
     499{
     500    int ret; ZZ_READ(read); return (ssize_t)ret;
     501}
    450502#else
    451503int NEW(read)(int fd, void *buf, unsigned int count)
    452 #endif
    453 {
    454     int ret;
    455 
    456     LOADSYM(read);
    457     ret = ORIG(read)(fd, buf, count);
    458     if(!_zz_ready || !_zz_iswatched(fd) || !_zz_hostwatched(fd)
    459          || _zz_islocked(fd) || !_zz_isactive(fd))
    460         return ret;
    461 
    462     if(ret > 0)
    463     {
    464         char *b = buf;
    465 
    466         _zz_fuzz(fd, buf, ret);
    467         _zz_addpos(fd, ret);
    468 
    469         if(ret >= 4)
    470             debug("%s(%i, %p, %li) = %i \"%c%c%c%c...", __func__, fd, buf,
    471                   (long int)count, ret, b[0], b[1], b[2], b[3]);
    472         else
    473             debug("%s(%i, %p, %li) = %i \"%c...", __func__, fd, buf,
    474                   (long int)count, ret, b[0]);
    475     }
    476     else
    477         debug("%s(%i, %p, %li) = %i", __func__, fd, buf, (long int)count, ret);
    478 
    479     offset_check(fd);
    480     return ret;
    481 }
     504{
     505    int ret; ZZ_READ(read); return ret;
     506}
     507#endif
     508
     509#if defined HAVE___READ_CHK
     510ssize_t NEW(__read_chk)(int fd, void *buf, size_t count)
     511{
     512    int ret; ZZ_READ(__read_chk); return (ssize_t)ret;
     513}
     514#endif
    482515
    483516#if defined HAVE_READV
  • zzuf/trunk/src/libzzuf/lib-stream.c

    r4285 r4372  
    110110                                         FILE *stream);
    111111#endif
     112#if defined HAVE___FREAD_CHK
     113static size_t  (*ORIG(__fread_chk))  (void *ptr, size_t size, size_t nmemb,
     114                                      FILE *stream);
     115#endif
     116#if defined HAVE___FREAD_UNLOCKED_CHK
     117static size_t  (*ORIG(__fread_unlocked_chk))  (void *ptr, size_t size,
     118                                               size_t nmemb, FILE *stream);
     119#endif
    112120static int     (*ORIG(getc))     (FILE *stream);
    113121static int     (*ORIG(getchar))  (void);
     
    128136#if defined HAVE_FGETS_UNLOCKED
    129137static char *  (*ORIG(fgets_unlocked))   (char *s, int size, FILE *stream);
     138#endif
     139#if defined HAVE___FGETS_CHK
     140static char *  (*ORIG(__fgets_chk))    (char *s, int size, FILE *stream);
     141#endif
     142#if defined HAVE___FGETS_UNLOCKED_CHK
     143static char *  (*ORIG(__fgets_unlocked_chk)) (char *s, int size, FILE *stream);
    130144#endif
    131145static int     (*ORIG(ungetc))   (int c, FILE *stream);
     
    535549{
    536550    size_t ret; ZZ_FREAD(fread_unlocked); return ret;
     551}
     552#endif
     553
     554#if defined HAVE___FREAD_CHK
     555#undef __fread_chk
     556size_t NEW(__fread_chk)(void *ptr, size_t size, size_t nmemb, FILE *stream)
     557{
     558    size_t ret; ZZ_FREAD(__fread_chk); return ret;
     559}
     560#endif
     561
     562#if defined HAVE___FREAD_UNLOCKED_CHK
     563#undef __fread_unlocked_chk
     564size_t NEW(__fread_unlocked_chk)(void *ptr, size_t size, size_t nmemb,
     565                                 FILE *stream)
     566{
     567    size_t ret; ZZ_FREAD(__fread_unlocked_chk); return ret;
    537568}
    538569#endif
     
    719750{
    720751    char *ret; ZZ_FGETS(fgets_unlocked, fgetc_unlocked); return ret;
     752}
     753#endif
     754
     755#if defined HAVE___FGETS_CHK
     756char *NEW(__fgets_chk)(char *s, int size, FILE *stream)
     757{
     758    char *ret; ZZ_FGETS(__fgets_chk, fgetc); return ret;
     759}
     760#endif
     761
     762#if defined HAVE___FGETS_UNLOCKED_CHK
     763char *NEW(__fgets_unlocked_chk)(char *s, int size, FILE *stream)
     764{
     765    char *ret; ZZ_FGETS(__fgets_unlocked_chk, fgetc_unlocked); return ret;
    721766}
    722767#endif
Note: See TracChangeset for help on using the changeset viewer.