mirror of https://github.com/citusdata/citus.git
Deleted Safeclib files and created symbolic link safeclib instead (#5651)
* made a new symbolic link for safeclib and deleted safeclib files. Currently WIP * added safeclib path to OBJS paths. Columnar successfully builds but Citus build still failspull/5665/head
parent
94830c9478
commit
ce4056ffd8
|
@ -1,10 +1,16 @@
|
||||||
|
#SUBDIRS = . safeclib
|
||||||
|
#OBJS += \
|
||||||
|
$(patsubst $(citus_abs_srcdir)/%.c,%.o,$(foreach dir,$(SUBDIRS), $(sort $(wildcard $(citus_abs_srcdir)/$(dir)/*.c))))
|
||||||
|
|
||||||
|
safestringlib_srcdir = $(citus_abs_top_srcdir)/vendor/safestringlib
|
||||||
MODULE_big = columnar
|
MODULE_big = columnar
|
||||||
OBJS = mem_primitives_lib.o \
|
|
||||||
memcpy_s.o \
|
OBJS = safeclib/mem_primitives_lib.o \
|
||||||
safe_str_constraint.o \
|
safeclib/memcpy_s.o \
|
||||||
safe_mem_constraint.o \
|
safeclib/safe_str_constraint.o \
|
||||||
ignore_handler_s.o \
|
safeclib/safe_mem_constraint.o \
|
||||||
abort_handler_s.o \
|
safeclib/ignore_handler_s.o \
|
||||||
|
safeclib/abort_handler_s.o \
|
||||||
columnar.o \
|
columnar.o \
|
||||||
columnar_tableam.o \
|
columnar_tableam.o \
|
||||||
columnar_storage.o \
|
columnar_storage.o \
|
||||||
|
@ -17,7 +23,6 @@ OBJS = mem_primitives_lib.o \
|
||||||
mod.o \
|
mod.o \
|
||||||
write_state_management.o
|
write_state_management.o
|
||||||
|
|
||||||
safestringlib_srcdir = $(citus_abs_top_srcdir)/vendor/safestringlib
|
|
||||||
PG_CPPFLAGS += -I$(libpq_srcdir) -I$(safestringlib_srcdir)/include
|
PG_CPPFLAGS += -I$(libpq_srcdir) -I$(safestringlib_srcdir)/include
|
||||||
EXTENSION = columnar
|
EXTENSION = columnar
|
||||||
|
|
||||||
|
|
|
@ -1,74 +0,0 @@
|
||||||
/*------------------------------------------------------------------
|
|
||||||
* abort_handler_s.c
|
|
||||||
*
|
|
||||||
* 2012, Jonathan Toppins <jtoppins@users.sourceforge.net>
|
|
||||||
*
|
|
||||||
* Copyright (c) 2012 Cisco Systems
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person
|
|
||||||
* obtaining a copy of this software and associated documentation
|
|
||||||
* files (the "Software"), to deal in 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:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be
|
|
||||||
* included in all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* 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 AUTHORS 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 IN THE SOFTWARE.
|
|
||||||
*------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "safeclib_private.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* NAME
|
|
||||||
* abort_handler_s
|
|
||||||
*
|
|
||||||
* SYNOPSIS
|
|
||||||
* #include "safe_lib.h"
|
|
||||||
* void abort_handler_s(const char *msg, void *ptr, errno_t error)
|
|
||||||
*
|
|
||||||
* DESCRIPTION
|
|
||||||
* This function writes a message on the standard error stream in
|
|
||||||
* an implementation-defined format. The message shall include the
|
|
||||||
* string pointed to by msg. The abort_handler_s function then calls
|
|
||||||
* the abort function.
|
|
||||||
*
|
|
||||||
* SPECIFIED IN
|
|
||||||
* ISO/IEC JTC1 SC22 WG14 N1172, Programming languages, environments
|
|
||||||
* and system software interfaces, Extensions to the C Library,
|
|
||||||
* Part I: Bounds-checking interfaces
|
|
||||||
*
|
|
||||||
* INPUT PARAMETERS
|
|
||||||
* msg Pointer to the message describing the error
|
|
||||||
*
|
|
||||||
* ptr Pointer to aassociated data. Can be NULL.
|
|
||||||
*
|
|
||||||
* error The error code encountered.
|
|
||||||
*
|
|
||||||
* RETURN VALUE
|
|
||||||
* Does not return to caller.
|
|
||||||
*
|
|
||||||
* ALSO SEE
|
|
||||||
* ignore_handler_s()
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
void abort_handler_s(const char *msg, void *ptr, errno_t error)
|
|
||||||
{
|
|
||||||
slprintf("ABORT CONSTRAINT HANDLER: (%u) %s\n", error,
|
|
||||||
(msg) ? msg : "Null message");
|
|
||||||
slabort();
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(abort_handler_s)
|
|
|
@ -1,72 +0,0 @@
|
||||||
/*------------------------------------------------------------------
|
|
||||||
* ignore_handler_s.c
|
|
||||||
*
|
|
||||||
* 2012, Jonathan Toppins <jtoppins@users.sourceforge.net>
|
|
||||||
*
|
|
||||||
* Copyright (c) 2012 Cisco Systems
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person
|
|
||||||
* obtaining a copy of this software and associated documentation
|
|
||||||
* files (the "Software"), to deal in 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:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be
|
|
||||||
* included in all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* 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 AUTHORS 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 IN THE SOFTWARE.
|
|
||||||
*------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "safeclib_private.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* NAME
|
|
||||||
* ignore_handler_s
|
|
||||||
*
|
|
||||||
* SYNOPSIS
|
|
||||||
* #include "safe_lib.h"
|
|
||||||
* void ignore_handler_s(const char *msg, void *ptr, errno_t error)
|
|
||||||
*
|
|
||||||
* DESCRIPTION
|
|
||||||
* This function simply returns to the caller.
|
|
||||||
*
|
|
||||||
* SPECIFIED IN
|
|
||||||
* ISO/IEC JTC1 SC22 WG14 N1172, Programming languages, environments
|
|
||||||
* and system software interfaces, Extensions to the C Library,
|
|
||||||
* Part I: Bounds-checking interfaces
|
|
||||||
*
|
|
||||||
* INPUT PARAMETERS
|
|
||||||
* msg Pointer to the message describing the error
|
|
||||||
*
|
|
||||||
* ptr Pointer to aassociated data. Can be NULL.
|
|
||||||
*
|
|
||||||
* error The error code encountered.
|
|
||||||
*
|
|
||||||
* RETURN VALUE
|
|
||||||
* Returns no value.
|
|
||||||
*
|
|
||||||
* ALSO SEE
|
|
||||||
* abort_handler_s()
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
void ignore_handler_s(const char *msg, void *ptr, errno_t error)
|
|
||||||
{
|
|
||||||
|
|
||||||
sldebug_printf("IGNORE CONSTRAINT HANDLER: (%u) %s\n", error,
|
|
||||||
(msg) ? msg : "Null message");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(ignore_handler_s)
|
|
|
@ -1,855 +0,0 @@
|
||||||
/*------------------------------------------------------------------
|
|
||||||
* mem_primitives_lib.c - Unguarded Memory Copy Routines
|
|
||||||
*
|
|
||||||
* February 2005, Bo Berry
|
|
||||||
*
|
|
||||||
* Copyright (c) 2005-2009 Cisco Systems
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person
|
|
||||||
* obtaining a copy of this software and associated documentation
|
|
||||||
* files (the "Software"), to deal in 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:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be
|
|
||||||
* included in all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* 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 AUTHORS 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 IN THE SOFTWARE.
|
|
||||||
*------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "mem_primitives_lib.h"
|
|
||||||
|
|
||||||
#pragma GCC diagnostic ignored "-Wpragmas"
|
|
||||||
#pragma GCC diagnostic ignored "-Wimplicit-fallthrough"
|
|
||||||
/*
|
|
||||||
* mem_primitives_lib.c provides unguarded memory routines
|
|
||||||
* that are used by the safe_mem_library. These routines
|
|
||||||
* may also be used by an application, but the application
|
|
||||||
* is responsible for all parameter validation and alignment.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* NAME
|
|
||||||
* mem_prim_set - Sets memory to value
|
|
||||||
*
|
|
||||||
* SYNOPSIS
|
|
||||||
* #include "mem_primitives_lib.h"
|
|
||||||
* void
|
|
||||||
* mem_prim_set(void *dest, uint32_t len, uint8_t value)
|
|
||||||
*
|
|
||||||
* DESCRIPTION
|
|
||||||
* Sets len bytes starting at dest to the specified value
|
|
||||||
*
|
|
||||||
* INPUT PARAMETERS
|
|
||||||
* dest - pointer to memory that will be set to value
|
|
||||||
*
|
|
||||||
* len - number of bytes to be set
|
|
||||||
*
|
|
||||||
* value - byte value
|
|
||||||
*
|
|
||||||
* OUTPUT PARAMETERS
|
|
||||||
* dest - is updated
|
|
||||||
*
|
|
||||||
* RETURN VALUE
|
|
||||||
* none
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
mem_prim_set (void *dest, uint32_t len, uint8_t value)
|
|
||||||
{
|
|
||||||
uint8_t *dp;
|
|
||||||
uint32_t count;
|
|
||||||
uint32_t lcount;
|
|
||||||
|
|
||||||
uint32_t *lp;
|
|
||||||
uint32_t value32;
|
|
||||||
|
|
||||||
count = len;
|
|
||||||
|
|
||||||
dp = dest;
|
|
||||||
|
|
||||||
value32 = value | (value << 8) | (value << 16) | (value << 24);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* First, do the few bytes to get uint32_t aligned.
|
|
||||||
*/
|
|
||||||
for (; count && ( (uintptr_t)dp & (sizeof(uint32_t)-1) ); count--) {
|
|
||||||
*dp++ = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Then do the uint32_ts, unrolled the loop for performance
|
|
||||||
*/
|
|
||||||
lp = (uint32_t *)dp;
|
|
||||||
lcount = count >> 2;
|
|
||||||
|
|
||||||
while (lcount != 0) {
|
|
||||||
|
|
||||||
switch (lcount) {
|
|
||||||
/*
|
|
||||||
* Here we do blocks of 8. Once the remaining count
|
|
||||||
* drops below 8, take the fast track to finish up.
|
|
||||||
*/
|
|
||||||
default:
|
|
||||||
*lp++ = value32; *lp++ = value32; *lp++ = value32; *lp++ = value32;
|
|
||||||
*lp++ = value32; *lp++ = value32; *lp++ = value32; *lp++ = value32;
|
|
||||||
*lp++ = value32; *lp++ = value32; *lp++ = value32; *lp++ = value32;
|
|
||||||
*lp++ = value32; *lp++ = value32; *lp++ = value32; *lp++ = value32;
|
|
||||||
lcount -= 16;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 15: *lp++ = value32;
|
|
||||||
case 14: *lp++ = value32;
|
|
||||||
case 13: *lp++ = value32;
|
|
||||||
case 12: *lp++ = value32;
|
|
||||||
case 11: *lp++ = value32;
|
|
||||||
case 10: *lp++ = value32;
|
|
||||||
case 9: *lp++ = value32;
|
|
||||||
case 8: *lp++ = value32;
|
|
||||||
|
|
||||||
case 7: *lp++ = value32;
|
|
||||||
case 6: *lp++ = value32;
|
|
||||||
case 5: *lp++ = value32;
|
|
||||||
case 4: *lp++ = value32;
|
|
||||||
case 3: *lp++ = value32;
|
|
||||||
case 2: *lp++ = value32;
|
|
||||||
case 1: *lp++ = value32;
|
|
||||||
lcount = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} /* end while */
|
|
||||||
|
|
||||||
|
|
||||||
dp = (uint8_t *)lp;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* compute the number of remaining bytes
|
|
||||||
*/
|
|
||||||
count &= (sizeof(uint32_t)-1);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* remaining bytes
|
|
||||||
*/
|
|
||||||
for (; count; dp++, count--) {
|
|
||||||
*dp = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* NAME
|
|
||||||
* mem_prim_set16 - Sets memory to value
|
|
||||||
*
|
|
||||||
* SYNOPSIS
|
|
||||||
* #include "mem_primitives_lib.h"
|
|
||||||
* void
|
|
||||||
* mem_prim_set16(uint16_t *dp, uint32_t len, uint16_t value)
|
|
||||||
*
|
|
||||||
* DESCRIPTION
|
|
||||||
* Sets len uint16_ts starting at dest to the specified value.
|
|
||||||
* Pointers must meet system alignment requirements.
|
|
||||||
*
|
|
||||||
* INPUT PARAMETERS
|
|
||||||
* dest - pointer to memory that will be set to value
|
|
||||||
*
|
|
||||||
* len - number of uint16_ts to be set
|
|
||||||
*
|
|
||||||
* value - uint16_t value
|
|
||||||
*
|
|
||||||
* OUTPUT PARAMETERS
|
|
||||||
* dest - is updated
|
|
||||||
*
|
|
||||||
* RETURN VALUE
|
|
||||||
* none
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
mem_prim_set16 (uint16_t *dp, uint32_t len, uint16_t value)
|
|
||||||
{
|
|
||||||
|
|
||||||
while (len != 0) {
|
|
||||||
|
|
||||||
switch (len) {
|
|
||||||
/*
|
|
||||||
* Here we do blocks of 8. Once the remaining count
|
|
||||||
* drops below 8, take the fast track to finish up.
|
|
||||||
*/
|
|
||||||
default:
|
|
||||||
*dp++ = value; *dp++ = value; *dp++ = value; *dp++ = value;
|
|
||||||
*dp++ = value; *dp++ = value; *dp++ = value; *dp++ = value;
|
|
||||||
*dp++ = value; *dp++ = value; *dp++ = value; *dp++ = value;
|
|
||||||
*dp++ = value; *dp++ = value; *dp++ = value; *dp++ = value;
|
|
||||||
len -= 16;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 15: *dp++ = value;
|
|
||||||
case 14: *dp++ = value;
|
|
||||||
case 13: *dp++ = value;
|
|
||||||
case 12: *dp++ = value;
|
|
||||||
case 11: *dp++ = value;
|
|
||||||
case 10: *dp++ = value;
|
|
||||||
case 9: *dp++ = value;
|
|
||||||
case 8: *dp++ = value;
|
|
||||||
|
|
||||||
case 7: *dp++ = value;
|
|
||||||
case 6: *dp++ = value;
|
|
||||||
case 5: *dp++ = value;
|
|
||||||
case 4: *dp++ = value;
|
|
||||||
case 3: *dp++ = value;
|
|
||||||
case 2: *dp++ = value;
|
|
||||||
case 1: *dp++ = value;
|
|
||||||
len = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} /* end while */
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* NAME
|
|
||||||
* mem_prim_set32 - Sets memory to the uint32_t value
|
|
||||||
*
|
|
||||||
* SYNOPSIS
|
|
||||||
* #include "mem_primitives_lib.h"
|
|
||||||
* void
|
|
||||||
* mem_prim_set32(uint32_t *dp, uint32_t len, uint32_t value)
|
|
||||||
*
|
|
||||||
* DESCRIPTION
|
|
||||||
* Sets len uint32_ts starting at dest to the specified value
|
|
||||||
* Pointers must meet system alignment requirements.
|
|
||||||
*
|
|
||||||
* INPUT PARAMETERS
|
|
||||||
* dest - pointer to memory that will be set to value
|
|
||||||
*
|
|
||||||
* len - number of uint32_ts to be set
|
|
||||||
*
|
|
||||||
* value - uint32_t value
|
|
||||||
*
|
|
||||||
* OUTPUT PARAMETERS
|
|
||||||
* dest - is updated
|
|
||||||
*
|
|
||||||
* RETURN VALUE
|
|
||||||
* none
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
mem_prim_set32 (uint32_t *dp, uint32_t len, uint32_t value)
|
|
||||||
{
|
|
||||||
|
|
||||||
while (len != 0) {
|
|
||||||
|
|
||||||
switch (len) {
|
|
||||||
/*
|
|
||||||
* Here we do blocks of 8. Once the remaining count
|
|
||||||
* drops below 8, take the fast track to finish up.
|
|
||||||
*/
|
|
||||||
default:
|
|
||||||
*dp++ = value; *dp++ = value; *dp++ = value; *dp++ = value;
|
|
||||||
*dp++ = value; *dp++ = value; *dp++ = value; *dp++ = value;
|
|
||||||
*dp++ = value; *dp++ = value; *dp++ = value; *dp++ = value;
|
|
||||||
*dp++ = value; *dp++ = value; *dp++ = value; *dp++ = value;
|
|
||||||
len -= 16;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 15: *dp++ = value;
|
|
||||||
case 14: *dp++ = value;
|
|
||||||
case 13: *dp++ = value;
|
|
||||||
case 12: *dp++ = value;
|
|
||||||
case 11: *dp++ = value;
|
|
||||||
case 10: *dp++ = value;
|
|
||||||
case 9: *dp++ = value;
|
|
||||||
case 8: *dp++ = value;
|
|
||||||
|
|
||||||
case 7: *dp++ = value;
|
|
||||||
case 6: *dp++ = value;
|
|
||||||
case 5: *dp++ = value;
|
|
||||||
case 4: *dp++ = value;
|
|
||||||
case 3: *dp++ = value;
|
|
||||||
case 2: *dp++ = value;
|
|
||||||
case 1: *dp++ = value;
|
|
||||||
len = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} /* end while */
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* NAME
|
|
||||||
* mem_prim_move - Move (handles overlap) memory
|
|
||||||
*
|
|
||||||
* SYNOPSIS
|
|
||||||
* #include "mem_primitives_lib.h"
|
|
||||||
* void
|
|
||||||
* mem_prim_move(void *dest, const void *src, uint32_t len)
|
|
||||||
*
|
|
||||||
* DESCRIPTION
|
|
||||||
* Moves at most slen bytes from src to dest, up to dmax
|
|
||||||
* bytes. Dest may overlap with src.
|
|
||||||
*
|
|
||||||
* INPUT PARAMETERS
|
|
||||||
* dest - pointer to the memory that will be replaced by src.
|
|
||||||
*
|
|
||||||
* src - pointer to the memory that will be copied
|
|
||||||
* to dest
|
|
||||||
*
|
|
||||||
* len - maximum number bytes of src that can be copied
|
|
||||||
*
|
|
||||||
* OUTPUT PARAMETERS
|
|
||||||
* dest - is updated
|
|
||||||
*
|
|
||||||
* RETURN VALUE
|
|
||||||
* none
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
mem_prim_move (void *dest, const void *src, uint32_t len)
|
|
||||||
{
|
|
||||||
|
|
||||||
#define wsize sizeof(uint32_t)
|
|
||||||
#define wmask (wsize - 1)
|
|
||||||
|
|
||||||
uint8_t *dp = dest;
|
|
||||||
const uint8_t *sp = src;
|
|
||||||
|
|
||||||
uint32_t tsp;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Determine if we need to copy forward or backward (overlap)
|
|
||||||
*/
|
|
||||||
if ((uintptr_t)dp < (uintptr_t)sp) {
|
|
||||||
/*
|
|
||||||
* Copy forward.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* get a working copy of src for bit operations
|
|
||||||
*/
|
|
||||||
tsp = (uintptr_t)sp;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Try to align both operands. This cannot be done
|
|
||||||
* unless the low bits match.
|
|
||||||
*/
|
|
||||||
if ((tsp | (uintptr_t)dp) & wmask) {
|
|
||||||
/*
|
|
||||||
* determine how many bytes to copy to align operands
|
|
||||||
*/
|
|
||||||
if ((tsp ^ (uintptr_t)dp) & wmask || len < wsize) {
|
|
||||||
tsp = len;
|
|
||||||
|
|
||||||
} else {
|
|
||||||
tsp = wsize - (tsp & wmask);
|
|
||||||
}
|
|
||||||
|
|
||||||
len -= tsp;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* make the alignment
|
|
||||||
*/
|
|
||||||
do {
|
|
||||||
*dp++ = *sp++;
|
|
||||||
} while (--tsp);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Now copy, then mop up any trailing bytes.
|
|
||||||
*/
|
|
||||||
tsp = len / wsize;
|
|
||||||
|
|
||||||
if (tsp > 0) {
|
|
||||||
|
|
||||||
do {
|
|
||||||
*(uint32_t *)dp = *(uint32_t *)sp;
|
|
||||||
|
|
||||||
sp += wsize;
|
|
||||||
dp += wsize;
|
|
||||||
} while (--tsp);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* copy over the remaining bytes and we're done
|
|
||||||
*/
|
|
||||||
tsp = len & wmask;
|
|
||||||
|
|
||||||
if (tsp > 0) {
|
|
||||||
do {
|
|
||||||
*dp++ = *sp++;
|
|
||||||
} while (--tsp);
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
|
||||||
/*
|
|
||||||
* This section is used to copy backwards, to handle any
|
|
||||||
* overlap. The alignment requires (tps&wmask) bytes to
|
|
||||||
* align.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* go to end of the memory to copy
|
|
||||||
*/
|
|
||||||
sp += len;
|
|
||||||
dp += len;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* get a working copy of src for bit operations
|
|
||||||
*/
|
|
||||||
tsp = (uintptr_t)sp;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Try to align both operands.
|
|
||||||
*/
|
|
||||||
if ((tsp | (uintptr_t)dp) & wmask) {
|
|
||||||
|
|
||||||
if ((tsp ^ (uintptr_t)dp) & wmask || len <= wsize) {
|
|
||||||
tsp = len;
|
|
||||||
} else {
|
|
||||||
tsp &= wmask;
|
|
||||||
}
|
|
||||||
|
|
||||||
len -= tsp;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* make the alignment
|
|
||||||
*/
|
|
||||||
do {
|
|
||||||
*--dp = *--sp;
|
|
||||||
} while (--tsp);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Now copy in uint32_t units, then mop up any trailing bytes.
|
|
||||||
*/
|
|
||||||
tsp = len / wsize;
|
|
||||||
|
|
||||||
if (tsp > 0) {
|
|
||||||
do {
|
|
||||||
sp -= wsize;
|
|
||||||
dp -= wsize;
|
|
||||||
|
|
||||||
*(uint32_t *)dp = *(uint32_t *)sp;
|
|
||||||
} while (--tsp);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* copy over the remaining bytes and we're done
|
|
||||||
*/
|
|
||||||
tsp = len & wmask;
|
|
||||||
if (tsp > 0) {
|
|
||||||
tsp = len & wmask;
|
|
||||||
do {
|
|
||||||
*--dp = *--sp;
|
|
||||||
} while (--tsp);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* NAME
|
|
||||||
* mem_prim_move8 - Move (handles overlap) memory
|
|
||||||
*
|
|
||||||
* SYNOPSIS
|
|
||||||
* #include "mem_primitives_lib.h"
|
|
||||||
* void
|
|
||||||
* mem_prim_move8(void *dest, const void *src, uint32_t len)
|
|
||||||
*
|
|
||||||
* DESCRIPTION
|
|
||||||
* Moves at most len uint8_ts from sp to dp.
|
|
||||||
* The destination may overlap with source.
|
|
||||||
*
|
|
||||||
* INPUT PARAMETERS
|
|
||||||
* dp - pointer to the memory that will be replaced by sp.
|
|
||||||
*
|
|
||||||
* sp - pointer to the memory that will be copied
|
|
||||||
* to dp
|
|
||||||
*
|
|
||||||
* len - maximum number uint8_t of sp that can be copied
|
|
||||||
*
|
|
||||||
* OUTPUT PARAMETERS
|
|
||||||
* dp - pointer to the memory that will be replaced by sp.
|
|
||||||
*
|
|
||||||
* RETURN VALUE
|
|
||||||
* none
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
mem_prim_move8 (uint8_t *dp, const uint8_t *sp, uint32_t len)
|
|
||||||
{
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Determine if we need to copy forward or backward (overlap)
|
|
||||||
*/
|
|
||||||
if (dp < sp) {
|
|
||||||
/*
|
|
||||||
* Copy forward.
|
|
||||||
*/
|
|
||||||
|
|
||||||
while (len != 0) {
|
|
||||||
|
|
||||||
switch (len) {
|
|
||||||
/*
|
|
||||||
* Here we do blocks of 8. Once the remaining count
|
|
||||||
* drops below 8, take the fast track to finish up.
|
|
||||||
*/
|
|
||||||
default:
|
|
||||||
*dp++ = *sp++; *dp++ = *sp++; *dp++ = *sp++; *dp++ = *sp++;
|
|
||||||
*dp++ = *sp++; *dp++ = *sp++; *dp++ = *sp++; *dp++ = *sp++;
|
|
||||||
*dp++ = *sp++; *dp++ = *sp++; *dp++ = *sp++; *dp++ = *sp++;
|
|
||||||
*dp++ = *sp++; *dp++ = *sp++; *dp++ = *sp++; *dp++ = *sp++;
|
|
||||||
len -= 16;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 15: *dp++ = *sp++;
|
|
||||||
case 14: *dp++ = *sp++;
|
|
||||||
case 13: *dp++ = *sp++;
|
|
||||||
case 12: *dp++ = *sp++;
|
|
||||||
case 11: *dp++ = *sp++;
|
|
||||||
case 10: *dp++ = *sp++;
|
|
||||||
case 9: *dp++ = *sp++;
|
|
||||||
case 8: *dp++ = *sp++;
|
|
||||||
|
|
||||||
case 7: *dp++ = *sp++;
|
|
||||||
case 6: *dp++ = *sp++;
|
|
||||||
case 5: *dp++ = *sp++;
|
|
||||||
case 4: *dp++ = *sp++;
|
|
||||||
case 3: *dp++ = *sp++;
|
|
||||||
case 2: *dp++ = *sp++;
|
|
||||||
case 1: *dp++ = *sp++;
|
|
||||||
len = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} /* end while */
|
|
||||||
|
|
||||||
} else {
|
|
||||||
/*
|
|
||||||
* This section is used to copy backwards, to handle any
|
|
||||||
* overlap. The alignment requires (tps&wmask) bytes to
|
|
||||||
* align.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* go to end of the memory to copy
|
|
||||||
*/
|
|
||||||
sp += len;
|
|
||||||
dp += len;
|
|
||||||
|
|
||||||
while (len != 0) {
|
|
||||||
|
|
||||||
switch (len) {
|
|
||||||
/*
|
|
||||||
* Here we do blocks of 8. Once the remaining count
|
|
||||||
* drops below 8, take the fast track to finish up.
|
|
||||||
*/
|
|
||||||
default:
|
|
||||||
*--dp = *--sp; *--dp = *--sp; *--dp = *--sp; *--dp = *--sp;
|
|
||||||
*--dp = *--sp; *--dp = *--sp; *--dp = *--sp; *--dp = *--sp;
|
|
||||||
*--dp = *--sp; *--dp = *--sp; *--dp = *--sp; *--dp = *--sp;
|
|
||||||
*--dp = *--sp; *--dp = *--sp; *--dp = *--sp; *--dp = *--sp;
|
|
||||||
len -= 16;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 15: *--dp = *--sp;
|
|
||||||
case 14: *--dp = *--sp;
|
|
||||||
case 13: *--dp = *--sp;
|
|
||||||
case 12: *--dp = *--sp;
|
|
||||||
case 11: *--dp = *--sp;
|
|
||||||
case 10: *--dp = *--sp;
|
|
||||||
case 9: *--dp = *--sp;
|
|
||||||
case 8: *--dp = *--sp;
|
|
||||||
|
|
||||||
case 7: *--dp = *--sp;
|
|
||||||
case 6: *--dp = *--sp;
|
|
||||||
case 5: *--dp = *--sp;
|
|
||||||
case 4: *--dp = *--sp;
|
|
||||||
case 3: *--dp = *--sp;
|
|
||||||
case 2: *--dp = *--sp;
|
|
||||||
case 1: *--dp = *--sp;
|
|
||||||
len = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} /* end while */
|
|
||||||
}
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* NAME
|
|
||||||
* mem_prim_move16 - Move (handles overlap) memory
|
|
||||||
*
|
|
||||||
* SYNOPSIS
|
|
||||||
* #include "mem_primitives_lib.h"
|
|
||||||
* void
|
|
||||||
* mem_prim_move16(void *dest, const void *src, uint32_t len)
|
|
||||||
*
|
|
||||||
* DESCRIPTION
|
|
||||||
* Moves at most len uint16_ts from sp to dp.
|
|
||||||
* The destination may overlap with source.
|
|
||||||
*
|
|
||||||
* INPUT PARAMETERS
|
|
||||||
* dp - pointer to the memory that will be replaced by sp.
|
|
||||||
*
|
|
||||||
* sp - pointer to the memory that will be copied
|
|
||||||
* to dp
|
|
||||||
*
|
|
||||||
* len - maximum number uint16_t of sp that can be copied
|
|
||||||
*
|
|
||||||
* OUTPUT PARAMETERS
|
|
||||||
* dp - is updated
|
|
||||||
*
|
|
||||||
* RETURN VALUE
|
|
||||||
* none
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
mem_prim_move16 (uint16_t *dp, const uint16_t *sp, uint32_t len)
|
|
||||||
{
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Determine if we need to copy forward or backward (overlap)
|
|
||||||
*/
|
|
||||||
if (dp < sp) {
|
|
||||||
/*
|
|
||||||
* Copy forward.
|
|
||||||
*/
|
|
||||||
|
|
||||||
while (len != 0) {
|
|
||||||
|
|
||||||
switch (len) {
|
|
||||||
/*
|
|
||||||
* Here we do blocks of 8. Once the remaining count
|
|
||||||
* drops below 8, take the fast track to finish up.
|
|
||||||
*/
|
|
||||||
default:
|
|
||||||
*dp++ = *sp++; *dp++ = *sp++; *dp++ = *sp++; *dp++ = *sp++;
|
|
||||||
*dp++ = *sp++; *dp++ = *sp++; *dp++ = *sp++; *dp++ = *sp++;
|
|
||||||
*dp++ = *sp++; *dp++ = *sp++; *dp++ = *sp++; *dp++ = *sp++;
|
|
||||||
*dp++ = *sp++; *dp++ = *sp++; *dp++ = *sp++; *dp++ = *sp++;
|
|
||||||
len -= 16;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 15: *dp++ = *sp++;
|
|
||||||
case 14: *dp++ = *sp++;
|
|
||||||
case 13: *dp++ = *sp++;
|
|
||||||
case 12: *dp++ = *sp++;
|
|
||||||
case 11: *dp++ = *sp++;
|
|
||||||
case 10: *dp++ = *sp++;
|
|
||||||
case 9: *dp++ = *sp++;
|
|
||||||
case 8: *dp++ = *sp++;
|
|
||||||
|
|
||||||
case 7: *dp++ = *sp++;
|
|
||||||
case 6: *dp++ = *sp++;
|
|
||||||
case 5: *dp++ = *sp++;
|
|
||||||
case 4: *dp++ = *sp++;
|
|
||||||
case 3: *dp++ = *sp++;
|
|
||||||
case 2: *dp++ = *sp++;
|
|
||||||
case 1: *dp++ = *sp++;
|
|
||||||
len = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} /* end while */
|
|
||||||
|
|
||||||
} else {
|
|
||||||
/*
|
|
||||||
* This section is used to copy backwards, to handle any
|
|
||||||
* overlap. The alignment requires (tps&wmask) bytes to
|
|
||||||
* align.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* go to end of the memory to copy
|
|
||||||
*/
|
|
||||||
sp += len;
|
|
||||||
dp += len;
|
|
||||||
|
|
||||||
while (len != 0) {
|
|
||||||
|
|
||||||
switch (len) {
|
|
||||||
/*
|
|
||||||
* Here we do blocks of 8. Once the remaining count
|
|
||||||
* drops below 8, take the fast track to finish up.
|
|
||||||
*/
|
|
||||||
default:
|
|
||||||
*--dp = *--sp; *--dp = *--sp; *--dp = *--sp; *--dp = *--sp;
|
|
||||||
*--dp = *--sp; *--dp = *--sp; *--dp = *--sp; *--dp = *--sp;
|
|
||||||
*--dp = *--sp; *--dp = *--sp; *--dp = *--sp; *--dp = *--sp;
|
|
||||||
*--dp = *--sp; *--dp = *--sp; *--dp = *--sp; *--dp = *--sp;
|
|
||||||
len -= 16;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 15: *--dp = *--sp;
|
|
||||||
case 14: *--dp = *--sp;
|
|
||||||
case 13: *--dp = *--sp;
|
|
||||||
case 12: *--dp = *--sp;
|
|
||||||
case 11: *--dp = *--sp;
|
|
||||||
case 10: *--dp = *--sp;
|
|
||||||
case 9: *--dp = *--sp;
|
|
||||||
case 8: *--dp = *--sp;
|
|
||||||
|
|
||||||
case 7: *--dp = *--sp;
|
|
||||||
case 6: *--dp = *--sp;
|
|
||||||
case 5: *--dp = *--sp;
|
|
||||||
case 4: *--dp = *--sp;
|
|
||||||
case 3: *--dp = *--sp;
|
|
||||||
case 2: *--dp = *--sp;
|
|
||||||
case 1: *--dp = *--sp;
|
|
||||||
len = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} /* end while */
|
|
||||||
}
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* NAME
|
|
||||||
* mem_prim_move32 - Move (handles overlap) memory
|
|
||||||
*
|
|
||||||
* SYNOPSIS
|
|
||||||
* #include "mem_primitives_lib.h"
|
|
||||||
* void
|
|
||||||
* mem_prim_move32(void *dest, const void *src, uint32_t len)
|
|
||||||
*
|
|
||||||
* DESCRIPTION
|
|
||||||
* Moves at most len uint32_ts from sp to dp.
|
|
||||||
* The destination may overlap with source.
|
|
||||||
*
|
|
||||||
* INPUT PARAMETERS
|
|
||||||
* dp - pointer to the memory that will be replaced by sp.
|
|
||||||
*
|
|
||||||
* sp - pointer to the memory that will be copied
|
|
||||||
* to dp
|
|
||||||
*
|
|
||||||
* len - maximum number uint32_t of sp that can be copied
|
|
||||||
*
|
|
||||||
* OUTPUT PARAMETERS
|
|
||||||
* dp - is updated
|
|
||||||
*
|
|
||||||
* RETURN VALUE
|
|
||||||
* none
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
mem_prim_move32 (uint32_t *dp, const uint32_t *sp, uint32_t len)
|
|
||||||
{
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Determine if we need to copy forward or backward (overlap)
|
|
||||||
*/
|
|
||||||
if (dp < sp) {
|
|
||||||
/*
|
|
||||||
* Copy forward.
|
|
||||||
*/
|
|
||||||
|
|
||||||
while (len != 0) {
|
|
||||||
|
|
||||||
switch (len) {
|
|
||||||
/*
|
|
||||||
* Here we do blocks of 8. Once the remaining count
|
|
||||||
* drops below 8, take the fast track to finish up.
|
|
||||||
*/
|
|
||||||
default:
|
|
||||||
*dp++ = *sp++; *dp++ = *sp++; *dp++ = *sp++; *dp++ = *sp++;
|
|
||||||
*dp++ = *sp++; *dp++ = *sp++; *dp++ = *sp++; *dp++ = *sp++;
|
|
||||||
*dp++ = *sp++; *dp++ = *sp++; *dp++ = *sp++; *dp++ = *sp++;
|
|
||||||
*dp++ = *sp++; *dp++ = *sp++; *dp++ = *sp++; *dp++ = *sp++;
|
|
||||||
len -= 16;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 15: *dp++ = *sp++;
|
|
||||||
case 14: *dp++ = *sp++;
|
|
||||||
case 13: *dp++ = *sp++;
|
|
||||||
case 12: *dp++ = *sp++;
|
|
||||||
case 11: *dp++ = *sp++;
|
|
||||||
case 10: *dp++ = *sp++;
|
|
||||||
case 9: *dp++ = *sp++;
|
|
||||||
case 8: *dp++ = *sp++;
|
|
||||||
|
|
||||||
case 7: *dp++ = *sp++;
|
|
||||||
case 6: *dp++ = *sp++;
|
|
||||||
case 5: *dp++ = *sp++;
|
|
||||||
case 4: *dp++ = *sp++;
|
|
||||||
case 3: *dp++ = *sp++;
|
|
||||||
case 2: *dp++ = *sp++;
|
|
||||||
case 1: *dp++ = *sp++;
|
|
||||||
len = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} /* end while */
|
|
||||||
|
|
||||||
} else {
|
|
||||||
/*
|
|
||||||
* This section is used to copy backwards, to handle any
|
|
||||||
* overlap.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* go to end of the memory to copy
|
|
||||||
*/
|
|
||||||
sp += len;
|
|
||||||
dp += len;
|
|
||||||
|
|
||||||
while (len != 0) {
|
|
||||||
|
|
||||||
switch (len) {
|
|
||||||
/*
|
|
||||||
* Here we do blocks of 8. Once the remaining count
|
|
||||||
* drops below 8, take the fast track to finish up.
|
|
||||||
*/
|
|
||||||
default:
|
|
||||||
*--dp = *--sp; *--dp = *--sp; *--dp = *--sp; *--dp = *--sp;
|
|
||||||
*--dp = *--sp; *--dp = *--sp; *--dp = *--sp; *--dp = *--sp;
|
|
||||||
*--dp = *--sp; *--dp = *--sp; *--dp = *--sp; *--dp = *--sp;
|
|
||||||
*--dp = *--sp; *--dp = *--sp; *--dp = *--sp; *--dp = *--sp;
|
|
||||||
len -= 16;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 15: *--dp = *--sp;
|
|
||||||
case 14: *--dp = *--sp;
|
|
||||||
case 13: *--dp = *--sp;
|
|
||||||
case 12: *--dp = *--sp;
|
|
||||||
case 11: *--dp = *--sp;
|
|
||||||
case 10: *--dp = *--sp;
|
|
||||||
case 9: *--dp = *--sp;
|
|
||||||
case 8: *--dp = *--sp;
|
|
||||||
|
|
||||||
case 7: *--dp = *--sp;
|
|
||||||
case 6: *--dp = *--sp;
|
|
||||||
case 5: *--dp = *--sp;
|
|
||||||
case 4: *--dp = *--sp;
|
|
||||||
case 3: *--dp = *--sp;
|
|
||||||
case 2: *--dp = *--sp;
|
|
||||||
case 1: *--dp = *--sp;
|
|
||||||
len = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} /* end while */
|
|
||||||
}
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
|
@ -1,74 +0,0 @@
|
||||||
/*------------------------------------------------------------------
|
|
||||||
* mem_primitives_lib.h - Unguarded Memory Copy Routines
|
|
||||||
*
|
|
||||||
* October 2008, Bo Berry
|
|
||||||
*
|
|
||||||
* Copyright (c) 2008-2011 by Cisco Systems, Inc
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person
|
|
||||||
* obtaining a copy of this software and associated documentation
|
|
||||||
* files (the "Software"), to deal in 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:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be
|
|
||||||
* included in all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* 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 AUTHORS 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 IN THE SOFTWARE.
|
|
||||||
*------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __MEM_PRIMITIVES_LIB_H__
|
|
||||||
#define __MEM_PRIMITIVES_LIB_H__
|
|
||||||
|
|
||||||
#include "safeclib_private.h"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* These are prototypes for _unguarded_ memory routines. The caller must
|
|
||||||
* validate all parameters prior to invocation. Useful for diagnostics
|
|
||||||
* and system initialization processing.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* moves (handles overlap) memory */
|
|
||||||
extern void
|
|
||||||
mem_prim_move(void *dest, const void *src, uint32_t length);
|
|
||||||
|
|
||||||
|
|
||||||
/* uint8_t moves (handles overlap) memory */
|
|
||||||
extern void
|
|
||||||
mem_prim_move8(uint8_t *dest, const uint8_t *src, uint32_t length);
|
|
||||||
|
|
||||||
/* uint16_t moves (handles overlap) memory */
|
|
||||||
extern void
|
|
||||||
mem_prim_move16(uint16_t *dest, const uint16_t *src, uint32_t length);
|
|
||||||
|
|
||||||
/* uint32_t moves (handles overlap) memory */
|
|
||||||
extern void
|
|
||||||
mem_prim_move32(uint32_t *dest, const uint32_t *src, uint32_t length);
|
|
||||||
|
|
||||||
|
|
||||||
/* set bytes */
|
|
||||||
extern void
|
|
||||||
mem_prim_set(void *dest, uint32_t dmax, uint8_t value);
|
|
||||||
|
|
||||||
/* set uint16_ts */
|
|
||||||
extern void
|
|
||||||
mem_prim_set16(uint16_t *dest, uint32_t dmax, uint16_t value);
|
|
||||||
|
|
||||||
/* set uint32_ts */
|
|
||||||
extern void
|
|
||||||
mem_prim_set32(uint32_t *dest, uint32_t dmax, uint32_t value);
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* __MEM_PRIMITIVES_LIB_H__ */
|
|
|
@ -1,163 +0,0 @@
|
||||||
/*------------------------------------------------------------------
|
|
||||||
* memcpy_s
|
|
||||||
*
|
|
||||||
* October 2008, Bo Berry
|
|
||||||
*
|
|
||||||
* Copyright (c) 2008-2011 Cisco Systems
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person
|
|
||||||
* obtaining a copy of this software and associated documentation
|
|
||||||
* files (the "Software"), to deal in 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:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be
|
|
||||||
* included in all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* 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 AUTHORS 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 IN THE SOFTWARE.
|
|
||||||
*------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "safeclib_private.h"
|
|
||||||
#include "safe_mem_constraint.h"
|
|
||||||
#include "mem_primitives_lib.h"
|
|
||||||
#include "safe_mem_lib.h"
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* NAME
|
|
||||||
* memcpy_s
|
|
||||||
*
|
|
||||||
* SYNOPSIS
|
|
||||||
* #include "safe_mem_lib.h"
|
|
||||||
* errno_t
|
|
||||||
* memcpy_s(void *dest, rsize_t dmax, const void *src, rsize_t smax)
|
|
||||||
*
|
|
||||||
* DESCRIPTION
|
|
||||||
* This function copies at most smax bytes from src to dest, up to
|
|
||||||
* dmax. The size values are unsigned values.
|
|
||||||
*
|
|
||||||
* AR: Dave - verify ISO spec requires unsigned
|
|
||||||
*
|
|
||||||
* SPECIFIED IN
|
|
||||||
* ISO/IEC JTC1 SC22 WG14 N1172, Programming languages, environments
|
|
||||||
* and system software interfaces, Extensions to the C Library,
|
|
||||||
* Part I: Bounds-checking interfaces
|
|
||||||
*
|
|
||||||
* INPUT PARAMETERS
|
|
||||||
* dest pointer to memory that will be replaced by src.
|
|
||||||
*
|
|
||||||
* dmax maximum length of the resulting dest
|
|
||||||
*
|
|
||||||
* src pointer to the memory that will be copied to dest
|
|
||||||
*
|
|
||||||
* smax maximum number bytes of src to copy
|
|
||||||
*
|
|
||||||
* OUTPUT PARAMETERS
|
|
||||||
* dest is updated
|
|
||||||
*
|
|
||||||
* RUNTIME CONSTRAINTS
|
|
||||||
* Neither dest nor src shall be a null pointer.
|
|
||||||
* Neither dmax nor smax shall be zero.
|
|
||||||
* dmax shall not be greater than RSIZE_MAX_MEM.
|
|
||||||
* smax shall not be greater than dmax.
|
|
||||||
* Copying shall not take place between regions that overlap.
|
|
||||||
* If there is a runtime-constraint violation, the memcpy_s function
|
|
||||||
* stores zeros in the first dmax bytes of the region pointed to
|
|
||||||
* by dest if dest is not a null pointer and smax is valid.
|
|
||||||
*
|
|
||||||
* RETURN VALUE
|
|
||||||
* EOK successful operation
|
|
||||||
* ESNULLP NULL pointer
|
|
||||||
* ESZEROL zero length
|
|
||||||
* ESLEMAX length exceeds max limit
|
|
||||||
* ESOVRLP source memory overlaps destination
|
|
||||||
*
|
|
||||||
* ALSO SEE
|
|
||||||
* memcpy16_s(), memcpy32_s(), memmove_s(), memmove16_s(),
|
|
||||||
* memmove32_s()
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
errno_t
|
|
||||||
memcpy_s (void *dest, rsize_t dmax, const void *src, rsize_t smax)
|
|
||||||
{
|
|
||||||
uint8_t *dp;
|
|
||||||
const uint8_t *sp;
|
|
||||||
|
|
||||||
dp = dest;
|
|
||||||
sp = src;
|
|
||||||
|
|
||||||
if (dp == NULL) {
|
|
||||||
invoke_safe_mem_constraint_handler("memcpy_s: dest is NULL",
|
|
||||||
NULL, ESNULLP);
|
|
||||||
return RCNEGATE(ESNULLP);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dmax == 0) {
|
|
||||||
invoke_safe_mem_constraint_handler("memcpy_s: dmax is 0",
|
|
||||||
NULL, ESZEROL);
|
|
||||||
return RCNEGATE(ESZEROL);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dmax > RSIZE_MAX_MEM) {
|
|
||||||
invoke_safe_mem_constraint_handler("memcpy_s: dmax exceeds max",
|
|
||||||
NULL, ESLEMAX);
|
|
||||||
return RCNEGATE(ESLEMAX);
|
|
||||||
}
|
|
||||||
|
|
||||||
// AR: This is not a requirement according to the ISO spec - Change?
|
|
||||||
// AR: documentation needed on use of the error handlers -
|
|
||||||
// AR: default err handler should output to stderr on DEBUG
|
|
||||||
// AR: update docs to define return RCNEGATE of the error number
|
|
||||||
if (smax == 0) {
|
|
||||||
mem_prim_set(dp, dmax, 0);
|
|
||||||
invoke_safe_mem_constraint_handler("memcpy_s: smax is 0",
|
|
||||||
NULL, ESZEROL);
|
|
||||||
return RCNEGATE(ESZEROL);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (smax > dmax) {
|
|
||||||
mem_prim_set(dp, dmax, 0);
|
|
||||||
invoke_safe_mem_constraint_handler("memcpy_s: smax exceeds dmax",
|
|
||||||
NULL, ESLEMAX);
|
|
||||||
return RCNEGATE(ESLEMAX);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sp == NULL) {
|
|
||||||
mem_prim_set(dp, dmax, 0);
|
|
||||||
invoke_safe_mem_constraint_handler("memcpy_s: src is NULL",
|
|
||||||
NULL, ESNULLP);
|
|
||||||
return RCNEGATE(ESNULLP);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* overlap is undefined behavior, do not allow
|
|
||||||
*/
|
|
||||||
if( ((dp > sp) && (dp < (sp+smax))) ||
|
|
||||||
((sp > dp) && (sp < (dp+dmax))) ) {
|
|
||||||
mem_prim_set(dp, dmax, 0);
|
|
||||||
invoke_safe_mem_constraint_handler("memcpy_s: overlap undefined",
|
|
||||||
NULL, ESOVRLP);
|
|
||||||
return RCNEGATE(ESOVRLP);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* now perform the copy
|
|
||||||
*/
|
|
||||||
mem_prim_move(dp, sp, smax);
|
|
||||||
|
|
||||||
return RCNEGATE(EOK);
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(memcpy_s)
|
|
|
@ -1,142 +0,0 @@
|
||||||
/*------------------------------------------------------------------
|
|
||||||
* safe_mem_constraint.c
|
|
||||||
*
|
|
||||||
* October 2008, Bo Berry
|
|
||||||
* 2012, Jonathan Toppins <jtoppins@users.sourceforge.net>
|
|
||||||
*
|
|
||||||
* Copyright (c) 2008-2012 Cisco Systems
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person
|
|
||||||
* obtaining a copy of this software and associated documentation
|
|
||||||
* files (the "Software"), to deal in 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:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be
|
|
||||||
* included in all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* 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 AUTHORS 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 IN THE SOFTWARE.
|
|
||||||
*------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "safeclib_private.h"
|
|
||||||
#include "safe_mem_constraint.h"
|
|
||||||
#include "safe_mem_lib.h"
|
|
||||||
|
|
||||||
|
|
||||||
static constraint_handler_t mem_handler = NULL;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* NAME
|
|
||||||
* set_mem_constraint_handler_s
|
|
||||||
*
|
|
||||||
* SYNOPSIS
|
|
||||||
* #include "safe_mem_lib.h"
|
|
||||||
* constraint_handler_t
|
|
||||||
* set_mem_constraint_handler_straint_handler_t handler)
|
|
||||||
*
|
|
||||||
* DESCRIPTION
|
|
||||||
* The set_mem_constraint_handler_s function sets the runtime-constraint
|
|
||||||
* handler to be handler. The runtime-constraint handler is the function to
|
|
||||||
* be called when a library function detects a runtime-constraint
|
|
||||||
* order:
|
|
||||||
* 1. A pointer to a character string describing the
|
|
||||||
* runtime-constraint violation.
|
|
||||||
* 2. A null pointer or a pointer to an implementation defined
|
|
||||||
* object.
|
|
||||||
* 3. If the function calling the handler has a return type declared
|
|
||||||
* as errno_t, the return value of the function is passed.
|
|
||||||
* Otherwise, a positive value of type errno_t is passed.
|
|
||||||
* The implementation has a default constraint handler that is used if no
|
|
||||||
* calls to the set_constraint_handler_s function have been made. The
|
|
||||||
* behavior of the default handler is implementation-defined, and it may
|
|
||||||
* cause the program to exit or abort. If the handler argument to
|
|
||||||
* set_constraint_handler_s is a null pointer, the implementation default
|
|
||||||
* handler becomes the current constraint handler.
|
|
||||||
*
|
|
||||||
* SPECIFIED IN
|
|
||||||
* ISO/IEC JTC1 SC22 WG14 N1172, Programming languages, environments
|
|
||||||
* and system software interfaces, Extensions to the C Library,
|
|
||||||
* Part I: Bounds-checking interfaces
|
|
||||||
*
|
|
||||||
* INPUT PARAMETERS
|
|
||||||
* *msg Pointer to the message describing the error
|
|
||||||
*
|
|
||||||
* *ptr Pointer to aassociated data. Can be NULL.
|
|
||||||
*
|
|
||||||
* error The error code encountered.
|
|
||||||
*
|
|
||||||
* OUTPUT PARAMETERS
|
|
||||||
* none
|
|
||||||
*
|
|
||||||
* RETURN VALUE
|
|
||||||
* none
|
|
||||||
*
|
|
||||||
* ALSO SEE
|
|
||||||
* set_str_constraint_handler_s()
|
|
||||||
*/
|
|
||||||
constraint_handler_t
|
|
||||||
set_mem_constraint_handler_s (constraint_handler_t handler)
|
|
||||||
{
|
|
||||||
constraint_handler_t prev_handler = mem_handler;
|
|
||||||
if (NULL == handler) {
|
|
||||||
mem_handler = sl_default_handler;
|
|
||||||
} else {
|
|
||||||
mem_handler = handler;
|
|
||||||
}
|
|
||||||
return prev_handler;
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(set_mem_constraint_handler_s)
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* NAME
|
|
||||||
* invoke_safe_mem_constraint_handler
|
|
||||||
*
|
|
||||||
* SYNOPSIS
|
|
||||||
* #include "safe_mem_constraint.h"
|
|
||||||
* void
|
|
||||||
* invoke_safe_mem_constraint_handler(const char *msg,
|
|
||||||
* void *ptr,
|
|
||||||
* errno_t error)
|
|
||||||
*
|
|
||||||
* DESCRIPTION
|
|
||||||
* Invokes the currently set constraint handler or the default.
|
|
||||||
*
|
|
||||||
* INPUT PARAMETERS
|
|
||||||
* *msg Pointer to the message describing the error
|
|
||||||
*
|
|
||||||
* *ptr Pointer to aassociated data. Can be NULL.
|
|
||||||
*
|
|
||||||
* error The error code encountered.
|
|
||||||
*
|
|
||||||
* OUTPUT PARAMETERS
|
|
||||||
* none
|
|
||||||
*
|
|
||||||
* RETURN VALUE
|
|
||||||
* none
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
invoke_safe_mem_constraint_handler (const char *msg,
|
|
||||||
void *ptr,
|
|
||||||
errno_t error)
|
|
||||||
{
|
|
||||||
if (NULL != mem_handler) {
|
|
||||||
mem_handler(msg, ptr, error);
|
|
||||||
} else {
|
|
||||||
sl_default_handler(msg, ptr, error);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,46 +0,0 @@
|
||||||
/*------------------------------------------------------------------
|
|
||||||
* safe_mem_constraint.h
|
|
||||||
*
|
|
||||||
* October 2008, Bo Berry
|
|
||||||
*
|
|
||||||
* Copyright (c) 2008, 2009 by Cisco Systems, Inc.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person
|
|
||||||
* obtaining a copy of this software and associated documentation
|
|
||||||
* files (the "Software"), to deal in 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:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be
|
|
||||||
* included in all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* 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 AUTHORS 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 IN THE SOFTWARE.
|
|
||||||
*------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __SAFE_MEM_CONSTRAINT_H__
|
|
||||||
#define __SAFE_MEM_CONSTRAINT_H__
|
|
||||||
|
|
||||||
#include "safeclib_private.h"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Function used by the libraries to invoke the registered
|
|
||||||
* runtime-constraint handler. Always needed.
|
|
||||||
*/
|
|
||||||
extern void invoke_safe_mem_constraint_handler(
|
|
||||||
const char *msg,
|
|
||||||
void *ptr,
|
|
||||||
errno_t error);
|
|
||||||
|
|
||||||
#endif /* __SAFE_MEM_CONSTRAINT_H__ */
|
|
|
@ -1,146 +0,0 @@
|
||||||
/*------------------------------------------------------------------
|
|
||||||
* safe_str_constraint.c
|
|
||||||
*
|
|
||||||
* October 2008, Bo Berry
|
|
||||||
* 2012, Jonathan Toppins <jtoppins@users.sourceforge.net>
|
|
||||||
*
|
|
||||||
* Copyright (c) 2008, 2009, 2012 Cisco Systems
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person
|
|
||||||
* obtaining a copy of this software and associated documentation
|
|
||||||
* files (the "Software"), to deal in 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:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be
|
|
||||||
* included in all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* 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 AUTHORS 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 IN THE SOFTWARE.
|
|
||||||
*------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "safeclib_private.h"
|
|
||||||
#include "safe_str_constraint.h"
|
|
||||||
#include "safe_str_lib.h"
|
|
||||||
|
|
||||||
|
|
||||||
static constraint_handler_t str_handler = NULL;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* NAME
|
|
||||||
* set_str_constraint_handler_s
|
|
||||||
*
|
|
||||||
* SYNOPSIS
|
|
||||||
* #include "safe_str_lib.h"
|
|
||||||
* constraint_handler_t
|
|
||||||
* set_str_constraint_handler_s(constraint_handler_t handler)
|
|
||||||
*
|
|
||||||
* DESCRIPTION
|
|
||||||
* The set_str_constraint_handler_s function sets the runtime-constraint
|
|
||||||
* handler to be handler. The runtime-constraint handler is the function to
|
|
||||||
* be called when a library function detects a runtime-constraint
|
|
||||||
* violation. Only the most recent handler registered with
|
|
||||||
* set_str_constraint_handler_s is called when a runtime-constraint
|
|
||||||
* violation occurs.
|
|
||||||
* When the handler is called, it is passed the following arguments in
|
|
||||||
* the following order:
|
|
||||||
* 1. A pointer to a character string describing the
|
|
||||||
* runtime-constraint violation.
|
|
||||||
* 2. A null pointer or a pointer to an implementation defined
|
|
||||||
* object.
|
|
||||||
* 3. If the function calling the handler has a return type declared
|
|
||||||
* as errno_t, the return value of the function is passed.
|
|
||||||
* Otherwise, a positive value of type errno_t is passed.
|
|
||||||
* The implementation has a default constraint handler that is used if no
|
|
||||||
* calls to the set_constraint_handler_s function have been made. The
|
|
||||||
* behavior of the default handler is implementation-defined, and it may
|
|
||||||
* cause the program to exit or abort. If the handler argument to
|
|
||||||
* set_constraint_handler_s is a null pointer, the implementation default
|
|
||||||
* handler becomes the current constraint handler.
|
|
||||||
*
|
|
||||||
* SPECIFIED IN
|
|
||||||
* ISO/IEC JTC1 SC22 WG14 N1172, Programming languages, environments
|
|
||||||
* and system software interfaces, Extensions to the C Library,
|
|
||||||
* Part I: Bounds-checking interfaces
|
|
||||||
*
|
|
||||||
* INPUT PARAMETERS
|
|
||||||
* *msg Pointer to the message describing the error
|
|
||||||
*
|
|
||||||
* *ptr Pointer to aassociated data. Can be NULL.
|
|
||||||
*
|
|
||||||
* error The error code encountered.
|
|
||||||
*
|
|
||||||
* OUTPUT PARAMETERS
|
|
||||||
* none
|
|
||||||
*
|
|
||||||
* RETURN VALUE
|
|
||||||
* none
|
|
||||||
*
|
|
||||||
* ALSO SEE
|
|
||||||
* set_str_constraint_handler_s()
|
|
||||||
*/
|
|
||||||
constraint_handler_t
|
|
||||||
set_str_constraint_handler_s (constraint_handler_t handler)
|
|
||||||
{
|
|
||||||
constraint_handler_t prev_handler = str_handler;
|
|
||||||
if (NULL == handler) {
|
|
||||||
str_handler = sl_default_handler;
|
|
||||||
} else {
|
|
||||||
str_handler = handler;
|
|
||||||
}
|
|
||||||
return prev_handler;
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(set_str_constraint_handler_s)
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* NAME
|
|
||||||
* invoke_safe_str_constraint_handler
|
|
||||||
*
|
|
||||||
* SYNOPSIS
|
|
||||||
* #include "safe_str_constraint.h"
|
|
||||||
* void
|
|
||||||
* invoke_safe_str_constraint_handler (const char *msg,
|
|
||||||
* void *ptr,
|
|
||||||
* errno_t error)
|
|
||||||
*
|
|
||||||
* DESCRIPTION
|
|
||||||
* Invokes the currently set constraint handler or the default.
|
|
||||||
*
|
|
||||||
* INPUT PARAMETERS
|
|
||||||
* *msg Pointer to the message describing the error
|
|
||||||
*
|
|
||||||
* *ptr Pointer to aassociated data. Can be NULL.
|
|
||||||
*
|
|
||||||
* error The error code encountered.
|
|
||||||
*
|
|
||||||
* OUTPUT PARAMETERS
|
|
||||||
* none
|
|
||||||
*
|
|
||||||
* RETURN VALUE
|
|
||||||
* none
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
invoke_safe_str_constraint_handler (const char *msg,
|
|
||||||
void *ptr,
|
|
||||||
errno_t error)
|
|
||||||
{
|
|
||||||
if (NULL != str_handler) {
|
|
||||||
str_handler(msg, ptr, error);
|
|
||||||
} else {
|
|
||||||
sl_default_handler(msg, ptr, error);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,78 +0,0 @@
|
||||||
/*------------------------------------------------------------------
|
|
||||||
* safe_str_constraint.h
|
|
||||||
*
|
|
||||||
* October 2008, Bo Berry
|
|
||||||
*
|
|
||||||
* Copyright (c) 2008-2011 Cisco Systems
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person
|
|
||||||
* obtaining a copy of this software and associated documentation
|
|
||||||
* files (the "Software"), to deal in 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:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be
|
|
||||||
* included in all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* 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 AUTHORS 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 IN THE SOFTWARE.
|
|
||||||
*------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __SAFE_STR_CONSTRAINT_H__
|
|
||||||
#define __SAFE_STR_CONSTRAINT_H__
|
|
||||||
|
|
||||||
#include "safeclib_private.h"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Function used by the libraries to invoke the registered
|
|
||||||
* runtime-constraint handler. Always needed.
|
|
||||||
*/
|
|
||||||
extern void invoke_safe_str_constraint_handler(
|
|
||||||
const char *msg,
|
|
||||||
void *ptr,
|
|
||||||
errno_t error);
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Safe C Lib internal string routine to consolidate error handling
|
|
||||||
*/
|
|
||||||
static inline void handle_error(char *orig_dest, rsize_t orig_dmax,
|
|
||||||
char *err_msg, errno_t err_code)
|
|
||||||
{
|
|
||||||
#ifdef SAFECLIB_STR_NULL_SLACK
|
|
||||||
/* null string to eliminate partial copy */
|
|
||||||
while (orig_dmax) { *orig_dest = '\0'; orig_dmax--; orig_dest++; }
|
|
||||||
#else
|
|
||||||
*orig_dest = '\0';
|
|
||||||
#endif
|
|
||||||
|
|
||||||
invoke_safe_str_constraint_handler(err_msg, NULL, err_code);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void handle_wc_error(wchar_t *orig_dest, rsize_t orig_dmax,
|
|
||||||
char *err_msg, errno_t err_code)
|
|
||||||
{
|
|
||||||
#ifdef SAFECLIB_STR_NULL_SLACK
|
|
||||||
/* null string to eliminate partial copy */
|
|
||||||
while (orig_dmax) { *orig_dest = L'\0'; orig_dmax--; orig_dest++; }
|
|
||||||
#else
|
|
||||||
*orig_dest = L'\0';
|
|
||||||
#endif
|
|
||||||
|
|
||||||
invoke_safe_str_constraint_handler(err_msg, NULL, err_code);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* __SAFE_STR_CONSTRAINT_H__ */
|
|
|
@ -0,0 +1 @@
|
||||||
|
../../../vendor/safestringlib/safeclib/
|
|
@ -1,94 +0,0 @@
|
||||||
/*------------------------------------------------------------------
|
|
||||||
* safeclib_private.h - Internal library references
|
|
||||||
*
|
|
||||||
* 2012, Jonathan Toppins <jtoppins@users.sourceforge.net>
|
|
||||||
*
|
|
||||||
* Copyright (c) 2012, 2013 by Cisco Systems, Inc
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person
|
|
||||||
* obtaining a copy of this software and associated documentation
|
|
||||||
* files (the "Software"), to deal in 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:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be
|
|
||||||
* included in all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* 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 AUTHORS 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 IN THE SOFTWARE.
|
|
||||||
*------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __SAFECLIB_PRIVATE_H__
|
|
||||||
#define __SAFECLIB_PRIVATE_H__
|
|
||||||
|
|
||||||
#include "citus_config.h"
|
|
||||||
#ifdef __KERNEL__
|
|
||||||
/* linux kernel environment */
|
|
||||||
|
|
||||||
#include <linux/kernel.h>
|
|
||||||
#include <linux/module.h>
|
|
||||||
#include <linux/ctype.h>
|
|
||||||
|
|
||||||
#define RCNEGATE(x) ( -(x) )
|
|
||||||
|
|
||||||
#define slprintf(...) printk(KERN_EMERG __VA_ARGS__)
|
|
||||||
#define slabort()
|
|
||||||
#ifdef DEBUG
|
|
||||||
#define sldebug_printf(...) printk(KERN_DEBUG __VA_ARGS__)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#else /* !__KERNEL__ */
|
|
||||||
|
|
||||||
#if HAVE_CONFIG_H
|
|
||||||
#include "config.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#ifdef STDC_HEADERS
|
|
||||||
# include <ctype.h>
|
|
||||||
# include <stdlib.h>
|
|
||||||
# include <stddef.h>
|
|
||||||
#else
|
|
||||||
# ifdef HAVE_STDLIB_H
|
|
||||||
# include <stdlib.h>
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
#ifdef HAVE_STRING_H
|
|
||||||
# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
|
|
||||||
# include <memory.h>
|
|
||||||
# endif
|
|
||||||
# include <string.h>
|
|
||||||
#endif
|
|
||||||
#ifdef HAVE_LIMITS_H
|
|
||||||
# include <limits.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define EXPORT_SYMBOL(sym)
|
|
||||||
#define RCNEGATE(x) (x)
|
|
||||||
|
|
||||||
#define slprintf(...) fprintf(stderr, __VA_ARGS__)
|
|
||||||
#define slabort() abort()
|
|
||||||
#ifdef DEBUG
|
|
||||||
#define sldebug_printf(...) printf(__VA_ARGS__)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* __KERNEL__ */
|
|
||||||
|
|
||||||
#ifndef sldebug_printf
|
|
||||||
#define sldebug_printf(...)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "safe_lib.h"
|
|
||||||
|
|
||||||
#endif /* __SAFECLIB_PRIVATE_H__ */
|
|
Loading…
Reference in New Issue