//=== softboundcets-wrappers.c- SoftBound wrappers for libraries --*- C -*===// 
// Copyright (c) 2011 Santosh Nagarakatte, Milo M. K. Martin. All rights reserved.

// Developed by: Santosh Nagarakatte, Milo M.K. Martin,
//               Jianzhou Zhao, Steve Zdancewic
//               Department of Computer and Information Sciences,
//               University of Pennsylvania
//               http://www.cis.upenn.edu/acg/softbound/

// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to
// deal with the Software without restriction, including without limitation the
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
// sell copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:

//   1. Redistributions of source code must retain the above copyright notice,
//      this list of conditions and the following disclaimers.

//   2. Redistributions in binary form must reproduce the above copyright
//      notice, this list of conditions and the following disclaimers in the
//      documentation and/or other materials provided with the distribution.

//   3. Neither the names of Santosh Nagarakatte, Milo M. K. Martin,
//      Jianzhou Zhao, Steve Zdancewic, University of Pennsylvania, nor
//      the names of its contributors may be used to endorse or promote
//      products derived from this Software without specific prior
//      written permission.

// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
// CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
// WITH THE SOFTWARE.
//===---------------------------------------------------------------------===//


#include "safecode/Config/config.h"

#include <arpa/inet.h>

#if defined(__linux__)
#include<bits/errno.h>
#include<sys/wait.h>
#include <wait.h>
#include <obstack.h>
#include <libintl.h>
#endif

#include<sys/mman.h>
#include<sys/times.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<sys/time.h>
#include<sys/resource.h>
#include<sys/socket.h>
#include<fnmatch.h>
#include <wchar.h>


#include<netinet/in.h>

#include <assert.h>
#include <ctype.h>
#include <dirent.h>
#include <errno.h>
#include <grp.h>
#include <getopt.h>
#include <glob.h>
#include <limits.h>
#include <math.h>
#include <netdb.h>
#include <pwd.h>
#include <syslog.h>
#include <setjmp.h>
#include <string.h>
#include <signal.h>
#include <stdarg.h>
#include<stdio.h>
#include<stdlib.h>

#include <ttyent.h>
#include <time.h>
#include <unistd.h>
#include <langinfo.h>
#include <regex.h>

#ifdef HAVE_ICONV_H
#include <iconv.h>
#endif

#include <utime.h>
#include <math.h>
#include <locale.h>

#include <fcntl.h>
#include <wctype.h>


typedef size_t key_type;
typedef void* lock_type;

#include "softboundcets.h"

typedef void(*sighandler_t)(int);
typedef void(*void_func_ptr)(void);

extern size_t* __softboundcets_global_lock;

extern void __softboundcets_process_memory_total();



__WEAK_INLINE void 
__softboundcets_read_shadow_stack_metadata_store(char** endptr, int arg_num){
  

#ifdef __SOFTBOUNDCETS_SPATIAL
    void* nptr_base = __softboundcets_load_base_shadow_stack(arg_num);
    void* nptr_bound = __softboundcets_load_bound_shadow_stack(arg_num);

    __softboundcets_metadata_store(endptr, nptr_base, nptr_bound);

#elif __SOFTBOUNDCETS_TEMPORAL

    size_t nptr_key = __softboundcets_load_key_shadow_stack(arg_num);
    void* nptr_lock = __softboundcets_load_lock_shadow_stack(arg_num);

    __softboundcets_metadata_store(endptr, nptr_key, nptr_lock);

#elif __SOFTBOUNDCETS_SPATIAL_TEMPORAL
    void* nptr_base = __softboundcets_load_base_shadow_stack(arg_num);
    void* nptr_bound = __softboundcets_load_bound_shadow_stack(arg_num);
    size_t nptr_key = __softboundcets_load_key_shadow_stack(arg_num);
    void* nptr_lock = __softboundcets_load_lock_shadow_stack(arg_num);
    __softboundcets_metadata_store(endptr, nptr_base, nptr_bound, nptr_key, 
                                   nptr_lock);

#else

    void* nptr_base = __softboundcets_load_base_shadow_stack(arg_num);
    void* nptr_bound = __softboundcets_load_bound_shadow_stack(arg_num);
    size_t nptr_key = __softboundcets_load_key_shadow_stack(arg_num);
    void* nptr_lock = __softboundcets_load_lock_shadow_stack(arg_num);
    __softboundcets_metadata_store(endptr, nptr_base, nptr_bound, nptr_key, 
                                   nptr_lock);

#endif

}

__WEAK_INLINE void 
__softboundcets_propagate_metadata_shadow_stack_from(int from_argnum, 
                                                     int to_argnum){
  
#ifdef __SOFTBOUNDCETS_SPATIAL

  void* base = __softboundcets_load_base_shadow_stack(from_argnum);
  void* bound = __softboundcets_load_bound_shadow_stack(from_argnum);
  __softboundcets_store_base_shadow_stack(base, to_argnum);
  __softboundcets_store_bound_shadow_stack(bound, to_argnum);

 
#elif __SOFTBOUNDCETS_TEMPORAL

 size_t key = __softboundcets_load_key_shadow_stack(from_argnum);
 void* lock = __softboundcets_load_lock_shadow_stack(from_argnum);
 __softboundcets_store_key_shadow_stack(key, to_argnum);
 __softboundcets_store_lock_shadow_stack(lock, to_argnum);
 
#elif __SOFTBOUNDCETS_SPATIAL_TEMPORAL

  void* base = __softboundcets_load_base_shadow_stack(from_argnum);
  void* bound = __softboundcets_load_bound_shadow_stack(from_argnum);
  size_t key = __softboundcets_load_key_shadow_stack(from_argnum);
  void* lock = __softboundcets_load_lock_shadow_stack(from_argnum);
  
  __softboundcets_store_base_shadow_stack(base, to_argnum);
  __softboundcets_store_bound_shadow_stack(bound, to_argnum);
  __softboundcets_store_key_shadow_stack(key, to_argnum);
  __softboundcets_store_lock_shadow_stack(lock, to_argnum);

#else

  void* base = __softboundcets_load_base_shadow_stack(from_argnum);
  void* bound = __softboundcets_load_bound_shadow_stack(from_argnum);
  size_t key = __softboundcets_load_key_shadow_stack(from_argnum);
  void* lock = __softboundcets_load_lock_shadow_stack(from_argnum);
  
  __softboundcets_store_base_shadow_stack(base, to_argnum);
  __softboundcets_store_bound_shadow_stack(bound, to_argnum);
  __softboundcets_store_key_shadow_stack(key, to_argnum);
  __softboundcets_store_lock_shadow_stack(lock, to_argnum);

#endif


}

__WEAK_INLINE void __softboundcets_store_null_return_metadata(){

#ifdef __SOFTBOUNDCETS_SPATIAL

  __softboundcets_store_base_shadow_stack(NULL, 0);
  __softboundcets_store_bound_shadow_stack(NULL, 0);

#elif __SOFTBOUNDCETS_TEMPORAL

  __softboundcets_store_key_shadow_stack(0, 0);
  __softboundcets_store_lock_shadow_stack(NULL, 0);

#elif __SOFTBOUNDCETS_SPATIAL_TEMPORAL

  __softboundcets_store_base_shadow_stack(NULL, 0);
  __softboundcets_store_bound_shadow_stack(NULL, 0);
  __softboundcets_store_key_shadow_stack(0, 0);
  __softboundcets_store_lock_shadow_stack(NULL, 0);

#else 

  __softboundcets_store_base_shadow_stack(NULL, 0);
  __softboundcets_store_bound_shadow_stack(NULL, 0);
  __softboundcets_store_key_shadow_stack(0, 0);
  __softboundcets_store_lock_shadow_stack(NULL, 0);

#endif

}

__WEAK_INLINE void 
__softboundcets_store_return_metadata(void* base, void* bound, size_t key, 
                                      void* lock){

#ifdef __SOFTBOUNDCETS_SPATIAL

  __softboundcets_store_base_shadow_stack(base, 0);
  __softboundcets_store_bound_shadow_stack(bound, 0);


#elif __SOFTBOUNDCETS_TEMPORAL

  __softboundcets_store_key_shadow_stack(key, 0);
  __softboundcets_store_lock_shadow_stack(lock, 0);


#elif __SOFTBOUNDCETS_SPATIAL_TEMPORAL

  __softboundcets_store_base_shadow_stack(base, 0);
  __softboundcets_store_bound_shadow_stack(bound, 0);
  __softboundcets_store_key_shadow_stack(key, 0);
  __softboundcets_store_lock_shadow_stack(lock, 0);

#else

  __softboundcets_store_base_shadow_stack(base, 0);
  __softboundcets_store_bound_shadow_stack(bound, 0);
  __softboundcets_store_key_shadow_stack(key, 0);
  __softboundcets_store_lock_shadow_stack(lock, 0);

#endif
}



/* wrappers for library calls (incomplete) */
//////////////////////system wrappers //////////////////////

__WEAK_INLINE int 
softboundcets_setenv(const char *name, const char *value, int overwrite){

  return setenv(name, value, overwrite);
}

__WEAK_INLINE 
int softboundcets_unsetenv(const char *name){
  
  return unsetenv(name);
}


__WEAK_INLINE int softboundcets_system(char* ptr){

  return system(ptr);
}

__WEAK_INLINE int softboundcets_setreuid(uid_t ruid, uid_t euid) {

  /* tested */
  return setreuid(ruid, euid);
}

__WEAK_INLINE int softboundcets_mkstemp(char* template) {
  
  /* tested */
  return mkstemp(template);
}

__WEAK_INLINE uid_t softboundcets_geteuid(){
  return geteuid();
}

__WEAK_INLINE uid_t softboundcets_getuid(void) {

  /* tested */
  return getuid();
}

__WEAK_INLINE int 
softboundcets_getrlimit(int resource, struct rlimit* rlim){

  /* tested */
  return getrlimit(resource, rlim);
}

__WEAK_INLINE int 
softboundcets_setrlimit(int resource, const struct rlimit* rlim){

  /* tested */
  return setrlimit(resource, rlim);
}

#if defined (__linux__)

__WEAK_INLINE size_t
softboundcets_fread_unlocked(void *ptr, size_t size, 
                             size_t n, FILE *stream){
  
  return fread_unlocked(ptr, size, n, stream);
}

__WEAK_INLINE int 
softboundcets_fputs_unlocked(const char *s, FILE *stream){
  return fputs_unlocked(s, stream);
}

#endif

__WEAK_INLINE size_t 
softboundcets_fread(void *ptr, size_t size, size_t nmemb, FILE *stream){
  /* tested */
  return fread(ptr, size, nmemb, stream);
}

__WEAK_INLINE mode_t softboundcets_umask(mode_t mask) {

  /* tested */
  return umask(mask);
}

__WEAK_INLINE int softboundcets_mkdir(const char* pathname, mode_t mode){
  
  /* tested */
  return mkdir(pathname, mode);
}

__WEAK_INLINE int softboundcets_chroot(const char* path){
  /* tested */
  return chroot(path);
}

__WEAK_INLINE int softboundcets_rmdir(const char* pathname){

  /* tested */
  return rmdir(pathname);
}

__WEAK_INLINE int softboundcets_stat(const char* path, struct stat* buf){
  /* tested */
  return stat(path, buf);
}

__WEAK_INLINE int softboundcets_fputc(int c, FILE* stream){

  /* tested */
  return fputc(c, stream);
}

__WEAK_INLINE int softboundcets_fileno(FILE* stream){

  return fileno(stream);
}

__WEAK_INLINE int softboundcets_fgetc(FILE* stream){

  return fgetc(stream);
}

__WEAK_INLINE int softboundcets_ungetc(int c,  FILE* stream){
  
  return ungetc(c, stream);
}

__WEAK_INLINE int 
softboundcets_strncmp(const char* s1, const char* s2, size_t n){
  return strncmp(s1, s2, n);
}

__WEAK_INLINE double softboundcets_log(double x) {

  return log(x);
}


__WEAK_INLINE  long long 
softboundcets_fwrite(char* ptr, size_t size, size_t nmemb, FILE* stream){
  return fwrite(ptr, size, nmemb, stream);
}

__WEAK_INLINE double softboundcets_atof(char* ptr){
  return atof(ptr);
}

__WEAK_INLINE int softboundcets_feof(FILE* stream){
  return feof(stream);
}

__WEAK_INLINE int softboundcets_remove(const char* pathname){

  return remove(pathname);
}

///////////////////// Math library functions here //////////////////

__WEAK_INLINE double softboundcets_acos(double x) {

  return acos(x);
}

__WEAK_INLINE double softboundcets_atan2(double y, double x) {

  return atan2(y, x);
}
__WEAK_INLINE float softboundcets_sqrtf(float x) {

  return sqrtf(x);
}

__WEAK_INLINE float softboundcets_expf(float x) {

  return expf(x);
}

double exp2(double);

__WEAK_INLINE double softboundcets_exp2(double x) {

  return exp2(x);
}


__WEAK_INLINE float softboundcets_floorf(float x) {

  return floorf(x);
}

__WEAK_INLINE double softboundcets_ceil(double x){

  return ceil(x);
}

__WEAK_INLINE float softboundcets_ceilf(float x) {

  return ceilf(x);
}
__WEAK_INLINE double softboundcets_floor(double x) {

  return floor(x);
}

__WEAK_INLINE double softboundcets_sqrt(double x) {

  return sqrt(x);
}

__WEAK_INLINE double softboundcets_fabs(double x) {

  return fabs(x);
}

__WEAK_INLINE int softboundcets_abs(int j){
  return abs(j);
}

__WEAK_INLINE void softboundcets_srand(unsigned int seed){
  srand(seed);
}

__WEAK_INLINE void softboundcets_srand48(long int seed){
  srand48(seed);
}


__WEAK_INLINE double softboundcets_pow(double x, double y) {
  
  return pow(x,y);

}

__WEAK_INLINE float softboundcets_fabsf(float x) {

  return fabsf(x);
}

__WEAK_INLINE double softboundcets_tan(double x ) {

  return tan(x);
}

__WEAK_INLINE float softboundcets_tanf(float x) {

  return tanf(x);
}

__WEAK_INLINE long double softboundcets_tanl(long double x) {


  return tanl(x);
}

__WEAK_INLINE double softboundcets_log10(double x) {

  return log10(x);
}
__WEAK_INLINE double softboundcets_sin(double x) {

  return sin(x);
}

__WEAK_INLINE float softboundcets_sinf(float x) {

  return sinf(x);
}

__WEAK_INLINE long double softboundcets_sinl(long double x) {

  return sinl(x);
}

__WEAK_INLINE double softboundcets_cos(double x) {

  return cos(x);
}

__WEAK_INLINE float softboundcets_cosf(float x) {

  return cosf(x);
}

__WEAK_INLINE long double softboundcets_cosl(long double x) {

  return cosl(x);
}

__WEAK_INLINE double softboundcets_exp(double x) {

  return exp(x);
}

__WEAK_INLINE double softboundcets_ldexp(double x, int exp) {
  
  return ldexp(x, exp);
}


////////////////File Library Wrappers here //////////////////////

__WEAK_INLINE FILE* softboundcets_tmpfile(void) {

  void* ret_ptr = tmpfile();
  void* ret_ptr_bound = (char*) ret_ptr + sizeof(FILE);
  __softboundcets_store_return_metadata(ret_ptr, ret_ptr_bound, 
                                        1, __softboundcets_global_lock);
  return ret_ptr;
}

__WEAK_INLINE int softboundcets_ferror(FILE* stream){

  return ferror(stream);
}

__WEAK_INLINE long softboundcets_ftell(FILE* stream){ 

  return ftell(stream);
}

__WEAK_INLINE int softboundcets_fstat(int filedes, struct stat* buff){

  return fstat(filedes, buff);
}

#if defined (__linux__)

__WEAK_INLINE int softboundcets___lxstat (int __ver, const char *__filename,     
                                          struct stat *__stat_buf) {

  return __lxstat(__ver, __filename, __stat_buf);
}

__WEAK_INLINE size_t softboundcets_mbrtowc(wchar_t *pwc, const char *s, 
                                           size_t n, mbstate_t *ps){
  return mbrtowc(pwc, s, n, ps);
}


__WEAK_INLINE int softboundcets_mbsinit(const mbstate_t *ps){
  return mbsinit(ps);
}



__WEAK_INLINE int softboundcets___fxstat(int ver, int file_des, struct stat * stat_struct){
  return __fxstat(ver, file_des, stat_struct);
}

__WEAK_INLINE int softboundcets___fxstatat(int ver, int file_des, const char* filename, struct stat * stat_struct, int flag){
  return __fxstatat(ver, file_des, filename, stat_struct, flag);
}

#endif

__WEAK_INLINE int softboundcets_fflush(FILE* stream){

  return fflush(stream);
}

__WEAK_INLINE int softboundcets_fputs(const char* s, FILE* stream){
  
  return fputs(s, stream);
}

__WEAK_INLINE int softboundcets_fsync(int fd){
  return fsync(fd);
}

#if defined (__linux__)

__WEAK_INLINE DIR* softboundcets_fdopendir(int fd){
  
  void* ret_ptr = (void*) fdopendir(fd);
  void* ret_ptr_bound = (char *) ret_ptr + 1024 * 1024;
    __softboundcets_store_return_metadata(ret_ptr, ret_ptr_bound, 
                                        1, (void*) __softboundcets_global_lock);
  return (DIR*)ret_ptr;
  
}

#endif

__WEAK_INLINE int softboundcets_fseeko(FILE *stream, off_t offset, int whence){
  
  return fseeko(stream, offset, whence);
}

__WEAK_INLINE  char * softboundcets_mkdtemp(char *template){
  
  char* ret_ptr = mkdtemp(template);
  __softboundcets_propagate_metadata_shadow_stack_from(1, 0);
  return ret_ptr;
}

__WEAK_INLINE int softboundcets_raise(int sig){
  return raise(sig);
}

#if defined (__linux__)

__WEAK_INLINE int softboundcets_linkat(int olddirfd, const char *oldpath,
                                       int newdirfd, const char *newpath, 
                                       int flags){

  return  linkat(olddirfd, oldpath, newdirfd, newpath, flags);
}

#endif

__WEAK_INLINE int softboundcets_utimes(const char *filename, 
                                       const struct timeval times[2]){
  
  return utimes(filename, times);
}

#if defined (__linux__)
__WEAK_INLINE int softboundcets_futimesat(int dirfd, const char *pathname,
                                          const struct timeval times[2]){
  
  return futimesat(dirfd, pathname, times);
}

__WEAK_INLINE int softboundcets_futimens(int fd, const struct timespec times[2]){

  return futimens(fd, times);
}

__WEAK_INLINE int 
softboundcets_utimensat(int dirfd, const char *pathname,
                        const struct timespec times[2], int flags){

  return utimensat(dirfd, pathname, times, flags);
}
#endif

#if defined (__linux__)
__WEAK_INLINE size_t 
softboundcets___ctype_get_mb_cur_max(void){
  return __ctype_get_mb_cur_max();  
}

#endif

__WEAK_INLINE int 
softboundcets_iswprint(wint_t wc){
  return iswprint(wc);
}

__WEAK_INLINE int 
softboundcets_getpagesize(void){
  return getpagesize();
}

__WEAK_INLINE int softboundcets_dirfd(DIR *dirp){
  return dirfd(dirp);
}

__WEAK_INLINE struct lconv *softboundcets_localeconv(void){
  struct lconv* temp = localeconv();

  __softboundcets_store_return_metadata(temp, temp + 1024, 
                                        1, (void*) __softboundcets_global_lock);
  
  return temp;
}

__WEAK_INLINE struct tm *softboundcets_gmtime(const time_t *timep){

  struct tm * temp = gmtime(timep);

  __softboundcets_store_return_metadata(temp, temp + 1024, 
                                        1, (void*) __softboundcets_global_lock);

  return temp;
}

__WEAK_INLINE void *
softboundcets_bsearch(const void *key, const void *base,
                      size_t nmemb, size_t size,
                      int (*compar)(const void *, const void *)){
  
  void* ret_ptr = bsearch(key, base, nmemb, size, compar);

  __softboundcets_propagate_metadata_shadow_stack_from(2, 0);
    return ret_ptr;

}

__WEAK_INLINE 
struct group *softboundcets_getgrnam(const char *name){
  void* ret_ptr = getgrnam(name);
  __softboundcets_store_return_metadata(ret_ptr, (char*) ret_ptr + 1024 * 1024, 
                                        1, (void*) __softboundcets_global_lock);

  return ret_ptr;  
}

#if defined (__linux__)
__WEAK_INLINE
int softboundcets_rpmatch(const char *response){
  return rpmatch(response);
}
#endif

__WEAK_INLINE
int softboundcets_regcomp(regex_t *preg, const char *regex, int cflags){
  return regcomp(preg, regex, cflags);
}

__WEAK_INLINE
size_t softboundcets_regerror(int errcode, const regex_t *preg, char *errbuf,
                              size_t errbuf_size){

  return regerror(errcode, preg, errbuf, errbuf_size);
}

__WEAK_INLINE
int softboundcets_regexec(const regex_t *preg, const char *string, 
                          size_t nmatch,
                          regmatch_t pmatch[], int eflags){
  return regexec(preg, string, nmatch, pmatch, eflags);
}


#ifdef HAVE_ICONV_H

#if defined (__linux__)
__WEAK_INLINE
size_t softboundcets_iconv(iconv_t cd,
                           char **inbuf, size_t *inbytesleft,
                           char **outbuf, size_t *outbytesleft){

  return iconv(cd, inbuf, inbytesleft, outbuf, outbytesleft);
}

__WEAK_INLINE
iconv_t softboundcets_iconv_open(const char *tocode, const char *fromcode){

  return iconv_open(tocode, fromcode);
}
#endif

#endif




__WEAK_INLINE 
struct passwd * softboundcets_getpwnam(const char *name){
  void* ret_ptr = getpwnam(name);
  __softboundcets_store_return_metadata(ret_ptr, (char*) ret_ptr + 1024 * 1024, 
                                        1, (void*) __softboundcets_global_lock);

  return ret_ptr;  

  
}


__WEAK_INLINE struct passwd *softboundcets_getpwuid(uid_t uid){
  void* ret_ptr= getpwuid(uid);

  __softboundcets_store_return_metadata(ret_ptr, (char*) ret_ptr + 1024 * 1024, 
                                        1, (void*) __softboundcets_global_lock);

  return ret_ptr;  
}

__WEAK_INLINE struct group *softboundcets_getgrgid(gid_t gid){
  
  void* ret_ptr = getgrgid(gid);
  __softboundcets_store_return_metadata(ret_ptr, (char*) ret_ptr + 1024 * 1024, 
                                        1, (void*) __softboundcets_global_lock);

  return ret_ptr;  

}




__WEAK_INLINE FILE* softboundcets_fopen(const char* path, const char* mode){                                  

  void* ret_ptr = (void*) fopen(path, mode);
  void* ret_ptr_bound = (char*) ret_ptr + sizeof(FILE);

  __softboundcets_store_return_metadata(ret_ptr, ret_ptr_bound, 
                                        1, (void*) __softboundcets_global_lock);
  return (FILE*)ret_ptr;
}

__WEAK_INLINE FILE* softboundcets_fdopen(int fildes, const char* mode){

  void* ret_ptr = (void*) fdopen(fildes, mode);
  void* ret_ptr_bound = (char*) ret_ptr + sizeof(FILE);

  __softboundcets_store_return_metadata(ret_ptr, ret_ptr_bound, 
                                        1, (void*)__softboundcets_global_lock);
  return (FILE*)ret_ptr;
}


__WEAK_INLINE int softboundcets_fseek(FILE* stream, long offset, int whence){

  return fseek(stream, offset, whence);
}

__WEAK_INLINE int softboundcets_ftruncate(int fd, off_t length) {
  return ftruncate(fd, length);
}



__WEAK_INLINE FILE* softboundcets_popen(const char* command, const char* type){

  void* ret_ptr = (void*) popen(command, type);
  void* ret_ptr_bound = (char*)ret_ptr + sizeof(FILE);

  __softboundcets_store_return_metadata(ret_ptr, ret_ptr_bound, 
                                        1, (void*) __softboundcets_global_lock);  
  return (FILE*)ret_ptr;

}

__WEAK_INLINE int softboundcets_fclose(FILE* fp){
  return fclose(fp);
}


__WEAK_INLINE int softboundcets_pclose(FILE* stream){

  return pclose(stream);
}

__WEAK_INLINE void softboundcets_rewind(FILE* stream){ 
  
  rewind(stream);
}

__WEAK_INLINE struct dirent*  softboundcets_readdir(DIR* dir){

  void* ret_ptr = (void*) readdir(dir);
  void* ret_ptr_bound = (char*)ret_ptr + sizeof(struct dirent);

  __softboundcets_store_return_metadata(ret_ptr, ret_ptr_bound, 
                                        1, (void*) __softboundcets_global_lock);

  return (struct dirent*)ret_ptr;

}

__WEAK_INLINE  int
softboundcets_creat(const char *pathname, mode_t mode){
  
  return creat(pathname, mode);
}

__WEAK_INLINE int 
softboundcets_fnmatch(const char *pattern, const char *string, int flags){

  return fnmatch(pattern, string, flags);
}




__WEAK_INLINE DIR* softboundcets_opendir(const char* name){

  void* ret_ptr = opendir(name);

  /* FIX Required, don't know the sizeof(DIR) */
  void* ret_ptr_bound = (char*) ret_ptr + 1024* 1024;

  __softboundcets_store_return_metadata(ret_ptr, ret_ptr_bound, 
                                        1,  (void*)__softboundcets_global_lock);

  return (DIR*)ret_ptr;
}

__WEAK_INLINE int softboundcets_closedir(DIR* dir){

  return closedir(dir);
}

__WEAK_INLINE int 
softboundcets_rename(const char* old_path, const char* new_path){

  return rename(old_path, new_path);
}


////////////////////unistd.h wrappers ////////////////////////////////

__WEAK_INLINE unsigned int softboundcets_sleep(unsigned int seconds) {

  return sleep(seconds);
}

__WEAK_INLINE char* softboundcets_getcwd(char* buf, size_t size){ 

  if(buf == NULL) {
    printf("This case not handled, requesting memory from system\n");
    __softboundcets_abort();
  }

#ifdef __SOFTBOUNDCETS_SPATIAL
  
  char* base = (char*)__softboundcets_load_base_shadow_stack(1);
  char* bound = (char*)__softboundcets_load_bound_shadow_stack(1);
  
  if (buf < base || buf + size > bound){
    __softboundcets_printf("[getcwd], overflow in buf in getcwd\n");
    __softboundcets_abort();
  }
  
#endif

#ifdef __SOFTBOUNDCETS_SPATIAL_TEMPORAL
  char* base = (char *)__softboundcets_load_base_shadow_stack(1);
  char* bound = (char *) __softboundcets_load_bound_shadow_stack(1);
  
  if (buf < base || buf + size > bound){
    __softboundcets_printf("[getcwd], overflow in buf in getcwd\n");
    __softboundcets_abort();
  }


#endif

  char* ret_ptr = getcwd(buf, size);

  __softboundcets_propagate_metadata_shadow_stack_from(1, 0);

  return ret_ptr;
}

__WEAK_INLINE int softboundcets_setgid(gid_t gid){
  return setgid(gid);
}



__WEAK_INLINE gid_t softboundcets_getgid(void){
  return getgid();
}

__WEAK_INLINE gid_t softboundcets_getegid(void){
  return getegid();
}

#if defined (__linux__)
__WEAK_INLINE
int softboundcets_readlinkat(int dirfd, const char *pathname,
                             char *buf, size_t bufsiz){
  return readlinkat(dirfd, pathname, buf, bufsiz);
}

__WEAK_INLINE
int softboundcets_renameat(int olddirfd, const char *oldpath,
                           int newdirfd, const char *newpath){
  return renameat(olddirfd, oldpath, newdirfd, newpath);
}

__WEAK_INLINE 
int softboundcets_unlinkat(int dirfd, const char *pathname, int flags){
  return unlinkat(dirfd, pathname, flags);
}

__WEAK_INLINE
int softboundcets_symlinkat(const char *oldpath, int newdirfd, 
                            const char *newpath){

  return symlinkat(oldpath, newdirfd, newpath);
}

__WEAK_INLINE
int softboundcets_mkdirat(int dirfd, const char *pathname, mode_t mode){

  return mkdirat(dirfd, pathname, mode);
}

#endif


__WEAK_INLINE
int softboundcets_fchown(int fd, uid_t owner, gid_t group){
  return fchown(fd, owner, group);
}

#if defined (__linux__)

__WEAK_INLINE
int softboundcets_fchownat(int dirfd, const char *pathname,
                           uid_t owner, gid_t group, int flags){
  
  return fchownat(dirfd, pathname, owner, group, flags);
}
#endif

__WEAK_INLINE
int softboundcets_fchmod(int fd, mode_t mode){
  return fchmod(fd, mode);
}

__WEAK_INLINE
int softboundcets_chmod(const char *path, mode_t mode){
  return chmod(path, mode);
}

#if defined(_linux__)
__WEAK_INLINE 
int softboundcets_openat(int dirfd, const char *pathname, int flags){
  return openat(dirfd, pathname, flags);
}

__WEAK_INLINE
int softboundcets_fchmodat(int dirfd, const char *pathname, 
                           mode_t mode, int flags){
  return fchmodat(dirfd, pathname, mode, flags);
}

#endif

#if defined (__linux__)

__WEAK_INLINE 
int softboundcets___xmknodat (int __ver, int __fd, const char *__path,
                              __mode_t __mode, __dev_t *__dev){
 return  __xmknodat(__ver, __fd, __path, __mode, __dev);
}

__WEAK_INLINE
int softboundcets_mkfifoat(int dirfd, const char *pathname, mode_t mode){
  return mkfifoat(dirfd, pathname, mode);
}

#endif

__WEAK_INLINE 
pid_t softboundcets_getpid(void){
  return getpid();
}

__WEAK_INLINE pid_t softboundcets_getppid(void){
  return getppid();
}


#if 0
__WEAK_INLINE 
int softboundcets_openat(int dirfd, const char *pathname, int flags, mode_t mode){
  return opennat(dirfd, pathname, flags, mode);
}
#endif



__WEAK_INLINE int 
softboundcets_chown(const char* path, uid_t owner, gid_t group){  
  return chown(path, owner, group);
  
}

__WEAK_INLINE
wint_t softboundcets_towlower(wint_t wc){
  return towlower(wc);
}



__WEAK_INLINE int softboundcets_isatty(int desc) {

  return isatty(desc);
}

__WEAK_INLINE int softboundcets_chdir(const char* path){
  return chdir(path);
}

__WEAK_INLINE
int softboundcets_fchdir(int fd){
  return fchdir(fd);
}


///////////////////String related wrappers ////////////////////////////


__WEAK_INLINE int softboundcets_strcmp(const char* s1, const char* s2){
  
  return strcmp(s1, s2);
}


__WEAK_INLINE int softboundcets_strcasecmp(const char* s1, const char* s2){

  return strcasecmp(s1,s2);
}

__WEAK_INLINE int 
softboundcets_strncasecmp(const char* s1, const char* s2, size_t n){
  return strncasecmp(s1, s2, n);
}

__WEAK_INLINE size_t softboundcets_strlen(const char* s){

  return strlen(s);
}

__WEAK_INLINE char* softboundcets_strpbrk(const char* s, const char* accept){ 

  char* ret_ptr = strpbrk(s, accept);
  if(ret_ptr != NULL) {

    __softboundcets_propagate_metadata_shadow_stack_from(1, 0);
  }
  else {

    __softboundcets_store_null_return_metadata();
  }

  return ret_ptr;
}

__WEAK_INLINE char* softboundcets_gets(char* s){ 

  printf("[Softboundcets][Warning] Should not use gets\n");
  char* ret_ptr = gets(s);
  __softboundcets_propagate_metadata_shadow_stack_from(1, 0);
  return ret_ptr;
}

__WEAK_INLINE char* softboundcets_fgets(char* s, int size, FILE* stream){

  char* ret_ptr = fgets(s, size, stream);
  __softboundcets_propagate_metadata_shadow_stack_from(1,0);

  return ret_ptr;
}


__WEAK_INLINE void softboundcets_perror(const char* s){
  perror(s);
}

__WEAK_INLINE size_t softboundcets_strspn(const char* s, const char* accept){
  
  return strspn(s, accept);
}

__WEAK_INLINE size_t softboundcets_strcspn(const char* s, const char* reject){
  
  return strcspn(s, reject);
}

#ifdef _GNU_SOURCE

#if defined (__linux__)
__WEAK_INLINE void* softboundcets_mempcpy(void * dest, const void * src, size_t n){

  // IMP: need to copy the metadata 
  void* ret_ptr = mempcpy(dest, src, n);
  __softboundcets_propagate_metadata_shadow_stack_from(1,0);
  return ret_ptr;
}

#endif

#endif

__WEAK_INLINE int 
softboundcets_memcmp(const void* s1, const void* s2, size_t n){
  return memcmp(s1, s2, n);
}

#ifdef _GNU_SOURCE

#if defined (__linux__)
__WEAK_INLINE void* softboundcets_memrchr(const void * s, int c, size_t n){  
  void* ret_ptr = memrchr(s, c, n);
  if(ret_ptr != NULL) {
    __softboundcets_propagate_metadata_shadow_stack_from(1, 0);
  }
  else{
    __softboundcets_store_null_return_metadata();
  }
  return ret_ptr;
}

#endif

#endif

__WEAK_INLINE void softboundcets_rewinddir(DIR *dirp){
  rewinddir(dirp);  
}



__WEAK_INLINE void* softboundcets_memchr(const void * s, int c, size_t n){  
  void* ret_ptr = memchr(s, c, n);
  if(ret_ptr != NULL) {
    __softboundcets_propagate_metadata_shadow_stack_from(1, 0);
  }
  else{
    __softboundcets_store_null_return_metadata();
  }
  return ret_ptr;
}

__WEAK_INLINE char* softboundcets_rindex(char* s, int c){

  char* ret_ptr = rindex(s,c);
  __softboundcets_propagate_metadata_shadow_stack_from(1,0);
  return ret_ptr;
}

#if defined (__linux__)

__WEAK_INLINE ssize_t 
softboundcets___getdelim(char **lineptr, size_t *n, int delim, FILE *stream){
  
  int metadata_prop = 1;
  if(*lineptr == NULL){
    metadata_prop = 0;
  }

  ssize_t ret_val = getdelim(lineptr, n, delim, stream);
  
  if(metadata_prop){
    __softboundcets_read_shadow_stack_metadata_store(lineptr, 1);
  }
  else{
    __softboundcets_store_return_metadata(*lineptr, 
                                          (*lineptr) + strlen(*lineptr),
                                          1, __softboundcets_global_lock);
  }
  
  return ret_val;
  
}

#endif

__WEAK_INLINE unsigned long int 
softboundcets_strtoul(const char* nptr, char ** endptr, int base){

  unsigned long temp = strtoul(nptr, endptr, base);
  if(endptr != NULL){
    __softboundcets_read_shadow_stack_metadata_store(endptr, 1);
    
  }

  return temp;
}

__WEAK_INLINE double softboundcets_strtod(const char* nptr, char** endptr){

  double temp = strtod(nptr, endptr);
  
  if(endptr != NULL) {
    __softboundcets_read_shadow_stack_metadata_store(endptr, 1);
  }
  return temp;
 }
 
__WEAK_INLINE long 
softboundcets_strtol(const char* nptr, char **endptr, int base){
 
   long temp = strtol(nptr, endptr, base);
   if(endptr != NULL) {
     //    __softboundcets_printf("*endptr=%p\n", *endptr);
     __softboundcets_read_shadow_stack_metadata_store(endptr, 1);
  }
  return temp;
}

#ifdef _GNU_SOURCE

#if defined (__linux__)

__WEAK_INLINE char* softboundcets_strchrnul(const char* s, int c){

  char* ret_ptr = strchrnul(s, c);
   __softboundcets_propagate_metadata_shadow_stack_from(1, 0);
   return ret_ptr;
}
#endif
#endif

__WEAK_INLINE char* softboundcets_strchr(const char* s, int c){

  char* ret_ptr = strchr(s, c);
   __softboundcets_propagate_metadata_shadow_stack_from(1, 0);
   return ret_ptr;
}

__WEAK_INLINE char* softboundcets_strrchr(const char* s, int c){

  char* ret_ptr = strrchr(s, c);
  __softboundcets_propagate_metadata_shadow_stack_from(1, 0);
  return ret_ptr;
}

__WEAK_INLINE char* softboundcets_stpcpy(char* dest, char* src){

  void* ret_ptr = stpcpy(dest, src);
  __softboundcets_propagate_metadata_shadow_stack_from(1, 0);
  return ret_ptr;
}

__WEAK_INLINE char* softboundcets_strcpy(char* dest, char* src){
  
#ifdef __SOFTBOUNDCETS_SPATIAL  
  char* dest_base = __softboundcets_load_base_shadow_stack(1);
  char* dest_bound = __softboundcets_load_bound_shadow_stack(1);

  char* src_base = __softboundcets_load_base_shadow_stack(2);
  char* src_bound = __softboundcets_load_bound_shadow_stack(2);

  /* There will be an out-of-bound read before we trigger an error as
     we currently use strlen. Can either (dest + size) or (src + size)
     overflow?
  */
  size_t size = strlen(src);
  if(dest < dest_base || dest + size + 1 > dest_bound){
    printf("[strcpy] overflow in strcpy with dest\n");
    __softboundcets_abort();
  }  
  if(src < src_base || src + size + 1 > src_bound){
    printf("[strcpy] overflow in strcpy with src\n");
    __softboundcets_abort();
  }
#endif

#ifdef __SOFTBOUNDCETS_SPATIAL_TEMPORAL
  
  char* dest_base = __softboundcets_load_base_shadow_stack(1);
  char* dest_bound = __softboundcets_load_bound_shadow_stack(1);

  char* src_base = __softboundcets_load_base_shadow_stack(2);
  char* src_bound = __softboundcets_load_bound_shadow_stack(2);

  /* There will be an out-of-bound read before we trigger an error as
     we currently use strlen. Can either (dest + size) or (src + size)
     overflow?
  */
  size_t size = strlen(src);
  if(dest < dest_base || dest + size + 1 > dest_bound){
    printf("[strcpy] overflow in strcpy with dest\n");
    __softboundcets_abort();
  }  
  if(src < src_base || src + size + 1 > src_bound){
    printf("[strcpy] overflow in strcpy with src\n");
    __softboundcets_abort();
  }
#endif
        
  void * ret_ptr = strcpy(dest, src);
  __softboundcets_propagate_metadata_shadow_stack_from(1, 0);
  return ret_ptr;
}


__WEAK_INLINE void softboundcets_abort() {
  abort();
}

 __WEAK_INLINE int softboundcets_rand() {
   return rand();
 }
 
 /////////////////* TODO *///////////////////////////

 __WEAK_INLINE int softboundcets_atoi(const char* ptr){

  if(ptr == NULL) {
    __softboundcets_abort();
  }
  return atoi(ptr);    
 }
 
 __WEAK_INLINE void softboundcets_puts(char* ptr){
   puts(ptr);
 }


__WEAK_INLINE void softboundcets_exit(int status) {
  
  exit(status);
}

__WEAK_INLINE char*  softboundcets_strtok(char* str, const char* delim){
  
  char* ret_ptr = strtok(str, delim);   
  __softboundcets_store_return_metadata((void*)0, (void*)(281474976710656), 
                                        1, __softboundcets_global_lock);
  return ret_ptr;
}

__WEAK_INLINE void __softboundcets_strdup_handler(void* ret_ptr){
  key_type ptr_key;
  lock_type ptr_lock;
  
  if(ret_ptr == NULL) {
    __softboundcets_store_null_return_metadata();
  }
  else {
    //    printf("strndup malloced pointer %p\n", ret_ptr);    
    __softboundcets_memory_allocation(ret_ptr, &ptr_lock, &ptr_key);
    __softboundcets_store_return_metadata(ret_ptr, 
                                          (void*)
                                          ((char*)ret_ptr + strlen(ret_ptr) + 1), 
                                          ptr_key, ptr_lock); 
  } 
}


#if defined (__linux__)
//strdup, allocates memory from the system using malloc, thus can be freed
__WEAK_INLINE char* softboundcets_strndup(const char* s, size_t n){
  
  /* IMP: strndup just copies the string s */  
  char* ret_ptr = strndup(s, n);
  __softboundcets_strdup_handler(ret_ptr);  
  return ret_ptr;
 }
#endif


//strdup, allocates memory from the system using malloc, thus can be freed
__WEAK_INLINE char* softboundcets_strdup(const char* s){
  
  /* IMP: strdup just copies the string s */  
  void* ret_ptr = strdup(s);
  
  __softboundcets_strdup_handler(ret_ptr);
  return ret_ptr;
 }

__WEAK_INLINE char* softboundcets___strdup(const char* s){

  void* ret_ptr = strdup(s);
  __softboundcets_strdup_handler(ret_ptr);
  return ret_ptr;
}


 __WEAK_INLINE char* softboundcets_strcat (char* dest, const char* src){

#if 0
  if(dest + strlen(dest) + strlen(src) > dest_bound){
    printf("overflow with strcat, dest = %p, strlen(dest)=%d, 
            strlen(src)=%d, dest_bound=%p \n", 
           dest, strlen(dest), strlen(src), dest_bound);
    __softboundcets_abort();
  } 
#endif
  
  char* ret_ptr = strcat(dest, src);
  __softboundcets_propagate_metadata_shadow_stack_from(1, 0);
  return ret_ptr;
}

__WEAK_INLINE char* 
softboundcets_strncat (char* dest,const char* src, size_t n){

  char* ret_ptr = strncat(dest, src, n);
  __softboundcets_propagate_metadata_shadow_stack_from(1, 0);
  return ret_ptr;
}

__WEAK_INLINE char* 
softboundcets_strncpy(char* dest, char* src, size_t n){
 
#ifdef __SOFTBOUNDCETS_SPATIAL  
  char* dest_base = __softboundcets_load_base_shadow_stack(1);
  char* dest_bound = __softboundcets_load_bound_shadow_stack(1);

  char* src_base = __softboundcets_load_base_shadow_stack(2);
  char* src_bound = __softboundcets_load_bound_shadow_stack(2);

  /* Can either (dest + n) or (src + n) overflow? */
  if(dest < dest_base || dest + n> dest_bound){
    printf("[strncpy] overflow in strncpy with dest\n");
    __softboundcets_abort();
  }  
  if(src < src_base || src + n > src_bound){
    printf("[strncpy] overflow in strncpy with src\n");
    __softboundcets_abort();
  }
#endif

#ifdef __SOFTBOUNDCETS_SPATIAL_TEMPORAL

  char* dest_base = __softboundcets_load_base_shadow_stack(1);
  char* dest_bound = __softboundcets_load_bound_shadow_stack(1);

  char* src_base = __softboundcets_load_base_shadow_stack(2);
  char* src_bound = __softboundcets_load_bound_shadow_stack(2);

  /* Can either (dest + n) or (src + n) overflow? */
  if(dest < dest_base || dest + n > dest_bound){
    printf("[strncpy] overflow in strncpy with dest\n");
    __softboundcets_abort();
  }  
  if(src < src_base || src + n > src_bound){
    printf("[strncpy] overflow in strncpy with src\n");
    __softboundcets_abort();
  }
#endif
  
  char* ret_ptr = strncpy(dest, src, n);
  __softboundcets_propagate_metadata_shadow_stack_from(1, 0);
  return ret_ptr;
}

__WEAK_INLINE char* 
softboundcets_strstr(const char* haystack, const char* needle){
  
  char* ret_ptr = strstr(haystack, needle);
  if(ret_ptr != NULL) {    
    __softboundcets_propagate_metadata_shadow_stack_from(1, 0);
  }
  else {
    __softboundcets_store_null_return_metadata();
  }
  return ret_ptr;
}

__WEAK_INLINE sighandler_t 
softboundcets_signal(int signum, sighandler_t handler){

  sighandler_t ptr = signal(signum, handler);
  __softboundcets_store_return_metadata((void*)ptr, (void*) ptr, 
                                        1, __softboundcets_global_lock);
  return ptr;
}

__WEAK_INLINE clock_t softboundcets_clock(void){
  return clock();
}


__WEAK_INLINE long softboundcets_atol(const char* nptr){ 
  return atol(nptr);
}

__WEAK_INLINE void* softboundcets_realloc(void* ptr, size_t size){
  
#if 0
  /* TODO: may be necessary to copy metadata */
   printf("performing relloc, which can cause ptr=%p\n", ptr);
#endif
   void* ret_ptr = realloc(ptr, size);
   __softboundcets_allocation_secondary_trie_allocate(ret_ptr);
   size_t ptr_key = 1;
   void* ptr_lock = __softboundcets_global_lock;

#ifdef __SOFTBOUNDCETS_TEMPORAL
   ptr_key = __softboundcets_load_key_shadow_stack(1);
   ptr_lock = __softboundcets_load_lock_shadow_stack(1);
#elif __SOFTBOUNDCETS_SPATIAL_TEMPORAL
   ptr_key = __softboundcets_load_key_shadow_stack(1);
   ptr_lock = __softboundcets_load_lock_shadow_stack(1);
#else
   ptr_key = __softboundcets_load_key_shadow_stack(1);
   ptr_lock = __softboundcets_load_lock_shadow_stack(1);
#endif

   __softboundcets_store_return_metadata(ret_ptr, 
                                         (char*)(ret_ptr) + size, 
                                         ptr_key, ptr_lock);
   if(ret_ptr != ptr){
     __softboundcets_check_remove_from_free_map(ptr_key, ptr);
     __softboundcets_add_to_free_map(ptr_key, ret_ptr);
     __softboundcets_copy_metadata(ret_ptr, ptr, size);
   }
   
   return ret_ptr;
 }

 __WEAK_INLINE void* softboundcets_calloc(size_t nmemb, size_t size) {
   
   key_type ptr_key = 1 ;
   lock_type  ptr_lock = NULL;
  
   void* ret_ptr = calloc(nmemb, size);   
   if(ret_ptr != NULL) {    

#ifdef __SOFTBOUNDCETS_TEMPORAL     
     __softboundcets_memory_allocation(ret_ptr, &ptr_lock, &ptr_key);     
#elif __SOFTBOUNDCETS_SPATIAL_TEMPORAL
     __softboundcets_memory_allocation(ret_ptr, &ptr_lock, &ptr_key);     
#endif

     __softboundcets_store_return_metadata(ret_ptr, 
                                           ((char*)(ret_ptr) + (nmemb * size)), 
                                           ptr_key, ptr_lock); 

     if(__SOFTBOUNDCETS_FREE_MAP) {
#if 0
       __softboundcets_printf("calloc ptr=%p, ptr_key=%zx\n", 
                              ret_ptr, ptr_key);
#endif
       //       __softboundcets_add_to_free_map(ptr_key, ret_ptr);
     }
   }
   else{
     __softboundcets_store_null_return_metadata();
   } 
   return ret_ptr;
 }

__WEAK_INLINE void* softboundcets_mmap(void* addr, size_t length, 
                                       int prot, int flags, int fd, 
                                       off_t offset){

  key_type ptr_key=1;
  lock_type ptr_lock=__softboundcets_global_lock;
  char* ret_ptr = mmap(addr, length, prot, flags, fd, offset);
  if(ret_ptr == (void*) -1){
    __softboundcets_store_null_return_metadata();
  }
  else{

    char* ret_bound = ret_ptr + length;
    __softboundcets_store_return_metadata(ret_ptr, ret_bound, 
                                          ptr_key, ptr_lock);
    
  }
  return ret_ptr;
}
 
__WEAK_INLINE void* softboundcets_malloc(size_t size) {
  
  key_type ptr_key=1;
  lock_type ptr_lock=NULL;

  char* ret_ptr = (char*)malloc(size);
  if(ret_ptr == NULL){
    __softboundcets_store_null_return_metadata();
  }
  else{

#ifdef __SOFTBOUNDCETS_TEMPORAL 
    __softboundcets_memory_allocation(ret_ptr, &ptr_lock, &ptr_key);
#elif __SOFTBOUNDCETS_SPATIAL_TEMPORAL
    __softboundcets_memory_allocation(ret_ptr, &ptr_lock, &ptr_key);
#endif

    char* ret_bound = ret_ptr + size;
    __softboundcets_store_return_metadata(ret_ptr, ret_bound, 
                                          ptr_key, ptr_lock);
    if(__SOFTBOUNDCETS_FREE_MAP) {
#if 0
       __softboundcets_printf("malloc ptr=%p, ptr_key=%zx\n", 
                              ret_ptr, ptr_key);
#endif
       //      __softboundcets_add_to_free_map(ptr_key, ret_ptr);
    }
  }
  return ret_ptr;
}


__WEAK_INLINE int softboundcets_putchar(int c) {

  return putchar(c);
}


 __WEAK_INLINE clock_t softboundcets_times(struct tms* buf){
  return times(buf);
}

__WEAK_INLINE size_t 
softboundcets_strftime(char* s, size_t max, 
                       const char* format, const struct tm *tm){
  
  return strftime(s, max, format, tm);
}


__WEAK_INLINE time_t softboundcets_mktime(struct tm *tm){
  return mktime(tm);
}

__WEAK_INLINE long softboundcets_pathconf(char *path, int name){
  return pathconf(path, name);
}


__WEAK_INLINE struct tm* softboundcets_localtime(const time_t* timep){

  struct tm * ret_ptr = localtime(timep);
  __softboundcets_store_return_metadata(ret_ptr, 
                                        (char*)ret_ptr + sizeof(struct tm), 
                                        1, __softboundcets_global_lock); 
  return ret_ptr;
}

 __WEAK_INLINE time_t softboundcets_time(time_t* t){

   return time(t);
 }

__WEAK_INLINE double softboundcets_drand48(){

  return drand48();
}

__WEAK_INLINE void softboundcets_free(void* ptr){
  /* more checks required to check if it is a malloced address */
#ifdef __SOFTBOUNDCETS_TEMPORAL 
  if(ptr != NULL){
    void* ptr_lock = __softboundcets_load_lock_shadow_stack(1);
    size_t ptr_key = __softboundcets_load_key_shadow_stack(1);
    
    __softboundcets_memory_deallocation(ptr_lock, ptr_key);
    
    if(__SOFTBOUNDCETS_FREE_MAP){
#if 0
      __softboundcets_printf("free =%p, ptr_key=%zx\n", ptr, ptr_key);
#endif
      __softboundcets_check_remove_from_free_map(ptr_key, ptr);
    }
  }  
#endif  

#ifdef __SOFTBOUNDCETS_SPATIAL_TEMPORAL
  if(ptr != NULL){
    void* ptr_lock = __softboundcets_load_lock_shadow_stack(1);
    size_t ptr_key = __softboundcets_load_key_shadow_stack(1);
    __softboundcets_memory_deallocation(ptr_lock, ptr_key);
     
    if(__SOFTBOUNDCETS_FREE_MAP){
#if 0
      __softboundcets_printf("free =%p, ptr_key=%zx\n", ptr, ptr_key);
#endif
      __softboundcets_check_remove_from_free_map(ptr_key, ptr);
    }
  }
#endif
   free(ptr);
}


__WEAK_INLINE long int softboundcets_lrand48(){
  return lrand48();
}


/* ////////////////////Time Related Library Wrappers///////////////////////// */


__WEAK_INLINE char* softboundcets_ctime( const time_t* timep){
  
  char* ret_ptr = ctime(timep);

  if(ret_ptr == NULL){
    __softboundcets_store_null_return_metadata();
  }
  else {
    __softboundcets_store_return_metadata(ret_ptr, ret_ptr + strlen(ret_ptr) + 1, 
                                          1, __softboundcets_global_lock);
  }
  return ret_ptr;

}



__WEAK_INLINE double softboundcets_difftime(time_t time1, time_t time0) {  
  return difftime(time1, time0);
}

__WEAK_INLINE int softboundcets_toupper(int c) {

  return toupper(c);
}

__WEAK_INLINE int softboundcets_tolower(int c){

  return tolower(c);
}

__WEAK_INLINE void softboundcets_setbuf(FILE* stream, char* buf){  
  setbuf(stream, buf);
}

__WEAK_INLINE char* softboundcets_getenv(const char* name){
   
  char* ret_ptr = getenv(name);
   
  if(ret_ptr != NULL){
    __softboundcets_store_return_metadata(ret_ptr, 
                                          ret_ptr + strlen(ret_ptr) + 1, 
                                          1, __softboundcets_global_lock);
  }
  else {
    __softboundcets_store_null_return_metadata();
  }

  return ret_ptr;
}

__WEAK_INLINE int softboundcets_atexit(void_func_ptr function){
  return atexit(function);

}

#ifdef _GNU_SOURCE
__WEAK_INLINE char* softboundcets_strerror_r(int errnum, char* buf, 
                                             size_t buf_len) {

  void* ret_ptr = strerror_r(errnum, buf, buf_len);
  __softboundcets_store_return_metadata(ret_ptr, 
                                        (void*)
                                        ((char*)ret_ptr + strlen(ret_ptr) +1),
                                        1, __softboundcets_global_lock);
  return ret_ptr;
}
#endif

__WEAK_INLINE char* softboundcets_strerror(int errnum) {

  void* ret_ptr = strerror(errnum);
  __softboundcets_store_return_metadata(ret_ptr, 
                                        (void*)
                                        ((char*)ret_ptr + strlen(ret_ptr) +1),
                                        1, __softboundcets_global_lock);
  return ret_ptr;
}


__WEAK_INLINE int softboundcets_unlink(const char* pathname){
  return unlink(pathname);
}


__WEAK_INLINE int softboundcets_close(int fd) {

  return close(fd);
}


__WEAK_INLINE int softboundcets_open(const char *pathname, int flags){  
  return open(pathname, flags);

}

__WEAK_INLINE ssize_t softboundcets_read(int fd, void* buf, size_t count){
  
  return read(fd, buf, count);
}

__WEAK_INLINE ssize_t softboundcets_write(int fd, void* buf, size_t count){
  return write(fd, buf, count);
}


__WEAK_INLINE off_t softboundcets_lseek(int fildes, off_t offset, int whence) {

  return lseek(fildes, offset, whence);
}


__WEAK_INLINE int 
softboundcets_gettimeofday(struct timeval* tv, struct timezone* tz){
  return gettimeofday(tv, tz);
}


__WEAK_INLINE int 
softboundcets_select(int nfds, fd_set* readfds, fd_set* writefds,
                     fd_set* exceptfds, struct timeval* timeout){
  return select(nfds, readfds, writefds, exceptfds, timeout);
}

#if defined (__linux__)

__WEAK_INLINE char* 
softboundcets_setlocale(int category, const char* locale){
  
  void* ret_ptr = setlocale(category, locale);
  __softboundcets_store_return_metadata(ret_ptr, 
                                        (void*) 
                                        ((char*) ret_ptr+ strlen(ret_ptr)),
                                        1, __softboundcets_global_lock);
  return ret_ptr;  

}

__WEAK_INLINE char*
softboundcets_textdomain(const char* domainname){
  
  void* ret_ptr = textdomain(domainname);
  __softboundcets_store_return_metadata(ret_ptr,
                                        (void *)
                                        ((char*) ret_ptr + strlen(ret_ptr)),
                                        1, __softboundcets_global_lock);
  
  return ret_ptr;
  
}


__WEAK_INLINE char*
softboundcets_bindtextdomain(const char* domainname, const char* dirname){
  
  void* ret_ptr = bindtextdomain(domainname, dirname);
  __softboundcets_store_return_metadata(ret_ptr,
                                        (void *)
                                        ((char*) ret_ptr + strlen(ret_ptr)),
                                        1, __softboundcets_global_lock);

  return ret_ptr;

}

__WEAK_INLINE char * 
softboundcets_gettext(const char * msgid){
  
  void* ret_ptr = gettext(msgid);
  __softboundcets_store_return_metadata(ret_ptr,
                                        (void*)
                                        ((char*) ret_ptr + strlen(ret_ptr)),
                                        1, __softboundcets_global_lock);

  return ret_ptr;  

}


__WEAK_INLINE char * 
softboundcets_dcngettext (const char * domainname,
                          const char * msgid, const char * msgid_plural,
                          unsigned long int n, int category){
  
  void* ret_ptr = dcngettext(domainname, msgid, msgid_plural, n, category);
  __softboundcets_store_return_metadata(ret_ptr,
                                        (void*)
                                        ((char*) ret_ptr + strlen(ret_ptr)),
                                        1, __softboundcets_global_lock);

  return ret_ptr;  
    
}


/* IMP: struct hostent may have pointers in the structure being returned,
   we need to store the metadata for all those pointers */
__WEAK_INLINE 
struct hostent * softboundcets_gethostbyname(const char *name){
  
  struct hostent * ret_ptr = gethostbyname(name);

  void* ret_bound = ret_ptr + sizeof(struct hostent);
  __softboundcets_store_return_metadata(ret_ptr,
                                        ret_bound,
                                        1, __softboundcets_global_lock);
  
  return ret_ptr;  
}



__WEAK_INLINE char*
softboundcets_dcgettext (const char * domainname, 
                         const char * msgid,
                         int category) {

  void* ret_ptr = dcgettext(domainname, msgid, category);
  __softboundcets_store_return_metadata(ret_ptr,
                                        (void*)
                                        ((char*) ret_ptr + strlen(ret_ptr)),
                                        1, __softboundcets_global_lock);

  return ret_ptr;  
  
}

#endif

#if defined(__linux__)
__WEAK_INLINE int* softboundcets___errno_location() {
  void* ret_ptr = (int *)__errno_location();
  //  printf("ERRNO: ptr is %lx", ptrs->ptr);
  __softboundcets_store_return_metadata(ret_ptr, 
                                        (void*)((char*)ret_ptr + sizeof(int*)),
                                        1, __softboundcets_global_lock);
  
  return ret_ptr;
}

__WEAK_INLINE unsigned short const** 
softboundcets___ctype_b_loc(void) {

  unsigned short const** ret_ptr =__ctype_b_loc();
  __softboundcets_store_return_metadata((void*) ret_ptr, 
                                        (void*)
                                        ((char*) ret_ptr + sizeof(int*)), 
                                        1, __softboundcets_global_lock);
  return ret_ptr;
}

__WEAK_INLINE int const**  softboundcets___ctype_toupper_loc(void) {
  
  int const ** ret_ptr  =  __ctype_toupper_loc();  
  __softboundcets_store_return_metadata((void*) ret_ptr, 
                                        (void*)
                                        ((char*)ret_ptr + sizeof(int*)), 
                                        1, __softboundcets_global_lock);
  return ret_ptr;

}


__WEAK_INLINE int const**  softboundcets___ctype_tolower_loc(void) {
  
  int const ** ret_ptr  =  __ctype_tolower_loc();  
  __softboundcets_store_return_metadata((void*) ret_ptr, 
                                        (void*) ((char*)ret_ptr + sizeof(int*)),
                                        1, __softboundcets_global_lock);
  return ret_ptr;

}
#endif

/* This is a custom implementation of qsort */

static int 
compare_elements_helper(void* base, size_t element_size, 
                        int idx1, int idx2, 
                        int (*comparer)(const void*, const void*)){
  
  char* base_bytes = base;
  return comparer(&base_bytes[idx1 * element_size], 
                  &base_bytes[idx2*element_size]);
}

#define element_less_than(i,j) (compare_elements_helper(base, element_size, (i), (j), comparer) < 0)

static void 
exchange_elements_helper(void* base, size_t element_size, 
                         int idx1, int idx2){

  char* base_bytes = base;
  size_t i;

  for (i=0; i < element_size; i++){
    char temp = base_bytes[idx1* element_size + i];
    base_bytes[idx1 * element_size + i] = base_bytes[idx2 * element_size + i];
    base_bytes[idx2 * element_size + i] = temp;
  }  

  for(i=0; i < element_size; i+= 8){
    void* base_idx1;
    void* bound_idx1;

    void* base_idx2;
    void* bound_idx2;

    size_t key_idx1=1;
    size_t key_idx2=1;

    void* lock_idx1=NULL;
    void* lock_idx2=NULL;

    char* addr_idx1 = &base_bytes[idx1 * element_size + i];
    char* addr_idx2 = &base_bytes[idx2 * element_size + i];

    //    printf("addr_idx1= %p, addr_idx2=%p\n", addr_idx1, addr_idx2);

#ifdef __SOFTBOUNDCETS_SPATIAL
    __softboundcets_metadata_load(addr_idx1, &base_idx1, &bound_idx1);
    __softboundcets_metadata_load(addr_idx2, &base_idx2, &bound_idx2);

    __softboundcets_metadata_store(addr_idx1, base_idx2, bound_idx2);
    __softboundcets_metadata_store(addr_idx2, base_idx1, bound_idx1);

#elif __SOFTBOUNDCETS_TEMPORAL

    __softboundcets_metadata_load(addr_idx1, &key_idx1, &lock_idx1);
    __softboundcets_metadata_load(addr_idx2, &key_idx2, &lock_idx2);

    __softboundcets_metadata_store(addr_idx1, key_idx2, lock_idx2);
    __softboundcets_metadata_store(addr_idx2, key_idx1, lock_idx1);

#elif __SOFTBOUNDCETS_SPATIAL_TEMPORAL
    
    __softboundcets_metadata_load(addr_idx1, &base_idx1, &bound_idx1, 
                                  &key_idx1, &lock_idx1);
    __softboundcets_metadata_load(addr_idx2, &base_idx2, &bound_idx2, 
                                  &key_idx2, &lock_idx2);

    __softboundcets_metadata_store(addr_idx1, base_idx2, bound_idx2, 
                                   key_idx2, lock_idx2);
    __softboundcets_metadata_store(addr_idx2, base_idx1, bound_idx1, 
                                   key_idx1, lock_idx1);

#else
    __softboundcets_printf("not implemented\n");
    __softboundcets_abort();
#endif
        
  }

}

#define exchange_elements(i,j) (exchange_elements_helper(base, element_size, (i), (j)))

#define MIN_QSORT_LIST_SIZE 32

void my_qsort(void* base, size_t num_elements, 
              size_t element_size, 
              int (*comparer)(const void*, const void*)){

  size_t i;

  for(i = 0; i < num_elements; i++){
    int j;
    for (j = i - 1; j >= 0; j--){      
      if(element_less_than(j, j + 1)) break;
      exchange_elements(j, j + 1);
    }
  }
  /* may be implement qsort here */

}


__WEAK_INLINE void 
softboundcets_qsort(void* base, size_t nmemb, size_t size, 
                    int (*compar)(const void*, const void*)){

  my_qsort(base, nmemb, size, compar);
}

#if defined(__linux__)

__WEAK_INLINE 
void softboundcets__obstack_newchunk(struct obstack *obj, int b){
  
  _obstack_newchunk(obj, b);
}

__WEAK_INLINE
int softboundcets__obstack_begin(struct obstack * obj, int a, int b, 
                                 void *(foo) (long), void (bar) (void *)){
  return _obstack_begin(obj, a, b, foo, bar);
}

__WEAK_INLINE
void softboundcets_obstack_free(struct obstack *obj, void *object){
  obstack_free(obj, object);
}


__WEAK_INLINE 
char * softboundcets_nl_langinfo(nl_item item){
  
  char* ret_ptr = nl_langinfo(item);

  __softboundcets_store_return_metadata(ret_ptr, 
                                        ret_ptr + 1024 * 1024,
                                        1, __softboundcets_global_lock);
  
  return ret_ptr;
}

__WEAK_INLINE
int softboundcets_clock_gettime(clockid_t clk_id, struct timespec *tp){
  return clock_gettime(clk_id, tp);
}

#endif

#if 0

int softboundcets__obstack_memory_used(struct obstack *h){
  return _obstack_memory_used(h);
}

#endif
