From bc2185158a619553f1a0c7b8e398a5ebdac32366 Mon Sep 17 00:00:00 2001 From: ritt Date: Fri, 26 Jul 2024 16:06:25 +0200 Subject: [PATCH] Added back strlcpy --- CMakeLists.txt | 4 +- src/strlcpy.cxx | 101 ++++++++++++++++++++++++++++++++++++++++++++++++ src/strlcpy.h | 55 ++++++++++++++++++++++++++ 3 files changed, 158 insertions(+), 2 deletions(-) create mode 100644 src/strlcpy.cxx create mode 100644 src/strlcpy.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 926ba0b7..6e43d8fb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -94,7 +94,7 @@ add_executable(elogd ${CMAKE_SOURCE_DIR}/src/elogd.cxx ${CMAKE_SOURCE_DIR}/src/auth.cxx ${CMAKE_SOURCE_DIR}/mxml/mxml.cxx - ${CMAKE_SOURCE_DIR}/mxml/strlcpy.cxx + ${CMAKE_SOURCE_DIR}/src/strlcpy.cxx ${CMAKE_SOURCE_DIR}/src/crypt.cxx ) @@ -107,7 +107,7 @@ endif() add_executable(elog ${CMAKE_SOURCE_DIR}/src/elog.cxx ${CMAKE_SOURCE_DIR}/src/crypt.cxx - ${CMAKE_SOURCE_DIR}/mxml/strlcpy.cxx + ${CMAKE_SOURCE_DIR}/src/strlcpy.cxx ) add_dependencies(elogd git_revision_h) diff --git a/src/strlcpy.cxx b/src/strlcpy.cxx new file mode 100644 index 00000000..586c2bc9 --- /dev/null +++ b/src/strlcpy.cxx @@ -0,0 +1,101 @@ +/********************************************************************\ + + Name: strlcpy.c + Created by: Stefan Ritt + Copyright 2000 + Stefan Ritt + + Contents: Contains strlcpy and strlcat which are versions of + strcpy and strcat, but which avoid buffer overflows + + + This file is part of MIDAS XML Library. + + MIDAS XML Library is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + MIDAS XML Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with MIDAS XML Library. If not, see . + +\********************************************************************/ + +#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. +*/ +#ifndef STRLCPY_DEFINED + +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 */ +} + +/*-------------------------------------------------------------------*/ + +#endif // STRLCPY_DEFINED diff --git a/src/strlcpy.h b/src/strlcpy.h new file mode 100644 index 00000000..589a6442 --- /dev/null +++ b/src/strlcpy.h @@ -0,0 +1,55 @@ +/********************************************************************\ + + Name: strlcpy.h + Created by: Stefan Ritt + Copyright 2000 + Stefan Ritt + + Contents: Header file for strlcpy.c + + This file is part of MIDAS XML Library. + + MIDAS XML Library is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + MIDAS XML Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with MIDAS XML Library. If not, see . + +\********************************************************************/ + +#ifndef _STRLCPY_H_ +#define _STRLCPY_H_ + +// some version of gcc have a built-in strlcpy +#ifdef strlcpy +#define STRLCPY_DEFINED +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef EXPRT +#if defined(EXPORT_DLL) +#define EXPRT __declspec(dllexport) +#else +#define EXPRT +#endif +#endif + +#ifndef STRLCPY_DEFINED +size_t EXPRT strlcpy(char *dst, const char *src, size_t size); +size_t EXPRT strlcat(char *dst, const char *src, size_t size); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /*_STRLCPY_H_ */