1 /* Mudflap: narrow-pointer bounds-checking by tree rewriting.
2 Copyright (C) 2002, 2003, 2004 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.
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 2, or (at your option) any later
13 In addition to the permissions in the GNU General Public License, the
14 Free Software Foundation gives you unlimited permission to link the
15 compiled version of this file into combinations with other programs,
16 and to distribute those combinations without any restriction coming
17 from the use of this file. (The General Public License restrictions
18 do apply in other respects; for example, they cover modification of
19 the file, and distribution when not linked into a combine
22 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
23 WARRANTY; without even the implied warranty of MERCHANTABILITY or
24 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
27 You should have received a copy of the GNU General Public License
28 along with GCC; see the file COPYING. If not, write to the Free
29 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
35 #ifndef HAVE_SOCKLEN_T
39 /* These attempt to coax various unix flavours to declare all our
40 needed tidbits in the system headers. */
41 #if !defined(__FreeBSD__) && !defined(__APPLE__)
43 #endif /* Some BSDs break <sys/socket.h> if this is defined. */
47 #define __EXTENSIONS__
49 #define _LARGE_FILE_API
50 #define _LARGEFILE64_SOURCE
51 #define _XOPEN_SOURCE_EXTENDED 1
60 #include <sys/types.h>
67 #ifdef HAVE_SYS_SOCKET_H
68 #include <sys/socket.h>
73 #ifdef HAVE_SYS_WAIT_H
87 #include "mf-runtime.h"
91 #error "Do not compile this file with -fmudflap!"
95 /* A bunch of independent stdlib/unistd hook functions, all
96 intercepted by mf-runtime.h macros. */
99 static inline size_t (strnlen) (const char* str, size_t n)
103 for (s = str; n && *s; ++s, --n)
112 WRAPPER2(void *, memcpy, void *dest, const void *src, size_t n)
114 TRACE ("%s\n", __PRETTY_FUNCTION__);
115 MF_VALIDATE_EXTENT(src, n, __MF_CHECK_READ, "memcpy source");
116 MF_VALIDATE_EXTENT(dest, n, __MF_CHECK_WRITE, "memcpy dest");
117 return memcpy (dest, src, n);
121 WRAPPER2(void *, memmove, void *dest, const void *src, size_t n)
123 TRACE ("%s\n", __PRETTY_FUNCTION__);
124 MF_VALIDATE_EXTENT(src, n, __MF_CHECK_READ, "memmove src");
125 MF_VALIDATE_EXTENT(dest, n, __MF_CHECK_WRITE, "memmove dest");
126 return memmove (dest, src, n);
130 WRAPPER2(void *, memset, void *s, int c, size_t n)
132 TRACE ("%s\n", __PRETTY_FUNCTION__);
133 MF_VALIDATE_EXTENT(s, n, __MF_CHECK_WRITE, "memset dest");
134 return memset (s, c, n);
138 WRAPPER2(int, memcmp, const void *s1, const void *s2, size_t n)
140 TRACE ("%s\n", __PRETTY_FUNCTION__);
141 MF_VALIDATE_EXTENT(s1, n, __MF_CHECK_READ, "memcmp 1st arg");
142 MF_VALIDATE_EXTENT(s2, n, __MF_CHECK_READ, "memcmp 2nd arg");
143 return memcmp (s1, s2, n);
147 WRAPPER2(void *, memchr, const void *s, int c, size_t n)
149 TRACE ("%s\n", __PRETTY_FUNCTION__);
150 MF_VALIDATE_EXTENT(s, n, __MF_CHECK_READ, "memchr region");
151 return memchr (s, c, n);
156 WRAPPER2(void *, memrchr, const void *s, int c, size_t n)
158 TRACE ("%s\n", __PRETTY_FUNCTION__);
159 MF_VALIDATE_EXTENT(s, n, __MF_CHECK_READ, "memrchr region");
160 return memrchr (s, c, n);
165 WRAPPER2(char *, strcpy, char *dest, const char *src)
167 /* nb: just because strlen(src) == n doesn't mean (src + n) or (src + n +
168 1) are valid pointers. the allocated object might have size < n.
171 size_t n = strlen (src);
172 TRACE ("%s\n", __PRETTY_FUNCTION__);
173 MF_VALIDATE_EXTENT(src, CLAMPADD(n, 1), __MF_CHECK_READ, "strcpy src");
174 MF_VALIDATE_EXTENT(dest, CLAMPADD(n, 1), __MF_CHECK_WRITE, "strcpy dest");
175 return strcpy (dest, src);
180 WRAPPER2(char *, strncpy, char *dest, const char *src, size_t n)
182 size_t len = strnlen (src, n);
183 TRACE ("%s\n", __PRETTY_FUNCTION__);
184 MF_VALIDATE_EXTENT(src, len, __MF_CHECK_READ, "strncpy src");
185 MF_VALIDATE_EXTENT(dest, len, __MF_CHECK_WRITE, "strncpy dest"); /* nb: strNcpy */
186 return strncpy (dest, src, n);
191 WRAPPER2(char *, strcat, char *dest, const char *src)
195 TRACE ("%s\n", __PRETTY_FUNCTION__);
196 dest_sz = strlen (dest);
197 src_sz = strlen (src);
198 MF_VALIDATE_EXTENT(src, CLAMPADD(src_sz, 1), __MF_CHECK_READ, "strcat src");
199 MF_VALIDATE_EXTENT(dest, CLAMPADD(dest_sz, CLAMPADD(src_sz, 1)),
200 __MF_CHECK_WRITE, "strcat dest");
201 return strcat (dest, src);
205 WRAPPER2(char *, strncat, char *dest, const char *src, size_t n)
208 /* nb: validating the extents (s,n) might be a mistake for two reasons.
210 (1) the string s might be shorter than n chars, and n is just a
211 poor choice by the programmer. this is not a "true" error in the
212 sense that the call to strncat would still be ok.
214 (2) we could try to compensate for case (1) by calling strlen(s) and
215 using that as a bound for the extent to verify, but strlen might fall off
216 the end of a non-terminated string, leading to a false positive.
218 so we will call strnlen(s,n) and use that as a bound.
220 if strnlen returns a length beyond the end of the registered extent
221 associated with s, there is an error: the programmer's estimate for n is
222 too large _AND_ the string s is unterminated, in which case they'd be
223 about to touch memory they don't own while calling strncat.
225 this same logic applies to further uses of strnlen later down in this
230 TRACE ("%s\n", __PRETTY_FUNCTION__);
231 src_sz = strnlen (src, n);
232 dest_sz = strnlen (dest, n);
233 MF_VALIDATE_EXTENT(src, src_sz, __MF_CHECK_READ, "strncat src");
234 MF_VALIDATE_EXTENT(dest, (CLAMPADD(dest_sz, CLAMPADD(src_sz, 1))),
235 __MF_CHECK_WRITE, "strncat dest");
236 return strncat (dest, src, n);
240 WRAPPER2(int, strcmp, const char *s1, const char *s2)
244 TRACE ("%s\n", __PRETTY_FUNCTION__);
247 MF_VALIDATE_EXTENT(s1, CLAMPADD(s1_sz, 1), __MF_CHECK_READ, "strcmp 1st arg");
248 MF_VALIDATE_EXTENT(s2, CLAMPADD(s2_sz, 1), __MF_CHECK_WRITE, "strcmp 2nd arg");
249 return strcmp (s1, s2);
253 WRAPPER2(int, strcasecmp, const char *s1, const char *s2)
257 TRACE ("%s\n", __PRETTY_FUNCTION__);
260 MF_VALIDATE_EXTENT(s1, CLAMPADD(s1_sz, 1), __MF_CHECK_READ, "strcasecmp 1st arg");
261 MF_VALIDATE_EXTENT(s2, CLAMPADD(s2_sz, 1), __MF_CHECK_READ, "strcasecmp 2nd arg");
262 return strcasecmp (s1, s2);
266 WRAPPER2(int, strncmp, const char *s1, const char *s2, size_t n)
270 TRACE ("%s\n", __PRETTY_FUNCTION__);
271 s1_sz = strnlen (s1, n);
272 s2_sz = strnlen (s2, n);
273 MF_VALIDATE_EXTENT(s1, s1_sz, __MF_CHECK_READ, "strncmp 1st arg");
274 MF_VALIDATE_EXTENT(s2, s2_sz, __MF_CHECK_READ, "strncmp 2nd arg");
275 return strncmp (s1, s2, n);
279 WRAPPER2(int, strncasecmp, const char *s1, const char *s2, size_t n)
283 TRACE ("%s\n", __PRETTY_FUNCTION__);
284 s1_sz = strnlen (s1, n);
285 s2_sz = strnlen (s2, n);
286 MF_VALIDATE_EXTENT(s1, s1_sz, __MF_CHECK_READ, "strncasecmp 1st arg");
287 MF_VALIDATE_EXTENT(s2, s2_sz, __MF_CHECK_READ, "strncasecmp 2nd arg");
288 return strncasecmp (s1, s2, n);
292 WRAPPER2(char *, strdup, const char *s)
294 DECLARE(void *, malloc, size_t sz);
296 size_t n = strlen (s);
297 TRACE ("%s\n", __PRETTY_FUNCTION__);
298 MF_VALIDATE_EXTENT(s, CLAMPADD(n,1), __MF_CHECK_READ, "strdup region");
299 result = (char *)CALL_REAL(malloc,
300 CLAMPADD(CLAMPADD(n,1),
301 CLAMPADD(__mf_opts.crumple_zone,
302 __mf_opts.crumple_zone)));
304 if (UNLIKELY(! result)) return result;
306 result += __mf_opts.crumple_zone;
307 memcpy (result, s, n);
310 __mf_register (result, CLAMPADD(n,1), __MF_TYPE_HEAP_I, "strdup region");
315 WRAPPER2(char *, strndup, const char *s, size_t n)
317 DECLARE(void *, malloc, size_t sz);
319 size_t sz = strnlen (s, n);
320 TRACE ("%s\n", __PRETTY_FUNCTION__);
321 MF_VALIDATE_EXTENT(s, sz, __MF_CHECK_READ, "strndup region"); /* nb: strNdup */
323 /* note: strndup still adds a \0, even with the N limit! */
324 result = (char *)CALL_REAL(malloc,
325 CLAMPADD(CLAMPADD(n,1),
326 CLAMPADD(__mf_opts.crumple_zone,
327 __mf_opts.crumple_zone)));
329 if (UNLIKELY(! result)) return result;
331 result += __mf_opts.crumple_zone;
332 memcpy (result, s, n);
335 __mf_register (result, CLAMPADD(n,1), __MF_TYPE_HEAP_I, "strndup region");
340 WRAPPER2(char *, strchr, const char *s, int c)
343 TRACE ("%s\n", __PRETTY_FUNCTION__);
345 MF_VALIDATE_EXTENT(s, CLAMPADD(n,1), __MF_CHECK_READ, "strchr region");
346 return strchr (s, c);
350 WRAPPER2(char *, strrchr, const char *s, int c)
353 TRACE ("%s\n", __PRETTY_FUNCTION__);
355 MF_VALIDATE_EXTENT(s, CLAMPADD(n,1), __MF_CHECK_READ, "strrchr region");
356 return strrchr (s, c);
360 WRAPPER2(char *, strstr, const char *haystack, const char *needle)
364 TRACE ("%s\n", __PRETTY_FUNCTION__);
365 haystack_sz = strlen (haystack);
366 needle_sz = strlen (needle);
367 MF_VALIDATE_EXTENT(haystack, CLAMPADD(haystack_sz, 1), __MF_CHECK_READ, "strstr haystack");
368 MF_VALIDATE_EXTENT(needle, CLAMPADD(needle_sz, 1), __MF_CHECK_READ, "strstr needle");
369 return strstr (haystack, needle);
374 WRAPPER2(void *, memmem,
375 const void *haystack, size_t haystacklen,
376 const void *needle, size_t needlelen)
378 TRACE ("%s\n", __PRETTY_FUNCTION__);
379 MF_VALIDATE_EXTENT(haystack, haystacklen, __MF_CHECK_READ, "memmem haystack");
380 MF_VALIDATE_EXTENT(needle, needlelen, __MF_CHECK_READ, "memmem needle");
381 return memmem (haystack, haystacklen, needle, needlelen);
386 WRAPPER2(size_t, strlen, const char *s)
388 size_t result = strlen (s);
389 TRACE ("%s\n", __PRETTY_FUNCTION__);
390 MF_VALIDATE_EXTENT(s, CLAMPADD(result, 1), __MF_CHECK_READ, "strlen region");
395 WRAPPER2(size_t, strnlen, const char *s, size_t n)
397 size_t result = strnlen (s, n);
398 TRACE ("%s\n", __PRETTY_FUNCTION__);
399 MF_VALIDATE_EXTENT(s, result, __MF_CHECK_READ, "strnlen region");
404 WRAPPER2(void, bzero, void *s, size_t n)
406 TRACE ("%s\n", __PRETTY_FUNCTION__);
407 MF_VALIDATE_EXTENT(s, n, __MF_CHECK_WRITE, "bzero region");
413 WRAPPER2(void, bcopy, const void *src, void *dest, size_t n)
415 TRACE ("%s\n", __PRETTY_FUNCTION__);
416 MF_VALIDATE_EXTENT(src, n, __MF_CHECK_READ, "bcopy src");
417 MF_VALIDATE_EXTENT(dest, n, __MF_CHECK_WRITE, "bcopy dest");
418 bcopy (src, dest, n);
423 WRAPPER2(int, bcmp, const void *s1, const void *s2, size_t n)
425 TRACE ("%s\n", __PRETTY_FUNCTION__);
426 MF_VALIDATE_EXTENT(s1, n, __MF_CHECK_READ, "bcmp 1st arg");
427 MF_VALIDATE_EXTENT(s2, n, __MF_CHECK_READ, "bcmp 2nd arg");
428 return bcmp (s1, s2, n);
432 WRAPPER2(char *, index, const char *s, int c)
434 size_t n = strlen (s);
435 TRACE ("%s\n", __PRETTY_FUNCTION__);
436 MF_VALIDATE_EXTENT(s, CLAMPADD(n, 1), __MF_CHECK_READ, "index region");
441 WRAPPER2(char *, rindex, const char *s, int c)
443 size_t n = strlen (s);
444 TRACE ("%s\n", __PRETTY_FUNCTION__);
445 MF_VALIDATE_EXTENT(s, CLAMPADD(n, 1), __MF_CHECK_READ, "rindex region");
446 return rindex (s, c);
449 /* XXX: stpcpy, memccpy */
451 /* XXX: *printf,*scanf */
453 /* XXX: setjmp, longjmp */
455 WRAPPER2(char *, asctime, struct tm *tm)
457 static char *reg_result = NULL;
459 TRACE ("%s\n", __PRETTY_FUNCTION__);
460 MF_VALIDATE_EXTENT(tm, sizeof (struct tm), __MF_CHECK_READ, "asctime tm");
461 result = asctime (tm);
462 if (reg_result == NULL)
464 __mf_register (result, strlen (result)+1, __MF_TYPE_STATIC, "asctime string");
471 WRAPPER2(char *, ctime, const time_t *timep)
473 static char *reg_result = NULL;
475 TRACE ("%s\n", __PRETTY_FUNCTION__);
476 MF_VALIDATE_EXTENT(timep, sizeof (time_t), __MF_CHECK_READ, "ctime time");
477 result = ctime (timep);
478 if (reg_result == NULL)
480 /* XXX: what if asctime and ctime return the same static ptr? */
481 __mf_register (result, strlen (result)+1, __MF_TYPE_STATIC, "ctime string");
488 WRAPPER2(struct tm*, localtime, const time_t *timep)
490 static struct tm *reg_result = NULL;
492 TRACE ("%s\n", __PRETTY_FUNCTION__);
493 MF_VALIDATE_EXTENT(timep, sizeof (time_t), __MF_CHECK_READ, "localtime time");
494 result = localtime (timep);
495 if (reg_result == NULL)
497 __mf_register (result, sizeof (struct tm), __MF_TYPE_STATIC, "localtime tm");
504 WRAPPER2(struct tm*, gmtime, const time_t *timep)
506 static struct tm *reg_result = NULL;
508 TRACE ("%s\n", __PRETTY_FUNCTION__);
509 MF_VALIDATE_EXTENT(timep, sizeof (time_t), __MF_CHECK_READ, "gmtime time");
510 result = gmtime (timep);
511 if (reg_result == NULL)
513 __mf_register (result, sizeof (struct tm), __MF_TYPE_STATIC, "gmtime tm");
522 /* The following indicate if the result of the corresponding function
523 * should be explicitly un/registered by the wrapper
525 #define MF_REGISTER_strerror __MF_TYPE_STATIC
526 #undef MF_REGISTER_fopen
527 #define MF_RESULT_SIZE_fopen (sizeof (FILE))
528 #undef MF_REGISTER_opendir
529 #define MF_RESULT_SIZE_opendir 0 /* (sizeof (DIR)) */
530 #undef MF_REGISTER_readdir
531 #define MF_REGISTER_gethostbyname __MF_TYPE_STATIC
532 #undef MF_REGISTER_gethostbyname_items
533 #undef MF_REGISTER_dlopen
534 #undef MF_REGISTER_dlerror
535 #undef MF_REGISTER_dlsym
536 #define MF_REGISTER_shmat __MF_TYPE_GUESS
540 WRAPPER2(time_t, time, time_t *timep)
542 TRACE ("%s\n", __PRETTY_FUNCTION__);
544 MF_VALIDATE_EXTENT (timep, sizeof (*timep), __MF_CHECK_WRITE,
550 WRAPPER2(char *, strerror, int errnum)
554 TRACE ("%s\n", __PRETTY_FUNCTION__);
555 p = strerror (errnum);
559 #ifdef MF_REGISTER_strerror
560 __mf_register (p, n, MF_REGISTER_strerror, "strerror result");
562 MF_VALIDATE_EXTENT (p, n, __MF_CHECK_WRITE, "strerror result");
568 WRAPPER2(FILE *, fopen, const char *path, const char *mode)
572 TRACE ("%s\n", __PRETTY_FUNCTION__);
575 MF_VALIDATE_EXTENT (path, CLAMPADD(n, 1), __MF_CHECK_READ, "fopen path");
578 MF_VALIDATE_EXTENT (mode, CLAMPADD(n, 1), __MF_CHECK_READ, "fopen mode");
580 p = fopen (path, mode);
582 #ifdef MF_REGISTER_fopen
583 __mf_register (p, sizeof (*p), MF_REGISTER_fopen, "fopen result");
585 MF_VALIDATE_EXTENT (p, sizeof (*p), __MF_CHECK_WRITE, "fopen result");
593 WRAPPER2(FILE *, fopen64, const char *path, const char *mode)
597 TRACE ("%s\n", __PRETTY_FUNCTION__);
600 MF_VALIDATE_EXTENT (path, CLAMPADD(n, 1), __MF_CHECK_READ, "fopen64 path");
603 MF_VALIDATE_EXTENT (mode, CLAMPADD(n, 1), __MF_CHECK_READ, "fopen64 mode");
605 p = fopen64 (path, mode);
607 #ifdef MF_REGISTER_fopen
608 __mf_register (p, sizeof (*p), MF_REGISTER_fopen, "fopen64 result");
610 MF_VALIDATE_EXTENT (p, sizeof (*p), __MF_CHECK_WRITE, "fopen64 result");
618 WRAPPER2(int, fclose, FILE *stream)
621 TRACE ("%s\n", __PRETTY_FUNCTION__);
622 MF_VALIDATE_EXTENT (stream, sizeof (*stream), __MF_CHECK_WRITE,
624 resp = fclose (stream);
625 #ifdef MF_REGISTER_fopen
626 __mf_unregister (stream, sizeof (*stream));
633 WRAPPER2(size_t, fread, void *ptr, size_t size, size_t nmemb, FILE *stream)
635 TRACE ("%s\n", __PRETTY_FUNCTION__);
636 MF_VALIDATE_EXTENT (stream, sizeof (*stream), __MF_CHECK_WRITE,
638 MF_VALIDATE_EXTENT (ptr, size * nmemb, __MF_CHECK_WRITE, "fread buffer");
639 return fread (ptr, size, nmemb, stream);
643 WRAPPER2(size_t, fwrite, const void *ptr, size_t size, size_t nmemb,
646 TRACE ("%s\n", __PRETTY_FUNCTION__);
647 MF_VALIDATE_EXTENT (stream, sizeof (*stream), __MF_CHECK_WRITE,
649 MF_VALIDATE_EXTENT (ptr, size * nmemb, __MF_CHECK_READ, "fwrite buffer");
650 return fwrite (ptr, size, nmemb, stream);
654 WRAPPER2(int, fgetc, FILE *stream)
656 TRACE ("%s\n", __PRETTY_FUNCTION__);
657 MF_VALIDATE_EXTENT (stream, sizeof (*stream), __MF_CHECK_WRITE,
659 return fgetc (stream);
663 WRAPPER2(char *, fgets, char *s, int size, FILE *stream)
665 TRACE ("%s\n", __PRETTY_FUNCTION__);
666 MF_VALIDATE_EXTENT (stream, sizeof (*stream), __MF_CHECK_WRITE,
668 MF_VALIDATE_EXTENT (s, size, __MF_CHECK_WRITE, "fgets buffer");
669 return fgets (s, size, stream);
673 WRAPPER2(int, getc, FILE *stream)
675 TRACE ("%s\n", __PRETTY_FUNCTION__);
676 MF_VALIDATE_EXTENT (stream, sizeof (*stream), __MF_CHECK_WRITE,
678 return getc (stream);
682 WRAPPER2(char *, gets, char *s)
684 TRACE ("%s\n", __PRETTY_FUNCTION__);
685 MF_VALIDATE_EXTENT (s, 1, __MF_CHECK_WRITE, "gets buffer");
686 /* Avoid link-time warning... */
687 s = fgets (s, INT_MAX, stdin);
688 if (NULL != s) { /* better late than never */
689 size_t n = strlen (s);
690 MF_VALIDATE_EXTENT (s, CLAMPADD(n, 1), __MF_CHECK_WRITE, "gets buffer");
696 WRAPPER2(int, ungetc, int c, FILE *stream)
698 TRACE ("%s\n", __PRETTY_FUNCTION__);
699 MF_VALIDATE_EXTENT (stream, sizeof (*stream), __MF_CHECK_WRITE,
701 return ungetc (c, stream);
705 WRAPPER2(int, fputc, int c, FILE *stream)
707 TRACE ("%s\n", __PRETTY_FUNCTION__);
708 MF_VALIDATE_EXTENT (stream, sizeof (*stream), __MF_CHECK_WRITE,
710 return fputc (c, stream);
714 WRAPPER2(int, fputs, const char *s, FILE *stream)
717 TRACE ("%s\n", __PRETTY_FUNCTION__);
719 MF_VALIDATE_EXTENT (s, CLAMPADD(n, 1), __MF_CHECK_READ, "fputs buffer");
720 MF_VALIDATE_EXTENT (stream, sizeof (*stream), __MF_CHECK_WRITE,
722 return fputs (s, stream);
726 WRAPPER2(int, putc, int c, FILE *stream)
728 TRACE ("%s\n", __PRETTY_FUNCTION__);
729 MF_VALIDATE_EXTENT (stream, sizeof (*stream), __MF_CHECK_WRITE,
731 return putc (c, stream);
735 WRAPPER2(int, puts, const char *s)
738 TRACE ("%s\n", __PRETTY_FUNCTION__);
740 MF_VALIDATE_EXTENT (s, CLAMPADD(n, 1), __MF_CHECK_READ, "puts buffer");
745 WRAPPER2(void, clearerr, FILE *stream)
747 TRACE ("%s\n", __PRETTY_FUNCTION__);
748 MF_VALIDATE_EXTENT (stream, sizeof (*stream), __MF_CHECK_WRITE,
754 WRAPPER2(int, feof, FILE *stream)
756 TRACE ("%s\n", __PRETTY_FUNCTION__);
757 MF_VALIDATE_EXTENT (stream, sizeof (*stream), __MF_CHECK_WRITE,
759 return feof (stream);
763 WRAPPER2(int, ferror, FILE *stream)
765 TRACE ("%s\n", __PRETTY_FUNCTION__);
766 MF_VALIDATE_EXTENT (stream, sizeof (*stream), __MF_CHECK_WRITE,
768 return ferror (stream);
772 WRAPPER2(int, fileno, FILE *stream)
774 TRACE ("%s\n", __PRETTY_FUNCTION__);
775 MF_VALIDATE_EXTENT (stream, sizeof (*stream), __MF_CHECK_WRITE,
777 return fileno (stream);
781 WRAPPER2(int, printf, const char *format, ...)
786 TRACE ("%s\n", __PRETTY_FUNCTION__);
788 MF_VALIDATE_EXTENT (format, CLAMPADD(n, 1), __MF_CHECK_READ,
790 va_start (ap, format);
791 result = vprintf (format, ap);
797 WRAPPER2(int, fprintf, FILE *stream, const char *format, ...)
802 TRACE ("%s\n", __PRETTY_FUNCTION__);
803 MF_VALIDATE_EXTENT (stream, sizeof (*stream), __MF_CHECK_WRITE,
806 MF_VALIDATE_EXTENT (format, CLAMPADD(n, 1), __MF_CHECK_READ,
808 va_start (ap, format);
809 result = vfprintf (stream, format, ap);
815 WRAPPER2(int, sprintf, char *str, const char *format, ...)
820 TRACE ("%s\n", __PRETTY_FUNCTION__);
821 MF_VALIDATE_EXTENT (str, 1, __MF_CHECK_WRITE, "sprintf str");
823 MF_VALIDATE_EXTENT (format, CLAMPADD(n, 1), __MF_CHECK_READ,
825 va_start (ap, format);
826 result = vsprintf (str, format, ap);
829 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);
851 WRAPPER2(int, vprintf, const char *format, va_list ap)
854 TRACE ("%s\n", __PRETTY_FUNCTION__);
856 MF_VALIDATE_EXTENT (format, CLAMPADD(n, 1), __MF_CHECK_READ,
858 return vprintf (format, ap);
862 WRAPPER2(int, vfprintf, FILE *stream, const char *format, va_list ap)
865 TRACE ("%s\n", __PRETTY_FUNCTION__);
866 MF_VALIDATE_EXTENT (stream, sizeof (*stream), __MF_CHECK_WRITE,
869 MF_VALIDATE_EXTENT (format, CLAMPADD(n, 1), __MF_CHECK_READ,
871 return vfprintf (stream, format, ap);
875 WRAPPER2(int, vsprintf, char *str, const char *format, va_list ap)
879 TRACE ("%s\n", __PRETTY_FUNCTION__);
880 MF_VALIDATE_EXTENT (str, 1, __MF_CHECK_WRITE, "vsprintf str");
882 MF_VALIDATE_EXTENT (format, CLAMPADD(n, 1), __MF_CHECK_READ,
884 result = vsprintf (str, format, ap);
886 MF_VALIDATE_EXTENT (str, CLAMPADD(n, 1), __MF_CHECK_WRITE, "vsprintf str");
891 WRAPPER2(int, vsnprintf, char *str, size_t size, const char *format,
895 TRACE ("%s\n", __PRETTY_FUNCTION__);
896 MF_VALIDATE_EXTENT (str, size, __MF_CHECK_WRITE, "vsnprintf str");
898 MF_VALIDATE_EXTENT (format, CLAMPADD(n, 1), __MF_CHECK_READ,
900 return vsnprintf (str, size, format, ap);
904 WRAPPER2(int , access, const char *path, int mode)
907 TRACE ("%s\n", __PRETTY_FUNCTION__);
909 MF_VALIDATE_EXTENT (path, CLAMPADD(n, 1), __MF_CHECK_READ, "access path");
910 return access (path, mode);
914 WRAPPER2(int , remove, const char *path)
917 TRACE ("%s\n", __PRETTY_FUNCTION__);
919 MF_VALIDATE_EXTENT (path, CLAMPADD(n, 1), __MF_CHECK_READ, "remove path");
920 return remove (path);
924 WRAPPER2(int, fflush, FILE *stream)
926 TRACE ("%s\n", __PRETTY_FUNCTION__);
927 MF_VALIDATE_EXTENT (stream, sizeof (*stream), __MF_CHECK_WRITE,
929 return fflush (stream);
933 WRAPPER2(int, fseek, FILE *stream, long offset, int whence)
935 TRACE ("%s\n", __PRETTY_FUNCTION__);
936 MF_VALIDATE_EXTENT (stream, sizeof (*stream), __MF_CHECK_WRITE,
938 return fseek (stream, offset, whence);
943 WRAPPER2(int, fseeko64, FILE *stream, off64_t offset, int whence)
945 TRACE ("%s\n", __PRETTY_FUNCTION__);
946 MF_VALIDATE_EXTENT (stream, sizeof (*stream), __MF_CHECK_WRITE,
948 return fseeko64 (stream, offset, whence);
953 WRAPPER2(long, ftell, FILE *stream)
955 TRACE ("%s\n", __PRETTY_FUNCTION__);
956 MF_VALIDATE_EXTENT (stream, sizeof (*stream), __MF_CHECK_WRITE,
958 return ftell (stream);
963 WRAPPER2(off64_t, ftello64, FILE *stream)
965 TRACE ("%s\n", __PRETTY_FUNCTION__);
966 MF_VALIDATE_EXTENT (stream, sizeof (*stream), __MF_CHECK_WRITE,
968 return ftello64 (stream);
973 WRAPPER2(void, rewind, FILE *stream)
975 TRACE ("%s\n", __PRETTY_FUNCTION__);
976 MF_VALIDATE_EXTENT (stream, sizeof (*stream), __MF_CHECK_WRITE,
982 WRAPPER2(int, fgetpos, FILE *stream, fpos_t *pos)
984 TRACE ("%s\n", __PRETTY_FUNCTION__);
985 MF_VALIDATE_EXTENT (stream, sizeof (*stream), __MF_CHECK_WRITE,
987 MF_VALIDATE_EXTENT (pos, sizeof (*pos), __MF_CHECK_WRITE, "fgetpos pos");
988 return fgetpos (stream, pos);
992 WRAPPER2(int, fsetpos, FILE *stream, fpos_t *pos)
994 TRACE ("%s\n", __PRETTY_FUNCTION__);
995 MF_VALIDATE_EXTENT (stream, sizeof (*stream), __MF_CHECK_WRITE,
997 MF_VALIDATE_EXTENT (pos, sizeof (*pos), __MF_CHECK_READ, "fsetpos pos");
998 return fsetpos (stream, pos);
1002 WRAPPER2(int , stat, const char *path, struct stat *buf)
1005 TRACE ("%s\n", __PRETTY_FUNCTION__);
1007 MF_VALIDATE_EXTENT (path, CLAMPADD(n, 1), __MF_CHECK_READ, "stat path");
1008 MF_VALIDATE_EXTENT (buf, sizeof (*buf), __MF_CHECK_READ, "stat buf");
1009 return stat (path, buf);
1014 WRAPPER2(int , stat64, const char *path, struct stat64 *buf)
1017 TRACE ("%s\n", __PRETTY_FUNCTION__);
1019 MF_VALIDATE_EXTENT (path, CLAMPADD(n, 1), __MF_CHECK_READ, "stat64 path");
1020 MF_VALIDATE_EXTENT (buf, sizeof (*buf), __MF_CHECK_READ, "stat64 buf");
1021 return stat64 (path, buf);
1026 WRAPPER2(int , fstat, int filedes, struct stat *buf)
1028 TRACE ("%s\n", __PRETTY_FUNCTION__);
1029 MF_VALIDATE_EXTENT (buf, sizeof (*buf), __MF_CHECK_READ, "fstat buf");
1030 return fstat (filedes, buf);
1034 WRAPPER2(int , lstat, const char *path, struct stat *buf)
1037 TRACE ("%s\n", __PRETTY_FUNCTION__);
1039 MF_VALIDATE_EXTENT (path, CLAMPADD(n, 1), __MF_CHECK_READ, "lstat path");
1040 MF_VALIDATE_EXTENT (buf, sizeof (*buf), __MF_CHECK_READ, "lstat buf");
1041 return lstat (path, buf);
1045 WRAPPER2(int , mkfifo, const char *path, mode_t mode)
1048 TRACE ("%s\n", __PRETTY_FUNCTION__);
1050 MF_VALIDATE_EXTENT (path, CLAMPADD(n, 1), __MF_CHECK_READ, "mkfifo path");
1051 return mkfifo (path, mode);
1055 WRAPPER2(int, setvbuf, FILE *stream, char *buf, int mode , size_t size)
1057 TRACE ("%s\n", __PRETTY_FUNCTION__);
1058 MF_VALIDATE_EXTENT (stream, sizeof (*stream), __MF_CHECK_WRITE,
1061 MF_VALIDATE_EXTENT (buf, size, __MF_CHECK_READ, "setvbuf buf");
1062 return setvbuf (stream, buf, mode, size);
1066 WRAPPER2(void, setbuf, FILE *stream, char *buf)
1068 TRACE ("%s\n", __PRETTY_FUNCTION__);
1069 MF_VALIDATE_EXTENT (stream, sizeof (*stream), __MF_CHECK_WRITE,
1072 MF_VALIDATE_EXTENT (buf, BUFSIZ, __MF_CHECK_READ, "setbuf buf");
1073 setbuf (stream, buf);
1077 WRAPPER2(DIR *, opendir, const char *path)
1081 TRACE ("%s\n", __PRETTY_FUNCTION__);
1083 MF_VALIDATE_EXTENT (path, CLAMPADD(n, 1), __MF_CHECK_READ, "opendir path");
1087 #ifdef MF_REGISTER_opendir
1088 __mf_register (p, MF_RESULT_SIZE_opendir, MF_REGISTER_opendir,
1091 MF_VALIDATE_EXTENT (p, MF_RESULT_SIZE_opendir, __MF_CHECK_WRITE,
1098 WRAPPER2(int, closedir, DIR *dir)
1100 TRACE ("%s\n", __PRETTY_FUNCTION__);
1101 MF_VALIDATE_EXTENT (dir, 0, __MF_CHECK_WRITE, "closedir dir");
1102 #ifdef MF_REGISTER_opendir
1103 __mf_unregister (dir, MF_RESULT_SIZE_opendir);
1105 return closedir (dir);
1109 WRAPPER2(struct dirent *, readdir, DIR *dir)
1112 TRACE ("%s\n", __PRETTY_FUNCTION__);
1113 MF_VALIDATE_EXTENT (dir, 0, __MF_CHECK_READ, "readdir dir");
1116 #ifdef MF_REGISTER_readdir
1117 __mf_register (p, sizeof (*p), MF_REGISTER_readdir, "readdir result");
1119 MF_VALIDATE_EXTENT (p, sizeof (*p), __MF_CHECK_WRITE, "readdir result");
1125 #ifdef HAVE_SYS_SOCKET_H
1127 WRAPPER2(int, recv, int s, void *buf, size_t len, int flags)
1129 TRACE ("%s\n", __PRETTY_FUNCTION__);
1130 MF_VALIDATE_EXTENT (buf, len, __MF_CHECK_WRITE, "recv buf");
1131 return recv (s, buf, len, flags);
1135 WRAPPER2(int, recvfrom, int s, void *buf, size_t len, int flags,
1136 struct sockaddr *from, socklen_t *fromlen)
1138 TRACE ("%s\n", __PRETTY_FUNCTION__);
1139 MF_VALIDATE_EXTENT (buf, len, __MF_CHECK_WRITE, "recvfrom buf");
1140 MF_VALIDATE_EXTENT (from, (size_t)*fromlen, __MF_CHECK_WRITE,
1142 return recvfrom (s, buf, len, flags, from, fromlen);
1146 WRAPPER2(int, recvmsg, int s, struct msghdr *msg, int flags)
1148 TRACE ("%s\n", __PRETTY_FUNCTION__);
1149 MF_VALIDATE_EXTENT (msg, sizeof (*msg), __MF_CHECK_WRITE, "recvmsg msg");
1150 return recvmsg (s, msg, flags);
1154 WRAPPER2(int, send, int s, const void *msg, size_t len, int flags)
1156 TRACE ("%s\n", __PRETTY_FUNCTION__);
1157 MF_VALIDATE_EXTENT (msg, len, __MF_CHECK_READ, "send msg");
1158 return send (s, msg, len, flags);
1162 WRAPPER2(int, sendto, int s, const void *msg, size_t len, int flags,
1163 const struct sockaddr *to, socklen_t tolen)
1165 TRACE ("%s\n", __PRETTY_FUNCTION__);
1166 MF_VALIDATE_EXTENT (msg, len, __MF_CHECK_READ, "sendto msg");
1167 MF_VALIDATE_EXTENT (to, (size_t)tolen, __MF_CHECK_WRITE, "sendto to");
1168 return sendto (s, msg, len, flags, to, tolen);
1172 WRAPPER2(int, sendmsg, int s, const void *msg, int flags)
1174 TRACE ("%s\n", __PRETTY_FUNCTION__);
1175 MF_VALIDATE_EXTENT (msg, sizeof (*msg), __MF_CHECK_READ, "sendmsg msg");
1176 return sendmsg (s, msg, flags);
1180 WRAPPER2(int, setsockopt, int s, int level, int optname, const void *optval,
1183 TRACE ("%s\n", __PRETTY_FUNCTION__);
1184 MF_VALIDATE_EXTENT (optval, (size_t)optlen, __MF_CHECK_READ,
1185 "setsockopt optval");
1186 return setsockopt (s, level, optname, optval, optlen);
1190 WRAPPER2(int, getsockopt, int s, int level, int optname, void *optval,
1193 TRACE ("%s\n", __PRETTY_FUNCTION__);
1194 MF_VALIDATE_EXTENT (optval, (size_t)*optlen, __MF_CHECK_WRITE,
1195 "getsockopt optval");
1196 return getsockopt (s, level, optname, optval, optlen);
1200 WRAPPER2(int, accept, int s, struct sockaddr *addr, socklen_t *addrlen)
1202 TRACE ("%s\n", __PRETTY_FUNCTION__);
1203 MF_VALIDATE_EXTENT (addr, (size_t)*addrlen, __MF_CHECK_WRITE, "accept addr");
1204 return accept (s, addr, addrlen);
1208 WRAPPER2(int, bind, int sockfd, struct sockaddr *addr, socklen_t addrlen)
1210 TRACE ("%s\n", __PRETTY_FUNCTION__);
1211 MF_VALIDATE_EXTENT (addr, (size_t)addrlen, __MF_CHECK_WRITE, "bind addr");
1212 return bind (sockfd, addr, addrlen);
1216 WRAPPER2(int, connect, int sockfd, const struct sockaddr *addr,
1219 TRACE ("%s\n", __PRETTY_FUNCTION__);
1220 MF_VALIDATE_EXTENT (addr, (size_t)addrlen, __MF_CHECK_READ,
1222 return connect (sockfd, addr, addrlen);
1225 #endif /* HAVE_SYS_SOCKET_H */
1228 WRAPPER2(int, gethostname, char *name, size_t len)
1230 TRACE ("%s\n", __PRETTY_FUNCTION__);
1231 MF_VALIDATE_EXTENT (name, len, __MF_CHECK_WRITE, "gethostname name");
1232 return gethostname (name, len);
1236 #ifdef HAVE_SETHOSTNAME
1237 WRAPPER2(int, sethostname, const char *name, size_t len)
1239 TRACE ("%s\n", __PRETTY_FUNCTION__);
1240 MF_VALIDATE_EXTENT (name, len, __MF_CHECK_READ, "sethostname name");
1241 return sethostname (name, len);
1248 WRAPPER2(struct hostent *, gethostbyname, const char *name)
1255 TRACE ("%s\n", __PRETTY_FUNCTION__);
1257 MF_VALIDATE_EXTENT (name, CLAMPADD(n, 1), __MF_CHECK_READ,
1258 "gethostbyname name");
1259 p = gethostbyname (name);
1261 #ifdef MF_REGISTER_gethostbyname
1262 __mf_register (p, sizeof (*p), MF_REGISTER_gethostbyname,
1263 "gethostbyname result");
1265 MF_VALIDATE_EXTENT (p, sizeof (*p), __MF_CHECK_WRITE,
1266 "gethostbyname result");
1267 if (NULL != (s = p->h_name)) {
1270 #ifdef MF_REGISTER_gethostbyname_items
1271 __mf_register (s, n, MF_REGISTER_gethostbyname_items,
1272 "gethostbyname result->h_name");
1274 MF_VALIDATE_EXTENT (s, n, __MF_CHECK_WRITE,
1275 "gethostbyname result->h_name");
1278 if (NULL != (ss = p->h_aliases)) {
1279 for (nreg = 1;; ++nreg) {
1285 #ifdef MF_REGISTER_gethostbyname_items
1286 __mf_register (s, n, MF_REGISTER_gethostbyname_items,
1287 "gethostbyname result->h_aliases[]");
1289 MF_VALIDATE_EXTENT (s, n, __MF_CHECK_WRITE,
1290 "gethostbyname result->h_aliases[]");
1292 nreg *= sizeof (*p->h_aliases);
1293 #ifdef MF_REGISTER_gethostbyname_items
1294 __mf_register (p->h_aliases, nreg, MF_REGISTER_gethostbyname_items,
1295 "gethostbyname result->h_aliases");
1297 MF_VALIDATE_EXTENT (p->h_aliases, nreg, __MF_CHECK_WRITE,
1298 "gethostbyname result->h_aliases");
1301 if (NULL != (ss = p->h_addr_list)) {
1302 for (nreg = 1;; ++nreg) {
1306 #ifdef MF_REGISTER_gethostbyname_items
1307 __mf_register (s, p->h_length, MF_REGISTER_gethostbyname_items,
1308 "gethostbyname result->h_addr_list[]");
1310 MF_VALIDATE_EXTENT (s, p->h_length, __MF_CHECK_WRITE,
1311 "gethostbyname result->h_addr_list[]");
1313 nreg *= sizeof (*p->h_addr_list);
1314 #ifdef MF_REGISTER_gethostbyname_items
1315 __mf_register (p->h_addr_list, nreg, MF_REGISTER_gethostbyname_items,
1316 "gethostbyname result->h_addr_list");
1318 MF_VALIDATE_EXTENT (p->h_addr_list, nreg, __MF_CHECK_WRITE,
1319 "gethostbyname result->h_addr_list");
1325 #endif /* HAVE_NETDB_H */
1328 #ifdef HAVE_SYS_WAIT_H
1330 WRAPPER2(pid_t, wait, int *status)
1332 TRACE ("%s\n", __PRETTY_FUNCTION__);
1334 MF_VALIDATE_EXTENT (status, sizeof (*status), __MF_CHECK_WRITE,
1336 return wait (status);
1340 WRAPPER2(pid_t, waitpid, pid_t pid, int *status, int options)
1342 TRACE ("%s\n", __PRETTY_FUNCTION__);
1344 MF_VALIDATE_EXTENT (status, sizeof (*status), __MF_CHECK_WRITE,
1346 return waitpid (pid, status, options);
1349 #endif /* HAVE_SYS_WAIT_H */
1352 WRAPPER2(FILE *, popen, const char *command, const char *mode)
1356 TRACE ("%s\n", __PRETTY_FUNCTION__);
1358 n = strlen (command);
1359 MF_VALIDATE_EXTENT (command, CLAMPADD(n, 1), __MF_CHECK_READ, "popen path");
1362 MF_VALIDATE_EXTENT (mode, CLAMPADD(n, 1), __MF_CHECK_READ, "popen mode");
1364 p = popen (command, mode);
1366 #ifdef MF_REGISTER_fopen
1367 __mf_register (p, sizeof (*p), MF_REGISTER_fopen, "popen result");
1369 MF_VALIDATE_EXTENT (p, sizeof (*p), __MF_CHECK_WRITE, "popen result");
1375 WRAPPER2(int, pclose, FILE *stream)
1378 TRACE ("%s\n", __PRETTY_FUNCTION__);
1379 MF_VALIDATE_EXTENT (stream, sizeof (*stream), __MF_CHECK_WRITE,
1381 resp = pclose (stream);
1382 #ifdef MF_REGISTER_fopen
1383 __mf_unregister (stream, sizeof (*stream));
1389 WRAPPER2(int, execve, const char *path, char *const argv [],
1395 TRACE ("%s\n", __PRETTY_FUNCTION__);
1398 MF_VALIDATE_EXTENT (path, CLAMPADD(n, 1), __MF_CHECK_READ, "execve path");
1401 MF_VALIDATE_EXTENT (p, sizeof (*p), __MF_CHECK_READ, "execve *argv");
1406 MF_VALIDATE_EXTENT (s, CLAMPADD(n, 1), __MF_CHECK_READ, "execve **argv");
1410 MF_VALIDATE_EXTENT (p, sizeof (*p), __MF_CHECK_READ, "execve *envp");
1415 MF_VALIDATE_EXTENT (s, CLAMPADD(n, 1), __MF_CHECK_READ, "execve **envp");
1417 return execve (path, argv, envp);
1421 WRAPPER2(int, execv, const char *path, char *const argv [])
1426 TRACE ("%s\n", __PRETTY_FUNCTION__);
1429 MF_VALIDATE_EXTENT (path, CLAMPADD(n, 1), __MF_CHECK_READ, "execv path");
1432 MF_VALIDATE_EXTENT (p, sizeof (*p), __MF_CHECK_READ, "execv *argv");
1437 MF_VALIDATE_EXTENT (s, CLAMPADD(n, 1), __MF_CHECK_READ, "execv **argv");
1439 return execv (path, argv);
1443 WRAPPER2(int, execvp, const char *path, char *const argv [])
1448 TRACE ("%s\n", __PRETTY_FUNCTION__);
1451 MF_VALIDATE_EXTENT (path, CLAMPADD(n, 1), __MF_CHECK_READ, "execvp path");
1454 MF_VALIDATE_EXTENT (p, sizeof (*p), __MF_CHECK_READ, "execvp *argv");
1459 MF_VALIDATE_EXTENT (s, CLAMPADD(n, 1), __MF_CHECK_READ, "execvp **argv");
1461 return execvp (path, argv);
1465 WRAPPER2(int, system, const char *string)
1468 TRACE ("%s\n", __PRETTY_FUNCTION__);
1469 n = strlen (string);
1470 MF_VALIDATE_EXTENT (string, CLAMPADD(n, 1), __MF_CHECK_READ,
1472 return system (string);
1476 WRAPPER2(void *, dlopen, const char *path, int flags)
1480 TRACE ("%s\n", __PRETTY_FUNCTION__);
1482 MF_VALIDATE_EXTENT (path, CLAMPADD(n, 1), __MF_CHECK_READ, "dlopen path");
1483 p = dlopen (path, flags);
1485 #ifdef MF_REGISTER_dlopen
1486 __mf_register (p, 0, MF_REGISTER_dlopen, "dlopen result");
1488 MF_VALIDATE_EXTENT (p, 0, __MF_CHECK_WRITE, "dlopen result");
1494 WRAPPER2(int, dlclose, void *handle)
1497 TRACE ("%s\n", __PRETTY_FUNCTION__);
1498 MF_VALIDATE_EXTENT (handle, 0, __MF_CHECK_READ, "dlclose handle");
1499 resp = dlclose (handle);
1500 #ifdef MF_REGISTER_dlopen
1501 __mf_unregister (handle, 0);
1507 WRAPPER2(char *, dlerror)
1510 TRACE ("%s\n", __PRETTY_FUNCTION__);
1516 #ifdef MF_REGISTER_dlerror
1517 __mf_register (p, n, MF_REGISTER_dlerror, "dlerror result");
1519 MF_VALIDATE_EXTENT (p, n, __MF_CHECK_WRITE, "dlerror result");
1525 WRAPPER2(void *, dlsym, void *handle, char *symbol)
1529 TRACE ("%s\n", __PRETTY_FUNCTION__);
1530 MF_VALIDATE_EXTENT (handle, 0, __MF_CHECK_READ, "dlsym handle");
1531 n = strlen (symbol);
1532 MF_VALIDATE_EXTENT (symbol, CLAMPADD(n, 1), __MF_CHECK_READ, "dlsym symbol");
1533 p = dlsym (handle, symbol);
1535 #ifdef MF_REGISTER_dlsym
1536 __mf_register (p, 0, MF_REGISTER_dlsym, "dlsym result");
1538 MF_VALIDATE_EXTENT (p, 0, __MF_CHECK_WRITE, "dlsym result");
1544 #if defined (HAVE_SYS_IPC_H) && defined (HAVE_SYS_SEM_H) && defined (HAVE_SYS_SHM_H)
1546 WRAPPER2(int, semop, int semid, struct sembuf *sops, unsigned nsops)
1548 TRACE ("%s\n", __PRETTY_FUNCTION__);
1549 MF_VALIDATE_EXTENT (sops, sizeof (*sops) * nsops, __MF_CHECK_READ,
1551 return semop (semid, sops, nsops);
1555 #ifndef HAVE_UNION_SEMUN
1557 int val; /* value for SETVAL */
1558 struct semid_ds *buf; /* buffer for IPC_STAT, IPC_SET */
1559 unsigned short int *array; /* array for GETALL, SETALL */
1560 struct seminfo *__buf; /* buffer for IPC_INFO */
1563 WRAPPER2(int, semctl, int semid, int semnum, int cmd, union semun arg)
1565 TRACE ("%s\n", __PRETTY_FUNCTION__);
1568 MF_VALIDATE_EXTENT (arg.buf, sizeof (*arg.buf), __MF_CHECK_WRITE,
1572 MF_VALIDATE_EXTENT (arg.buf, sizeof (*arg.buf), __MF_CHECK_READ,
1576 MF_VALIDATE_EXTENT (arg.array, sizeof (*arg.array), __MF_CHECK_WRITE,
1579 MF_VALIDATE_EXTENT (arg.array, sizeof (*arg.array), __MF_CHECK_READ,
1583 /* FreeBSD 5.1 headers include IPC_INFO but not the __buf field. */
1584 #if !defined(__FreeBSD__)
1586 MF_VALIDATE_EXTENT (arg.__buf, sizeof (*arg.__buf), __MF_CHECK_WRITE,
1594 return semctl (semid, semnum, cmd, arg);
1598 WRAPPER2(int, shmctl, int shmid, int cmd, struct shmid_ds *buf)
1600 TRACE ("%s\n", __PRETTY_FUNCTION__);
1603 MF_VALIDATE_EXTENT (buf, sizeof (*buf), __MF_CHECK_WRITE,
1607 MF_VALIDATE_EXTENT (buf, sizeof (*buf), __MF_CHECK_READ,
1613 return shmctl (shmid, cmd, buf);
1617 WRAPPER2(void *, shmat, int shmid, const void *shmaddr, int shmflg)
1620 TRACE ("%s\n", __PRETTY_FUNCTION__);
1621 p = shmat (shmid, shmaddr, shmflg);
1622 #ifdef MF_REGISTER_shmat
1624 struct shmid_ds buf;
1625 __mf_register (p, shmctl (shmid, IPC_STAT, &buf) ? 0 : buf.shm_segsz,
1626 MF_REGISTER_shmat, "shmat result");
1633 WRAPPER2(int, shmdt, const void *shmaddr)
1636 TRACE ("%s\n", __PRETTY_FUNCTION__);
1637 resp = shmdt (shmaddr);
1638 #ifdef MF_REGISTER_shmat
1639 __mf_unregister ((void *)shmaddr, 0);
1645 #endif /* HAVE_SYS_IPC/SEM/SHM_H */