1 /* Mudflap: narrow-pointer bounds-checking by tree rewriting.
2 Copyright (C) 2002, 2003 Free Software Foundation, Inc.
3 Contributed by Frank Ch. Eigler <fche@redhat.com>
4 and Graydon Hoare <graydon@redhat.com>
6 This file is part of GCC.
12 /* These attempt to coax various unix flavours to declare all our
13 needed tidbits in the system headers. */
14 #if !defined(__FreeBSD__)
16 #endif /* Some BSDs break <sys/socket.h> if this is defined. */
20 #define __EXTENSIONS__
27 #include <sys/types.h>
34 #include "mf-runtime.h"
38 #error "Do not compile this file with -fmudflap!"
42 /* A bunch of independent stdlib/unistd hook functions, all
43 intercepted by mf-runtime.h macros. */
49 WRAPPER2(void *, memcpy
, void *dest
, const void *src
, size_t n
)
51 TRACE ("%s\n", __PRETTY_FUNCTION__
);
52 MF_VALIDATE_EXTENT(src
, n
, __MF_CHECK_READ
, "memcpy source");
53 MF_VALIDATE_EXTENT(dest
, n
, __MF_CHECK_WRITE
, "memcpy dest");
54 return memcpy (dest
, src
, n
);
60 WRAPPER2(void *, memmove
, void *dest
, const void *src
, size_t n
)
62 TRACE ("%s\n", __PRETTY_FUNCTION__
);
63 MF_VALIDATE_EXTENT(src
, n
, __MF_CHECK_READ
, "memmove src");
64 MF_VALIDATE_EXTENT(dest
, n
, __MF_CHECK_WRITE
, "memmove dest");
65 return memmove (dest
, src
, n
);
70 WRAPPER2(void *, memset
, void *s
, int c
, size_t n
)
72 TRACE ("%s\n", __PRETTY_FUNCTION__
);
73 MF_VALIDATE_EXTENT(s
, n
, __MF_CHECK_WRITE
, "memset dest");
74 return memset (s
, c
, n
);
79 WRAPPER2(int, memcmp
, const void *s1
, const void *s2
, size_t n
)
81 TRACE ("%s\n", __PRETTY_FUNCTION__
);
82 MF_VALIDATE_EXTENT(s1
, n
, __MF_CHECK_READ
, "memcmp 1st arg");
83 MF_VALIDATE_EXTENT(s2
, n
, __MF_CHECK_READ
, "memcmp 2nd arg");
84 return memcmp (s1
, s2
, n
);
89 WRAPPER2(void *, memchr
, const void *s
, int c
, size_t n
)
91 TRACE ("%s\n", __PRETTY_FUNCTION__
);
92 MF_VALIDATE_EXTENT(s
, n
, __MF_CHECK_READ
, "memchr region");
93 return memchr (s
, c
, n
);
98 WRAPPER2(void *, memrchr
, const void *s
, int c
, size_t n
)
100 TRACE ("%s\n", __PRETTY_FUNCTION__
);
101 MF_VALIDATE_EXTENT(s
, n
, __MF_CHECK_READ
, "memrchr region");
102 return memrchr (s
, c
, n
);
107 WRAPPER2(char *, strcpy
, char *dest
, const char *src
)
109 /* nb: just because strlen(src) == n doesn't mean (src + n) or (src + n +
110 1) are valid pointers. the allocated object might have size < n.
113 size_t n
= strlen (src
);
114 TRACE ("%s\n", __PRETTY_FUNCTION__
);
115 MF_VALIDATE_EXTENT(src
, CLAMPADD(n
, 1), __MF_CHECK_READ
, "strcpy src");
116 MF_VALIDATE_EXTENT(dest
, CLAMPADD(n
, 1), __MF_CHECK_WRITE
, "strcpy dest");
117 return strcpy (dest
, src
);
122 WRAPPER2(char *, strncpy
, char *dest
, const char *src
, size_t n
)
124 size_t len
= strnlen (src
, n
);
125 TRACE ("%s\n", __PRETTY_FUNCTION__
);
126 MF_VALIDATE_EXTENT(src
, len
, __MF_CHECK_READ
, "strncpy src");
127 MF_VALIDATE_EXTENT(dest
, len
, __MF_CHECK_WRITE
, "strncpy dest"); /* nb: strNcpy */
128 return strncpy (dest
, src
, n
);
133 WRAPPER2(char *, strcat
, char *dest
, const char *src
)
137 TRACE ("%s\n", __PRETTY_FUNCTION__
);
138 dest_sz
= strlen (dest
);
139 src_sz
= strlen (src
);
140 MF_VALIDATE_EXTENT(src
, CLAMPADD(src_sz
, 1), __MF_CHECK_READ
, "strcat src");
141 MF_VALIDATE_EXTENT(dest
, CLAMPADD(dest_sz
, CLAMPADD(src_sz
, 1)),
142 __MF_CHECK_WRITE
, "strcat dest");
143 return strcat (dest
, src
);
148 WRAPPER2(char *, strncat
, char *dest
, const char *src
, size_t n
)
151 /* nb: validating the extents (s,n) might be a mistake for two reasons.
153 (1) the string s might be shorter than n chars, and n is just a
154 poor choice by the programmer. this is not a "true" error in the
155 sense that the call to strncat would still be ok.
157 (2) we could try to compensate for case (1) by calling strlen(s) and
158 using that as a bound for the extent to verify, but strlen might fall off
159 the end of a non-terminated string, leading to a false positive.
161 so we will call strnlen(s,n) and use that as a bound.
163 if strnlen returns a length beyond the end of the registered extent
164 associated with s, there is an error: the programmer's estimate for n is
165 too large _AND_ the string s is unterminated, in which case they'd be
166 about to touch memory they don't own while calling strncat.
168 this same logic applies to further uses of strnlen later down in this
173 TRACE ("%s\n", __PRETTY_FUNCTION__
);
174 src_sz
= strnlen (src
, n
);
175 dest_sz
= strnlen (dest
, n
);
176 MF_VALIDATE_EXTENT(src
, src_sz
, __MF_CHECK_READ
, "strncat src");
177 MF_VALIDATE_EXTENT(dest
, (CLAMPADD(dest_sz
, CLAMPADD(src_sz
, 1))),
178 __MF_CHECK_WRITE
, "strncat dest");
179 return strncat (dest
, src
, n
);
184 WRAPPER2(int, strcmp
, const char *s1
, const char *s2
)
188 TRACE ("%s\n", __PRETTY_FUNCTION__
);
191 MF_VALIDATE_EXTENT(s1
, CLAMPADD(s1_sz
, 1), __MF_CHECK_READ
, "strcmp 1st arg");
192 MF_VALIDATE_EXTENT(s2
, CLAMPADD(s2_sz
, 1), __MF_CHECK_WRITE
, "strcmp 2nd arg");
193 return strcmp (s1
, s2
);
197 #ifdef WRAP_strcasecmp
198 WRAPPER2(int, strcasecmp
, const char *s1
, const char *s2
)
202 TRACE ("%s\n", __PRETTY_FUNCTION__
);
205 MF_VALIDATE_EXTENT(s1
, CLAMPADD(s1_sz
, 1), __MF_CHECK_READ
, "strcasecmp 1st arg");
206 MF_VALIDATE_EXTENT(s2
, CLAMPADD(s2_sz
, 1), __MF_CHECK_READ
, "strcasecmp 2nd arg");
207 return strcasecmp (s1
, s2
);
212 WRAPPER2(int, strncmp
, const char *s1
, const char *s2
, size_t n
)
216 TRACE ("%s\n", __PRETTY_FUNCTION__
);
217 s1_sz
= strnlen (s1
, n
);
218 s2_sz
= strnlen (s2
, n
);
219 MF_VALIDATE_EXTENT(s1
, s1_sz
, __MF_CHECK_READ
, "strncmp 1st arg");
220 MF_VALIDATE_EXTENT(s2
, s2_sz
, __MF_CHECK_READ
, "strncmp 2nd arg");
221 return strncmp (s1
, s2
, n
);
225 #ifdef WRAP_strncasecmp
226 WRAPPER2(int, strncasecmp
, const char *s1
, const char *s2
, size_t n
)
230 TRACE ("%s\n", __PRETTY_FUNCTION__
);
231 s1_sz
= strnlen (s1
, n
);
232 s2_sz
= strnlen (s2
, n
);
233 MF_VALIDATE_EXTENT(s1
, s1_sz
, __MF_CHECK_READ
, "strncasecmp 1st arg");
234 MF_VALIDATE_EXTENT(s2
, s2_sz
, __MF_CHECK_READ
, "strncasecmp 2nd arg");
235 return strncasecmp (s1
, s2
, n
);
240 WRAPPER2(char *, strdup
, const char *s
)
242 DECLARE(void *, malloc
, size_t sz
);
244 size_t n
= strlen (s
);
245 TRACE ("%s\n", __PRETTY_FUNCTION__
);
246 MF_VALIDATE_EXTENT(s
, CLAMPADD(n
,1), __MF_CHECK_READ
, "strdup region");
247 result
= (char *)CALL_REAL(malloc
,
248 CLAMPADD(CLAMPADD(n
,1),
249 CLAMPADD(__mf_opts
.crumple_zone
,
250 __mf_opts
.crumple_zone
)));
252 if (UNLIKELY(! result
)) return result
;
254 result
+= __mf_opts
.crumple_zone
;
255 memcpy (result
, s
, n
);
258 __mf_register (result
, CLAMPADD(n
,1), __MF_TYPE_HEAP_I
, "strdup region");
264 WRAPPER2(char *, strndup
, const char *s
, size_t n
)
266 DECLARE(void *, malloc
, size_t sz
);
268 size_t sz
= strnlen (s
, n
);
269 TRACE ("%s\n", __PRETTY_FUNCTION__
);
270 MF_VALIDATE_EXTENT(s
, sz
, __MF_CHECK_READ
, "strndup region"); /* nb: strNdup */
272 /* note: strndup still adds a \0, even with the N limit! */
273 result
= (char *)CALL_REAL(malloc
,
274 CLAMPADD(CLAMPADD(n
,1),
275 CLAMPADD(__mf_opts
.crumple_zone
,
276 __mf_opts
.crumple_zone
)));
278 if (UNLIKELY(! result
)) return result
;
280 result
+= __mf_opts
.crumple_zone
;
281 memcpy (result
, s
, n
);
284 __mf_register (result
, CLAMPADD(n
,1), __MF_TYPE_HEAP_I
, "strndup region");
290 WRAPPER2(char *, strchr
, const char *s
, int c
)
293 TRACE ("%s\n", __PRETTY_FUNCTION__
);
295 MF_VALIDATE_EXTENT(s
, CLAMPADD(n
,1), __MF_CHECK_READ
, "strchr region");
296 return strchr (s
, c
);
301 WRAPPER2(char *, strrchr
, const char *s
, int c
)
304 TRACE ("%s\n", __PRETTY_FUNCTION__
);
306 MF_VALIDATE_EXTENT(s
, CLAMPADD(n
,1), __MF_CHECK_READ
, "strrchr region");
307 return strrchr (s
, c
);
312 WRAPPER2(char *, strstr
, const char *haystack
, const char *needle
)
316 TRACE ("%s\n", __PRETTY_FUNCTION__
);
317 haystack_sz
= strlen (haystack
);
318 needle_sz
= strlen (needle
);
319 MF_VALIDATE_EXTENT(haystack
, CLAMPADD(haystack_sz
, 1), __MF_CHECK_READ
, "strstr haystack");
320 MF_VALIDATE_EXTENT(needle
, CLAMPADD(needle_sz
, 1), __MF_CHECK_READ
, "strstr needle");
321 return strstr (haystack
, needle
);
326 WRAPPER2(void *, memmem
,
327 const void *haystack
, size_t haystacklen
,
328 const void *needle
, size_t needlelen
)
330 TRACE ("%s\n", __PRETTY_FUNCTION__
);
331 MF_VALIDATE_EXTENT(haystack
, haystacklen
, __MF_CHECK_READ
, "memmem haystack");
332 MF_VALIDATE_EXTENT(needle
, needlelen
, __MF_CHECK_READ
, "memmem needle");
333 return memmem (haystack
, haystacklen
, needle
, needlelen
);
338 WRAPPER2(size_t, strlen
, const char *s
)
340 size_t result
= strlen (s
);
341 TRACE ("%s\n", __PRETTY_FUNCTION__
);
342 MF_VALIDATE_EXTENT(s
, CLAMPADD(result
, 1), __MF_CHECK_READ
, "strlen region");
348 WRAPPER2(size_t, strnlen
, const char *s
, size_t n
)
350 size_t result
= strnlen (s
, n
);
351 TRACE ("%s\n", __PRETTY_FUNCTION__
);
352 MF_VALIDATE_EXTENT(s
, result
, __MF_CHECK_READ
, "strnlen region");
358 WRAPPER2(void, bzero
, void *s
, size_t n
)
360 TRACE ("%s\n", __PRETTY_FUNCTION__
);
361 MF_VALIDATE_EXTENT(s
, n
, __MF_CHECK_WRITE
, "bzero region");
368 WRAPPER2(void, bcopy
, const void *src
, void *dest
, size_t n
)
370 TRACE ("%s\n", __PRETTY_FUNCTION__
);
371 MF_VALIDATE_EXTENT(src
, n
, __MF_CHECK_READ
, "bcopy src");
372 MF_VALIDATE_EXTENT(dest
, n
, __MF_CHECK_WRITE
, "bcopy dest");
373 bcopy (src
, dest
, n
);
379 WRAPPER2(int, bcmp
, const void *s1
, const void *s2
, size_t n
)
381 TRACE ("%s\n", __PRETTY_FUNCTION__
);
382 MF_VALIDATE_EXTENT(s1
, n
, __MF_CHECK_READ
, "bcmp 1st arg");
383 MF_VALIDATE_EXTENT(s2
, n
, __MF_CHECK_READ
, "bcmp 2nd arg");
384 return bcmp (s1
, s2
, n
);
389 WRAPPER2(char *, index
, const char *s
, int c
)
391 size_t n
= strlen (s
);
392 TRACE ("%s\n", __PRETTY_FUNCTION__
);
393 MF_VALIDATE_EXTENT(s
, CLAMPADD(n
, 1), __MF_CHECK_READ
, "index region");
399 WRAPPER2(char *, rindex
, const char *s
, int c
)
401 size_t n
= strlen (s
);
402 TRACE ("%s\n", __PRETTY_FUNCTION__
);
403 MF_VALIDATE_EXTENT(s
, CLAMPADD(n
, 1), __MF_CHECK_READ
, "rindex region");
404 return rindex (s
, c
);
408 /* XXX: stpcpy, memccpy */
411 /* XXX: *printf,*scanf */
414 /* XXX: setjmp, longjmp */
417 WRAPPER2(char *, asctime
, struct tm
*tm
)
419 static char *reg_result
= NULL
;
421 TRACE ("%s\n", __PRETTY_FUNCTION__
);
422 MF_VALIDATE_EXTENT(tm
, sizeof (struct tm
), __MF_CHECK_READ
, "asctime tm");
423 result
= asctime (tm
);
424 if (reg_result
== NULL
)
426 __mf_register (result
, strlen (result
)+1, __MF_TYPE_STATIC
, "asctime string");
434 WRAPPER2(char *, ctime
, const time_t *timep
)
436 static char *reg_result
= NULL
;
438 TRACE ("%s\n", __PRETTY_FUNCTION__
);
439 MF_VALIDATE_EXTENT(timep
, sizeof (time_t), __MF_CHECK_READ
, "ctime time");
440 result
= ctime (timep
);
441 if (reg_result
== NULL
)
443 /* XXX: what if asctime and ctime return the same static ptr? */
444 __mf_register (result
, strlen (result
)+1, __MF_TYPE_STATIC
, "ctime string");
452 #ifdef WRAP_localtime
453 WRAPPER2(struct tm
*, localtime
, const time_t *timep
)
455 static struct tm
*reg_result
= NULL
;
457 TRACE ("%s\n", __PRETTY_FUNCTION__
);
458 MF_VALIDATE_EXTENT(timep
, sizeof (time_t), __MF_CHECK_READ
, "localtime time");
459 result
= localtime (timep
);
460 if (reg_result
== NULL
)
462 __mf_register (result
, sizeof (struct tm
), __MF_TYPE_STATIC
, "localtime tm");
470 WRAPPER2(struct tm
*, gmtime
, const time_t *timep
)
472 static struct tm
*reg_result
= NULL
;
474 TRACE ("%s\n", __PRETTY_FUNCTION__
);
475 MF_VALIDATE_EXTENT(timep
, sizeof (time_t), __MF_CHECK_READ
, "gmtime time");
476 result
= gmtime (timep
);
477 if (reg_result
== NULL
)
479 __mf_register (result
, sizeof (struct tm
), __MF_TYPE_STATIC
, "gmtime tm");
490 /* The following indicate if the result of the corresponding function
491 * should be explicitly un/registered by the wrapper
493 #define MF_REGISTER_strerror __MF_TYPE_STATIC
494 #undef MF_REGISTER_fopen
495 #define MF_RESULT_SIZE_fopen (sizeof (FILE))
496 #undef MF_REGISTER_opendir
497 #define MF_RESULT_SIZE_opendir 0 /* (sizeof (DIR)) */
498 #undef MF_REGISTER_readdir
499 #define MF_REGISTER_gethostbyname __MF_TYPE_STATIC
500 #undef MF_REGISTER_gethostbyname_items
501 #undef MF_REGISTER_dlopen
502 #undef MF_REGISTER_dlerror
503 #undef MF_REGISTER_dlsym
504 #define MF_REGISTER_shmat __MF_TYPE_GUESS
509 WRAPPER2(time_t, time
, time_t *timep
)
511 TRACE ("%s\n", __PRETTY_FUNCTION__
);
513 MF_VALIDATE_EXTENT (timep
, sizeof (*timep
), __MF_CHECK_WRITE
,
520 WRAPPER2(char *, strerror
, int errnum
)
524 TRACE ("%s\n", __PRETTY_FUNCTION__
);
525 p
= strerror (errnum
);
529 #ifdef MF_REGISTER_strerror
530 __mf_register (p
, n
, MF_REGISTER_strerror
, "strerror result");
532 MF_VALIDATE_EXTENT (p
, n
, __MF_CHECK_WRITE
, "strerror result");
539 WRAPPER2(FILE *, fopen
, const char *path
, const char *mode
)
543 TRACE ("%s\n", __PRETTY_FUNCTION__
);
546 MF_VALIDATE_EXTENT (path
, CLAMPADD(n
, 1), __MF_CHECK_READ
, "fopen path");
549 MF_VALIDATE_EXTENT (mode
, CLAMPADD(n
, 1), __MF_CHECK_READ
, "fopen mode");
551 p
= fopen (path
, mode
);
553 #ifdef MF_REGISTER_fopen
554 __mf_register (p
, sizeof (*p
), MF_REGISTER_fopen
, "fopen result");
556 MF_VALIDATE_EXTENT (p
, sizeof (*p
), __MF_CHECK_WRITE
, "fopen result");
565 WRAPPER2(FILE *, fopen64
, const char *path
, const char *mode
)
569 TRACE ("%s\n", __PRETTY_FUNCTION__
);
572 MF_VALIDATE_EXTENT (path
, CLAMPADD(n
, 1), __MF_CHECK_READ
, "fopen64 path");
575 MF_VALIDATE_EXTENT (mode
, CLAMPADD(n
, 1), __MF_CHECK_READ
, "fopen64 mode");
577 p
= fopen64 (path
, mode
);
579 #ifdef MF_REGISTER_fopen
580 __mf_register (p
, sizeof (*p
), MF_REGISTER_fopen
, "fopen64 result");
582 MF_VALIDATE_EXTENT (p
, sizeof (*p
), __MF_CHECK_WRITE
, "fopen64 result");
591 WRAPPER2(int, fclose
, FILE *stream
)
594 TRACE ("%s\n", __PRETTY_FUNCTION__
);
595 MF_VALIDATE_EXTENT (stream
, sizeof (*stream
), __MF_CHECK_WRITE
,
597 resp
= fclose (stream
);
598 #ifdef MF_REGISTER_fopen
599 __mf_unregister (stream
, sizeof (*stream
));
607 WRAPPER2(size_t, fread
, void *ptr
, size_t size
, size_t nmemb
, FILE *stream
)
609 TRACE ("%s\n", __PRETTY_FUNCTION__
);
610 MF_VALIDATE_EXTENT (stream
, sizeof (*stream
), __MF_CHECK_WRITE
,
612 MF_VALIDATE_EXTENT (ptr
, size
* nmemb
, __MF_CHECK_WRITE
, "fread buffer");
613 return fread (ptr
, size
, nmemb
, stream
);
618 WRAPPER2(size_t, fwrite
, const void *ptr
, size_t size
, size_t nmemb
,
621 TRACE ("%s\n", __PRETTY_FUNCTION__
);
622 MF_VALIDATE_EXTENT (stream
, sizeof (*stream
), __MF_CHECK_WRITE
,
624 MF_VALIDATE_EXTENT (ptr
, size
* nmemb
, __MF_CHECK_READ
, "fwrite buffer");
625 return fwrite (ptr
, size
, nmemb
, stream
);
630 WRAPPER2(int, fgetc
, FILE *stream
)
632 TRACE ("%s\n", __PRETTY_FUNCTION__
);
633 MF_VALIDATE_EXTENT (stream
, sizeof (*stream
), __MF_CHECK_WRITE
,
635 return fgetc (stream
);
640 WRAPPER2(char *, fgets
, char *s
, int size
, FILE *stream
)
642 TRACE ("%s\n", __PRETTY_FUNCTION__
);
643 MF_VALIDATE_EXTENT (stream
, sizeof (*stream
), __MF_CHECK_WRITE
,
645 MF_VALIDATE_EXTENT (s
, size
, __MF_CHECK_WRITE
, "fgets buffer");
646 return fgets (s
, size
, stream
);
651 WRAPPER2(int, getc
, FILE *stream
)
653 TRACE ("%s\n", __PRETTY_FUNCTION__
);
654 MF_VALIDATE_EXTENT (stream
, sizeof (*stream
), __MF_CHECK_WRITE
,
656 return getc (stream
);
661 WRAPPER2(char *, gets
, char *s
)
663 TRACE ("%s\n", __PRETTY_FUNCTION__
);
664 MF_VALIDATE_EXTENT (s
, 1, __MF_CHECK_WRITE
, "gets buffer");
666 if (NULL
!= s
) { /* better late than never */
667 size_t n
= strlen (s
);
668 MF_VALIDATE_EXTENT (s
, CLAMPADD(n
, 1), __MF_CHECK_WRITE
, "gets buffer");
675 WRAPPER2(int, ungetc
, int c
, FILE *stream
)
677 TRACE ("%s\n", __PRETTY_FUNCTION__
);
678 MF_VALIDATE_EXTENT (stream
, sizeof (*stream
), __MF_CHECK_WRITE
,
680 return ungetc (c
, stream
);
685 WRAPPER2(int, fputc
, int c
, FILE *stream
)
687 TRACE ("%s\n", __PRETTY_FUNCTION__
);
688 MF_VALIDATE_EXTENT (stream
, sizeof (*stream
), __MF_CHECK_WRITE
,
690 return fputc (c
, stream
);
695 WRAPPER2(int, fputs
, const char *s
, FILE *stream
)
698 TRACE ("%s\n", __PRETTY_FUNCTION__
);
700 MF_VALIDATE_EXTENT (s
, CLAMPADD(n
, 1), __MF_CHECK_READ
, "fputs buffer");
701 MF_VALIDATE_EXTENT (stream
, sizeof (*stream
), __MF_CHECK_WRITE
,
703 return fputs (s
, stream
);
708 WRAPPER2(int, putc
, int c
, FILE *stream
)
710 TRACE ("%s\n", __PRETTY_FUNCTION__
);
711 MF_VALIDATE_EXTENT (stream
, sizeof (*stream
), __MF_CHECK_WRITE
,
713 return putc (c
, stream
);
718 WRAPPER2(int, puts
, const char *s
)
721 TRACE ("%s\n", __PRETTY_FUNCTION__
);
723 MF_VALIDATE_EXTENT (s
, CLAMPADD(n
, 1), __MF_CHECK_READ
, "puts buffer");
729 WRAPPER2(void, clearerr
, FILE *stream
)
731 TRACE ("%s\n", __PRETTY_FUNCTION__
);
732 MF_VALIDATE_EXTENT (stream
, sizeof (*stream
), __MF_CHECK_WRITE
,
739 WRAPPER2(int, feof
, FILE *stream
)
741 TRACE ("%s\n", __PRETTY_FUNCTION__
);
742 MF_VALIDATE_EXTENT (stream
, sizeof (*stream
), __MF_CHECK_WRITE
,
744 return feof (stream
);
749 WRAPPER2(int, ferror
, FILE *stream
)
751 TRACE ("%s\n", __PRETTY_FUNCTION__
);
752 MF_VALIDATE_EXTENT (stream
, sizeof (*stream
), __MF_CHECK_WRITE
,
754 return ferror (stream
);
760 WRAPPER2(int, fileno
, FILE *stream
)
762 TRACE ("%s\n", __PRETTY_FUNCTION__
);
763 MF_VALIDATE_EXTENT (stream
, sizeof (*stream
), __MF_CHECK_WRITE
,
765 return fileno (stream
);
772 WRAPPER2(int, printf
, const char *format
, ...)
777 TRACE ("%s\n", __PRETTY_FUNCTION__
);
779 MF_VALIDATE_EXTENT (format
, CLAMPADD(n
, 1), __MF_CHECK_READ
,
781 va_start (ap
, format
);
782 result
= vprintf (format
, ap
);
791 WRAPPER2(int, fprintf
, FILE *stream
, const char *format
, ...)
796 TRACE ("%s\n", __PRETTY_FUNCTION__
);
797 MF_VALIDATE_EXTENT (stream
, sizeof (*stream
), __MF_CHECK_WRITE
,
800 MF_VALIDATE_EXTENT (format
, CLAMPADD(n
, 1), __MF_CHECK_READ
,
802 va_start (ap
, format
);
803 result
= vfprintf (stream
, format
, ap
);
812 WRAPPER2(int, sprintf
, char *str
, const char *format
, ...)
817 TRACE ("%s\n", __PRETTY_FUNCTION__
);
818 MF_VALIDATE_EXTENT (str
, 1, __MF_CHECK_WRITE
, "sprintf str");
820 MF_VALIDATE_EXTENT (format
, CLAMPADD(n
, 1), __MF_CHECK_READ
,
822 va_start (ap
, format
);
823 result
= vsprintf (str
, format
, ap
);
826 MF_VALIDATE_EXTENT (str
, CLAMPADD(n
, 1), __MF_CHECK_WRITE
, "sprintf str");
834 WRAPPER2(int, snprintf
, char *str
, size_t size
, const char *format
, ...)
839 TRACE ("%s\n", __PRETTY_FUNCTION__
);
840 MF_VALIDATE_EXTENT (str
, size
, __MF_CHECK_WRITE
, "snprintf str");
842 MF_VALIDATE_EXTENT (format
, CLAMPADD(n
, 1), __MF_CHECK_READ
,
844 va_start (ap
, format
);
845 result
= vsnprintf (str
, size
, format
, ap
);
854 WRAPPER2(int, vprintf
, const char *format
, va_list ap
)
857 TRACE ("%s\n", __PRETTY_FUNCTION__
);
859 MF_VALIDATE_EXTENT (format
, CLAMPADD(n
, 1), __MF_CHECK_READ
,
861 return vprintf (format
, ap
);
868 WRAPPER2(int, vfprintf
, FILE *stream
, const char *format
, va_list ap
)
871 TRACE ("%s\n", __PRETTY_FUNCTION__
);
872 MF_VALIDATE_EXTENT (stream
, sizeof (*stream
), __MF_CHECK_WRITE
,
875 MF_VALIDATE_EXTENT (format
, CLAMPADD(n
, 1), __MF_CHECK_READ
,
877 return vfprintf (stream
, format
, ap
);
884 WRAPPER2(int, vsprintf
, char *str
, const char *format
, va_list ap
)
888 TRACE ("%s\n", __PRETTY_FUNCTION__
);
889 MF_VALIDATE_EXTENT (str
, 1, __MF_CHECK_WRITE
, "vsprintf str");
891 MF_VALIDATE_EXTENT (format
, CLAMPADD(n
, 1), __MF_CHECK_READ
,
893 result
= vsprintf (str
, format
, ap
);
895 MF_VALIDATE_EXTENT (str
, CLAMPADD(n
, 1), __MF_CHECK_WRITE
, "vsprintf str");
900 #ifdef WRAP_vsnprintf
903 WRAPPER2(int, vsnprintf
, char *str
, size_t size
, const char *format
,
907 TRACE ("%s\n", __PRETTY_FUNCTION__
);
908 MF_VALIDATE_EXTENT (str
, size
, __MF_CHECK_WRITE
, "vsnprintf str");
910 MF_VALIDATE_EXTENT (format
, CLAMPADD(n
, 1), __MF_CHECK_READ
,
912 return vsnprintf (str
, size
, format
, ap
);
917 WRAPPER2(int , access
, const char *path
, int mode
)
920 TRACE ("%s\n", __PRETTY_FUNCTION__
);
922 MF_VALIDATE_EXTENT (path
, CLAMPADD(n
, 1), __MF_CHECK_READ
, "access path");
923 return access (path
, mode
);
928 WRAPPER2(int , remove
, const char *path
)
931 TRACE ("%s\n", __PRETTY_FUNCTION__
);
933 MF_VALIDATE_EXTENT (path
, CLAMPADD(n
, 1), __MF_CHECK_READ
, "remove path");
934 return remove (path
);
939 WRAPPER2(int, fflush
, FILE *stream
)
941 TRACE ("%s\n", __PRETTY_FUNCTION__
);
942 MF_VALIDATE_EXTENT (stream
, sizeof (*stream
), __MF_CHECK_WRITE
,
944 return fflush (stream
);
949 WRAPPER2(int, fseek
, FILE *stream
, long offset
, int whence
)
951 TRACE ("%s\n", __PRETTY_FUNCTION__
);
952 MF_VALIDATE_EXTENT (stream
, sizeof (*stream
), __MF_CHECK_WRITE
,
954 return fseek (stream
, offset
, whence
);
960 WRAPPER2(int, fseeko64
, FILE *stream
, off64_t offset
, int whence
)
962 TRACE ("%s\n", __PRETTY_FUNCTION__
);
963 MF_VALIDATE_EXTENT (stream
, sizeof (*stream
), __MF_CHECK_WRITE
,
965 return fseeko64 (stream
, offset
, whence
);
971 WRAPPER2(long, ftell
, FILE *stream
)
973 TRACE ("%s\n", __PRETTY_FUNCTION__
);
974 MF_VALIDATE_EXTENT (stream
, sizeof (*stream
), __MF_CHECK_WRITE
,
976 return ftell (stream
);
982 WRAPPER2(off64_t
, ftello64
, FILE *stream
)
984 TRACE ("%s\n", __PRETTY_FUNCTION__
);
985 MF_VALIDATE_EXTENT (stream
, sizeof (*stream
), __MF_CHECK_WRITE
,
987 return ftello64 (stream
);
993 WRAPPER2(void, rewind
, FILE *stream
)
995 TRACE ("%s\n", __PRETTY_FUNCTION__
);
996 MF_VALIDATE_EXTENT (stream
, sizeof (*stream
), __MF_CHECK_WRITE
,
1003 WRAPPER2(int, fgetpos
, FILE *stream
, fpos_t *pos
)
1005 TRACE ("%s\n", __PRETTY_FUNCTION__
);
1006 MF_VALIDATE_EXTENT (stream
, sizeof (*stream
), __MF_CHECK_WRITE
,
1008 MF_VALIDATE_EXTENT (pos
, sizeof (*pos
), __MF_CHECK_WRITE
, "fgetpos pos");
1009 return fgetpos (stream
, pos
);
1014 WRAPPER2(int, fsetpos
, FILE *stream
, fpos_t *pos
)
1016 TRACE ("%s\n", __PRETTY_FUNCTION__
);
1017 MF_VALIDATE_EXTENT (stream
, sizeof (*stream
), __MF_CHECK_WRITE
,
1019 MF_VALIDATE_EXTENT (pos
, sizeof (*pos
), __MF_CHECK_READ
, "fsetpos pos");
1020 return fsetpos (stream
, pos
);
1025 #include <sys/stat.h>
1026 WRAPPER2(int , stat
, const char *path
, struct stat
*buf
)
1029 TRACE ("%s\n", __PRETTY_FUNCTION__
);
1031 MF_VALIDATE_EXTENT (path
, CLAMPADD(n
, 1), __MF_CHECK_READ
, "stat path");
1032 MF_VALIDATE_EXTENT (buf
, sizeof (*buf
), __MF_CHECK_READ
, "stat buf");
1033 return stat (path
, buf
);
1039 #include <sys/stat.h>
1040 WRAPPER2(int , stat64
, const char *path
, struct stat64
*buf
)
1043 TRACE ("%s\n", __PRETTY_FUNCTION__
);
1045 MF_VALIDATE_EXTENT (path
, CLAMPADD(n
, 1), __MF_CHECK_READ
, "stat64 path");
1046 MF_VALIDATE_EXTENT (buf
, sizeof (*buf
), __MF_CHECK_READ
, "stat64 buf");
1047 return stat64 (path
, buf
);
1053 #include <sys/stat.h>
1054 WRAPPER2(int , fstat
, int filedes
, struct stat
*buf
)
1056 TRACE ("%s\n", __PRETTY_FUNCTION__
);
1057 MF_VALIDATE_EXTENT (buf
, sizeof (*buf
), __MF_CHECK_READ
, "fstat buf");
1058 return fstat (filedes
, buf
);
1063 #include <sys/stat.h>
1064 WRAPPER2(int , lstat
, const char *path
, struct stat
*buf
)
1067 TRACE ("%s\n", __PRETTY_FUNCTION__
);
1069 MF_VALIDATE_EXTENT (path
, CLAMPADD(n
, 1), __MF_CHECK_READ
, "lstat path");
1070 MF_VALIDATE_EXTENT (buf
, sizeof (*buf
), __MF_CHECK_READ
, "lstat buf");
1071 return lstat (path
, buf
);
1076 #include <sys/stat.h>
1077 WRAPPER2(int , mkfifo
, const char *path
, mode_t mode
)
1080 TRACE ("%s\n", __PRETTY_FUNCTION__
);
1082 MF_VALIDATE_EXTENT (path
, CLAMPADD(n
, 1), __MF_CHECK_READ
, "mkfifo path");
1083 return mkfifo (path
, mode
);
1088 WRAPPER2(int, setvbuf
, FILE *stream
, char *buf
, int mode
, size_t size
)
1090 TRACE ("%s\n", __PRETTY_FUNCTION__
);
1091 MF_VALIDATE_EXTENT (stream
, sizeof (*stream
), __MF_CHECK_WRITE
,
1094 MF_VALIDATE_EXTENT (buf
, size
, __MF_CHECK_READ
, "setvbuf buf");
1095 return setvbuf (stream
, buf
, mode
, size
);
1100 WRAPPER2(void, setbuf
, FILE *stream
, char *buf
)
1102 TRACE ("%s\n", __PRETTY_FUNCTION__
);
1103 MF_VALIDATE_EXTENT (stream
, sizeof (*stream
), __MF_CHECK_WRITE
,
1106 MF_VALIDATE_EXTENT (buf
, BUFSIZ
, __MF_CHECK_READ
, "setbuf buf");
1107 setbuf (stream
, buf
);
1113 WRAPPER2(DIR *, opendir
, const char *path
)
1117 TRACE ("%s\n", __PRETTY_FUNCTION__
);
1119 MF_VALIDATE_EXTENT (path
, CLAMPADD(n
, 1), __MF_CHECK_READ
, "opendir path");
1123 #ifdef MF_REGISTER_opendir
1124 __mf_register (p
, MF_RESULT_SIZE_opendir
, MF_REGISTER_opendir
,
1127 MF_VALIDATE_EXTENT (p
, MF_RESULT_SIZE_opendir
, __MF_CHECK_WRITE
,
1134 #ifdef WRAP_closedir
1136 WRAPPER2(int, closedir
, DIR *dir
)
1138 TRACE ("%s\n", __PRETTY_FUNCTION__
);
1139 MF_VALIDATE_EXTENT (dir
, 0, __MF_CHECK_WRITE
, "closedir dir");
1140 #ifdef MF_REGISTER_opendir
1141 __mf_unregister (dir
, MF_RESULT_SIZE_opendir
);
1143 return closedir (dir
);
1149 WRAPPER2(struct dirent
*, readdir
, DIR *dir
)
1152 TRACE ("%s\n", __PRETTY_FUNCTION__
);
1153 MF_VALIDATE_EXTENT (dir
, 0, __MF_CHECK_READ
, "readdir dir");
1156 #ifdef MF_REGISTER_readdir
1157 __mf_register (p
, sizeof (*p
), MF_REGISTER_readdir
, "readdir result");
1159 MF_VALIDATE_EXTENT (p
, sizeof (*p
), __MF_CHECK_WRITE
, "readdir result");
1166 #include <sys/socket.h>
1167 WRAPPER2(int, recv
, int s
, void *buf
, size_t len
, int flags
)
1169 TRACE ("%s\n", __PRETTY_FUNCTION__
);
1170 MF_VALIDATE_EXTENT (buf
, len
, __MF_CHECK_WRITE
, "recv buf");
1171 return recv (s
, buf
, len
, flags
);
1175 #ifdef WRAP_recvfrom
1176 #include <sys/socket.h>
1177 WRAPPER2(int, recvfrom
, int s
, void *buf
, size_t len
, int flags
,
1178 struct sockaddr
*from
, socklen_t
*fromlen
)
1180 TRACE ("%s\n", __PRETTY_FUNCTION__
);
1181 MF_VALIDATE_EXTENT (buf
, len
, __MF_CHECK_WRITE
, "recvfrom buf");
1182 MF_VALIDATE_EXTENT (from
, (size_t)*fromlen
, __MF_CHECK_WRITE
,
1184 return recvfrom (s
, buf
, len
, flags
, from
, fromlen
);
1189 #include <sys/socket.h>
1190 WRAPPER2(int, recvmsg
, int s
, struct msghdr
*msg
, int flags
)
1192 TRACE ("%s\n", __PRETTY_FUNCTION__
);
1193 MF_VALIDATE_EXTENT (msg
, sizeof (*msg
), __MF_CHECK_WRITE
, "recvmsg msg");
1194 return recvmsg (s
, msg
, flags
);
1199 #include <sys/socket.h>
1200 WRAPPER2(int, send
, int s
, const void *msg
, size_t len
, int flags
)
1202 TRACE ("%s\n", __PRETTY_FUNCTION__
);
1203 MF_VALIDATE_EXTENT (msg
, len
, __MF_CHECK_READ
, "send msg");
1204 return send (s
, msg
, len
, flags
);
1209 #include <sys/socket.h>
1210 WRAPPER2(int, sendto
, int s
, const void *msg
, size_t len
, int flags
,
1211 const struct sockaddr
*to
, socklen_t tolen
)
1213 TRACE ("%s\n", __PRETTY_FUNCTION__
);
1214 MF_VALIDATE_EXTENT (msg
, len
, __MF_CHECK_READ
, "sendto msg");
1215 MF_VALIDATE_EXTENT (to
, (size_t)tolen
, __MF_CHECK_WRITE
, "sendto to");
1216 return sendto (s
, msg
, len
, flags
, to
, tolen
);
1221 #include <sys/socket.h>
1222 WRAPPER2(int, sendmsg
, int s
, const void *msg
, int flags
)
1224 TRACE ("%s\n", __PRETTY_FUNCTION__
);
1225 MF_VALIDATE_EXTENT (msg
, sizeof (*msg
), __MF_CHECK_READ
, "sendmsg msg");
1226 return sendmsg (s
, msg
, flags
);
1230 #ifdef WRAP_setsockopt
1231 #include <sys/socket.h>
1232 WRAPPER2(int, setsockopt
, int s
, int level
, int optname
, const void *optval
,
1235 TRACE ("%s\n", __PRETTY_FUNCTION__
);
1236 MF_VALIDATE_EXTENT (optval
, (size_t)optlen
, __MF_CHECK_READ
,
1237 "setsockopt optval");
1238 return setsockopt (s
, level
, optname
, optval
, optlen
);
1242 #ifdef WRAP_getsockopt
1243 #include <sys/socket.h>
1244 WRAPPER2(int, getsockopt
, int s
, int level
, int optname
, void *optval
,
1247 TRACE ("%s\n", __PRETTY_FUNCTION__
);
1248 MF_VALIDATE_EXTENT (optval
, (size_t)*optlen
, __MF_CHECK_WRITE
,
1249 "getsockopt optval");
1250 return getsockopt (s
, level
, optname
, optval
, optlen
);
1255 #include <sys/socket.h>
1256 WRAPPER2(int, accept
, int s
, struct sockaddr
*addr
, socklen_t
*addrlen
)
1258 TRACE ("%s\n", __PRETTY_FUNCTION__
);
1259 MF_VALIDATE_EXTENT (addr
, (size_t)*addrlen
, __MF_CHECK_WRITE
, "accept addr");
1260 return accept (s
, addr
, addrlen
);
1265 #include <sys/socket.h>
1266 WRAPPER2(int, bind
, int sockfd
, struct sockaddr
*addr
, socklen_t addrlen
)
1268 TRACE ("%s\n", __PRETTY_FUNCTION__
);
1269 MF_VALIDATE_EXTENT (addr
, (size_t)addrlen
, __MF_CHECK_WRITE
, "bind addr");
1270 return bind (sockfd
, addr
, addrlen
);
1275 #include <sys/socket.h>
1276 WRAPPER2(int, connect
, int sockfd
, const struct sockaddr
*addr
,
1279 TRACE ("%s\n", __PRETTY_FUNCTION__
);
1280 MF_VALIDATE_EXTENT (addr
, (size_t)addrlen
, __MF_CHECK_READ
,
1282 return connect (sockfd
, addr
, addrlen
);
1286 #ifdef WRAP_gethostname
1287 WRAPPER2(int, gethostname
, char *name
, size_t len
)
1289 TRACE ("%s\n", __PRETTY_FUNCTION__
);
1290 MF_VALIDATE_EXTENT (name
, len
, __MF_CHECK_WRITE
, "gethostname name");
1291 return gethostname (name
, len
);
1295 #ifdef WRAP_sethostname
1296 WRAPPER2(int, sethostname
, const char *name
, size_t len
)
1298 TRACE ("%s\n", __PRETTY_FUNCTION__
);
1299 MF_VALIDATE_EXTENT (name
, len
, __MF_CHECK_READ
, "sethostname name");
1300 return sethostname (name
, len
);
1304 #ifdef WRAP_gethostbyname
1306 WRAPPER2(struct hostent
*, gethostbyname
, const char *name
)
1313 TRACE ("%s\n", __PRETTY_FUNCTION__
);
1315 MF_VALIDATE_EXTENT (name
, CLAMPADD(n
, 1), __MF_CHECK_READ
,
1316 "gethostbyname name");
1317 p
= gethostbyname (name
);
1319 #ifdef MF_REGISTER_gethostbyname
1320 __mf_register (p
, sizeof (*p
), MF_REGISTER_gethostbyname
,
1321 "gethostbyname result");
1323 MF_VALIDATE_EXTENT (p
, sizeof (*p
), __MF_CHECK_WRITE
,
1324 "gethostbyname result");
1325 if (NULL
!= (s
= p
->h_name
)) {
1328 #ifdef MF_REGISTER_gethostbyname_items
1329 __mf_register (s
, n
, MF_REGISTER_gethostbyname_items
,
1330 "gethostbyname result->h_name");
1332 MF_VALIDATE_EXTENT (s
, n
, __MF_CHECK_WRITE
,
1333 "gethostbyname result->h_name");
1336 if (NULL
!= (ss
= p
->h_aliases
)) {
1337 for (nreg
= 1;; ++nreg
) {
1343 #ifdef MF_REGISTER_gethostbyname_items
1344 __mf_register (s
, n
, MF_REGISTER_gethostbyname_items
,
1345 "gethostbyname result->h_aliases[]");
1347 MF_VALIDATE_EXTENT (s
, n
, __MF_CHECK_WRITE
,
1348 "gethostbyname result->h_aliases[]");
1350 nreg
*= sizeof (*p
->h_aliases
);
1351 #ifdef MF_REGISTER_gethostbyname_items
1352 __mf_register (p
->h_aliases
, nreg
, MF_REGISTER_gethostbyname_items
,
1353 "gethostbyname result->h_aliases");
1355 MF_VALIDATE_EXTENT (p
->h_aliases
, nreg
, __MF_CHECK_WRITE
,
1356 "gethostbyname result->h_aliases");
1359 if (NULL
!= (ss
= p
->h_addr_list
)) {
1360 for (nreg
= 1;; ++nreg
) {
1364 #ifdef MF_REGISTER_gethostbyname_items
1365 __mf_register (s
, p
->h_length
, MF_REGISTER_gethostbyname_items
,
1366 "gethostbyname result->h_addr_list[]");
1368 MF_VALIDATE_EXTENT (s
, p
->h_length
, __MF_CHECK_WRITE
,
1369 "gethostbyname result->h_addr_list[]");
1371 nreg
*= sizeof (*p
->h_addr_list
);
1372 #ifdef MF_REGISTER_gethostbyname_items
1373 __mf_register (p
->h_addr_list
, nreg
, MF_REGISTER_gethostbyname_items
,
1374 "gethostbyname result->h_addr_list");
1376 MF_VALIDATE_EXTENT (p
->h_addr_list
, nreg
, __MF_CHECK_WRITE
,
1377 "gethostbyname result->h_addr_list");
1385 #include <sys/wait.h>
1386 WRAPPER2(pid_t
, wait
, int *status
)
1388 TRACE ("%s\n", __PRETTY_FUNCTION__
);
1390 MF_VALIDATE_EXTENT (status
, sizeof (*status
), __MF_CHECK_WRITE
,
1392 return wait (status
);
1397 #include <sys/wait.h>
1398 WRAPPER2(pid_t
, waitpid
, pid_t pid
, int *status
, int options
)
1400 TRACE ("%s\n", __PRETTY_FUNCTION__
);
1402 MF_VALIDATE_EXTENT (status
, sizeof (*status
), __MF_CHECK_WRITE
,
1404 return waitpid (pid
, status
, options
);
1409 WRAPPER2(FILE *, popen
, const char *command
, const char *mode
)
1413 TRACE ("%s\n", __PRETTY_FUNCTION__
);
1415 n
= strlen (command
);
1416 MF_VALIDATE_EXTENT (command
, CLAMPADD(n
, 1), __MF_CHECK_READ
, "popen path");
1419 MF_VALIDATE_EXTENT (mode
, CLAMPADD(n
, 1), __MF_CHECK_READ
, "popen mode");
1421 p
= popen (command
, mode
);
1423 #ifdef MF_REGISTER_fopen
1424 __mf_register (p
, sizeof (*p
), MF_REGISTER_fopen
, "popen result");
1426 MF_VALIDATE_EXTENT (p
, sizeof (*p
), __MF_CHECK_WRITE
, "popen result");
1433 WRAPPER2(int, pclose
, FILE *stream
)
1436 TRACE ("%s\n", __PRETTY_FUNCTION__
);
1437 MF_VALIDATE_EXTENT (stream
, sizeof (*stream
), __MF_CHECK_WRITE
,
1439 resp
= pclose (stream
);
1440 #ifdef MF_REGISTER_fopen
1441 __mf_unregister (stream
, sizeof (*stream
));
1448 WRAPPER2(int, execve
, const char *path
, char *const argv
[],
1454 TRACE ("%s\n", __PRETTY_FUNCTION__
);
1457 MF_VALIDATE_EXTENT (path
, CLAMPADD(n
, 1), __MF_CHECK_READ
, "execve path");
1460 MF_VALIDATE_EXTENT (p
, sizeof (*p
), __MF_CHECK_READ
, "execve *argv");
1465 MF_VALIDATE_EXTENT (s
, CLAMPADD(n
, 1), __MF_CHECK_READ
, "execve **argv");
1469 MF_VALIDATE_EXTENT (p
, sizeof (*p
), __MF_CHECK_READ
, "execve *envp");
1474 MF_VALIDATE_EXTENT (s
, CLAMPADD(n
, 1), __MF_CHECK_READ
, "execve **envp");
1476 return execve (path
, argv
, envp
);
1481 WRAPPER2(int, execv
, const char *path
, char *const argv
[])
1486 TRACE ("%s\n", __PRETTY_FUNCTION__
);
1489 MF_VALIDATE_EXTENT (path
, CLAMPADD(n
, 1), __MF_CHECK_READ
, "execv path");
1492 MF_VALIDATE_EXTENT (p
, sizeof (*p
), __MF_CHECK_READ
, "execv *argv");
1497 MF_VALIDATE_EXTENT (s
, CLAMPADD(n
, 1), __MF_CHECK_READ
, "execv **argv");
1499 return execv (path
, argv
);
1504 WRAPPER2(int, execvp
, const char *path
, char *const argv
[])
1509 TRACE ("%s\n", __PRETTY_FUNCTION__
);
1512 MF_VALIDATE_EXTENT (path
, CLAMPADD(n
, 1), __MF_CHECK_READ
, "execvp path");
1515 MF_VALIDATE_EXTENT (p
, sizeof (*p
), __MF_CHECK_READ
, "execvp *argv");
1520 MF_VALIDATE_EXTENT (s
, CLAMPADD(n
, 1), __MF_CHECK_READ
, "execvp **argv");
1522 return execvp (path
, argv
);
1527 WRAPPER2(int, system
, const char *string
)
1530 TRACE ("%s\n", __PRETTY_FUNCTION__
);
1531 n
= strlen (string
);
1532 MF_VALIDATE_EXTENT (string
, CLAMPADD(n
, 1), __MF_CHECK_READ
,
1534 return system (string
);
1539 WRAPPER2(void *, dlopen
, const char *path
, int flags
)
1543 TRACE ("%s\n", __PRETTY_FUNCTION__
);
1545 MF_VALIDATE_EXTENT (path
, CLAMPADD(n
, 1), __MF_CHECK_READ
, "dlopen path");
1546 p
= dlopen (path
, flags
);
1548 #ifdef MF_REGISTER_dlopen
1549 __mf_register (p
, 0, MF_REGISTER_dlopen
, "dlopen result");
1551 MF_VALIDATE_EXTENT (p
, 0, __MF_CHECK_WRITE
, "dlopen result");
1558 WRAPPER2(int, dlclose
, void *handle
)
1561 TRACE ("%s\n", __PRETTY_FUNCTION__
);
1562 MF_VALIDATE_EXTENT (handle
, 0, __MF_CHECK_READ
, "dlclose handle");
1563 resp
= dlclose (handle
);
1564 #ifdef MF_REGISTER_dlopen
1565 __mf_unregister (handle
, 0);
1572 WRAPPER2(char *, dlerror
)
1575 TRACE ("%s\n", __PRETTY_FUNCTION__
);
1581 #ifdef MF_REGISTER_dlerror
1582 __mf_register (p
, n
, MF_REGISTER_dlerror
, "dlerror result");
1584 MF_VALIDATE_EXTENT (p
, n
, __MF_CHECK_WRITE
, "dlerror result");
1591 WRAPPER2(void *, dlsym
, void *handle
, char *symbol
)
1595 TRACE ("%s\n", __PRETTY_FUNCTION__
);
1596 MF_VALIDATE_EXTENT (handle
, 0, __MF_CHECK_READ
, "dlsym handle");
1597 n
= strlen (symbol
);
1598 MF_VALIDATE_EXTENT (symbol
, CLAMPADD(n
, 1), __MF_CHECK_READ
, "dlsym symbol");
1599 p
= dlsym (handle
, symbol
);
1601 #ifdef MF_REGISTER_dlsym
1602 __mf_register (p
, 0, MF_REGISTER_dlsym
, "dlsym result");
1604 MF_VALIDATE_EXTENT (p
, 0, __MF_CHECK_WRITE
, "dlsym result");
1611 #include <sys/ipc.h>
1612 #include <sys/sem.h>
1613 WRAPPER2(int, semop
, int semid
, struct sembuf
*sops
, unsigned nsops
)
1615 TRACE ("%s\n", __PRETTY_FUNCTION__
);
1616 MF_VALIDATE_EXTENT (sops
, sizeof (*sops
) * nsops
, __MF_CHECK_READ
,
1618 return semop (semid
, sops
, nsops
);
1623 #include <sys/ipc.h>
1624 #include <sys/sem.h>
1625 #ifndef HAVE_UNION_SEMUN
1627 int val
; /* value for SETVAL */
1628 struct semid_ds
*buf
; /* buffer for IPC_STAT, IPC_SET */
1629 unsigned short int *array
; /* array for GETALL, SETALL */
1630 struct seminfo
*__buf
; /* buffer for IPC_INFO */
1633 WRAPPER2(int, semctl
, int semid
, int semnum
, int cmd
, union semun arg
)
1635 TRACE ("%s\n", __PRETTY_FUNCTION__
);
1638 MF_VALIDATE_EXTENT (arg
.buf
, sizeof (*arg
.buf
), __MF_CHECK_WRITE
,
1642 MF_VALIDATE_EXTENT (arg
.buf
, sizeof (*arg
.buf
), __MF_CHECK_READ
,
1646 MF_VALIDATE_EXTENT (arg
.array
, sizeof (*arg
.array
), __MF_CHECK_WRITE
,
1649 MF_VALIDATE_EXTENT (arg
.array
, sizeof (*arg
.array
), __MF_CHECK_READ
,
1654 MF_VALIDATE_EXTENT (arg
.__buf
, sizeof (*arg
.__buf
), __MF_CHECK_WRITE
,
1661 return semctl (semid
, semnum
, cmd
, arg
);
1666 #include <sys/ipc.h>
1667 #include <sys/shm.h>
1668 WRAPPER2(int, shmctl
, int shmid
, int cmd
, struct shmid_ds
*buf
)
1670 TRACE ("%s\n", __PRETTY_FUNCTION__
);
1673 MF_VALIDATE_EXTENT (buf
, sizeof (*buf
), __MF_CHECK_WRITE
,
1677 MF_VALIDATE_EXTENT (buf
, sizeof (*buf
), __MF_CHECK_READ
,
1683 return shmctl (shmid
, cmd
, buf
);
1688 #include <sys/ipc.h>
1689 #include <sys/shm.h>
1690 WRAPPER2(void *, shmat
, int shmid
, const void *shmaddr
, int shmflg
)
1693 TRACE ("%s\n", __PRETTY_FUNCTION__
);
1694 p
= shmat (shmid
, shmaddr
, shmflg
);
1695 #ifdef MF_REGISTER_shmat
1697 struct shmid_ds buf
;
1698 __mf_register (p
, shmctl (shmid
, IPC_STAT
, &buf
) ? 0 : buf
.shm_segsz
,
1699 MF_REGISTER_shmat
, "shmat result");
1707 #include <sys/ipc.h>
1708 #include <sys/shm.h>
1709 WRAPPER2(int, shmdt
, const void *shmaddr
)
1712 TRACE ("%s\n", __PRETTY_FUNCTION__
);
1713 resp
= shmdt (shmaddr
);
1714 #ifdef MF_REGISTER_shmat
1715 __mf_unregister ((void *)shmaddr
, 0);