From 9de8c4ac0b015aecd2a905d1b671a272e498b5a1 Mon Sep 17 00:00:00 2001 From: Stefan Ritt Date: Mon, 9 May 2005 09:12:06 +0000 Subject: [PATCH] Initial revision --- strlcpy.c | 84 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ strlcpy.h | 23 +++++++++++++++ 2 files changed, 107 insertions(+) create mode 100755 strlcpy.c create mode 100755 strlcpy.h diff --git a/strlcpy.c b/strlcpy.c new file mode 100755 index 0000000..788feba --- /dev/null +++ b/strlcpy.c @@ -0,0 +1,84 @@ +/********************************************************************\ + + Name: strlcpy.c + Created by: Stefan Ritt + + Contents: Contains strlcpy and strlcat which are versions of + strcpy and strcat, but which avoid buffer overflows + + $Log$ + Revision 1.1 2005/05/09 09:12:03 ritt + Initial revision + +\********************************************************************/ + +#include +#include +#include "strlcpy.h" + +/* +* Copy src to string dst of size siz. At most siz-1 characters +* will be copied. Always NUL terminates (unless size == 0). +* Returns strlen(src); if retval >= siz, truncation occurred. +*/ +size_t strlcpy(char *dst, const char *src, size_t size) +{ + char *d = dst; + const char *s = src; + size_t n = size; + + /* Copy as many bytes as will fit */ + if (n != 0 && --n != 0) { + do { + if ((*d++ = *s++) == 0) + break; + } while (--n != 0); + } + + /* Not enough room in dst, add NUL and traverse rest of src */ + if (n == 0) { + if (size != 0) + *d = '\0'; /* NUL-terminate dst */ + while (*s++); + } + + return (s - src - 1); /* count does not include NUL */ +} + +/*-------------------------------------------------------------------*/ + +/* +* Appends src to string dst of size siz (unlike strncat, siz is the +* full size of dst, not space left). At most siz-1 characters +* will be copied. Always NUL terminates (unless size <= strlen(dst)). +* Returns strlen(src) + MIN(size, strlen(initial dst)). +* If retval >= size, truncation occurred. +*/ +size_t strlcat(char *dst, const char *src, size_t size) +{ + char *d = dst; + const char *s = src; + size_t n = size; + size_t dlen; + + /* Find the end of dst and adjust bytes left but don't go past end */ + while (n-- != 0 && *d != '\0') + d++; + dlen = d - dst; + n = size - dlen; + + if (n == 0) + return (dlen + strlen(s)); + while (*s != '\0') { + if (n != 1) { + *d++ = *s; + n--; + } + s++; + } + *d = '\0'; + + return (dlen + (s - src)); /* count does not include NUL */ +} + +/*-------------------------------------------------------------------*/ diff --git a/strlcpy.h b/strlcpy.h new file mode 100755 index 0000000..0639e91 --- /dev/null +++ b/strlcpy.h @@ -0,0 +1,23 @@ +/********************************************************************\ + + Name: strlcpy.h + Created by: Stefan Ritt + + Contents: Header file for strlcpy.c + + $Log$ + Revision 1.1 2005/05/09 09:12:06 ritt + Initial revision + +\********************************************************************/ + +#ifndef EXPRT +#if defined(EXPORT_DLL) +#define EXPRT __declspec(dllexport) +#else +#define EXPRT +#endif +#endif + +size_t EXPRT strlcpy(char *dst, const char *src, size_t size); +size_t EXPRT strlcat(char *dst, const char *src, size_t size);