nx_strncpy and nx_strncpy_mb replaced by BSD style strlcpy/wcslcpy/_tcslcpy; added...
authorVictor Kirhenshtein <victor@netxms.org>
Fri, 22 Sep 2017 13:10:53 +0000 (16:10 +0300)
committerVictor Kirhenshtein <victor@netxms.org>
Fri, 22 Sep 2017 13:11:03 +0000 (16:11 +0300)
20 files changed:
configure.ac
include/nms_util.h
include/unicode.h
src/agent/libnxagent/registry.cpp
src/agent/subagents/linux/drbd.cpp
src/libnetxms/Makefile.am
src/libnetxms/config.cpp
src/libnetxms/dload.cpp
src/libnetxms/geolocation.cpp
src/libnetxms/inetaddr.cpp
src/libnetxms/nxproc.cpp
src/libnetxms/nxproc_unix.cpp
src/libnetxms/seh.cpp
src/libnetxms/strlcat.c [new file with mode: 0644]
src/libnetxms/strlcpy.c [new file with mode: 0644]
src/libnetxms/table.cpp
src/libnetxms/tools.cpp
src/libnetxms/wcslcat.c [new file with mode: 0644]
src/libnetxms/wcslcpy.c [new file with mode: 0644]
src/server/core/netmap_objlist.cpp

index 8410b7c..3450737 100644 (file)
@@ -2124,9 +2124,10 @@ AC_FUNC_STRFTIME
 AC_FUNC_STRTOD
 AC_FUNC_VPRINTF
 
-AC_CHECK_FUNCS([gettimeofday memmove memset bcopy strchr strcspn strdup strerror])
-AC_CHECK_FUNCS([strrchr strlwr strtok_r strtol strtoul strtoll strtoull setlocale])
-AC_CHECK_FUNCS([tolower if_nametoindex daemon mmap strerror_r scandir uname poll])
+AC_CHECK_FUNCS([gettimeofday memmove memset bcopy strchr strcspn strdup])
+AC_CHECK_FUNCS([strrchr strlwr strtok_r strtol strtoul strtoll strtoull])
+AC_CHECK_FUNCS([strlcpy strlcat setlocale strerror strerror_r])
+AC_CHECK_FUNCS([tolower if_nametoindex daemon mmap scandir uname poll])
 AC_CHECK_FUNCS([usleep nanosleep gmtime_r localtime_r stat64 fstat64 lstat64])
 AC_CHECK_FUNCS([fopen64 strptime timegm gethostbyname2_r getaddrinfo rand_r])
 AC_CHECK_FUNCS([itoa _itoa isatty malloc_info malloc_trim utime])
@@ -2496,6 +2497,7 @@ AC_CHECK_FUNCS([wmkdir wrmdir wsystem wmkstemp wpopen wctime wchmod vwscanf])
 AC_CHECK_FUNCS([vswscanf vfwscanf wcscasecmp wcsncasecmp wcstombs wcsrtombs])
 AC_CHECK_FUNCS([mbstowcs mbsrtowcs itow _itow wcsftime wcstok wutime])
 AC_CHECK_FUNCS([wprintf vwprintf swprintf vswprintf fwprintf vfwprintf])
+AC_CHECK_FUNCS([wcslcpy wcslcat])
 
 AC_CHECK_DECLS([putws],,,[
 #if HAVE_WCHAR_H
index d44c5dd..dec408e 100644 (file)
@@ -1993,38 +1993,19 @@ typedef struct _dir_struc_w
 #endif   /* _WIN32 */
 
 
+/***** For compatibility *****/
+#ifdef UNICODE
+#define nx_strncpy      wcslcpy
+#else
+#define nx_strncpy      strlcpy
+#endif
+
 //
 // Functions
 //
 
 #ifdef __cplusplus
 
-inline TCHAR *nx_strncpy(TCHAR *pszDest, const TCHAR *pszSrc, size_t nLen)
-{
-#if defined(_WIN32) && (_MSC_VER >= 1400) && !defined(__clang__)
-       _tcsncpy_s(pszDest, nLen, pszSrc, _TRUNCATE);
-#else
-   _tcsncpy(pszDest, pszSrc, nLen - 1);
-   pszDest[nLen - 1] = 0;
-#endif
-   return pszDest;
-}
-
-#ifdef UNICODE
-inline char *nx_strncpy_mb(char *pszDest, const char *pszSrc, size_t nLen)
-{
-#if defined(_WIN32) && (_MSC_VER >= 1400) && !defined(__clang__)
-       strncpy_s(pszDest, nLen, pszSrc, _TRUNCATE);
-#else
-   strncpy(pszDest, pszSrc, nLen - 1);
-   pszDest[nLen - 1] = 0;
-#endif
-   return pszDest;
-}
-#else
-#define nx_strncpy_mb nx_strncpy
-#endif
-
 int LIBNETXMS_EXPORTABLE ConnectEx(SOCKET s, struct sockaddr *addr, int len, UINT32 timeout);
 int LIBNETXMS_EXPORTABLE SendEx(SOCKET hSocket, const void *data, size_t len, int flags, MUTEX mutex);
 int LIBNETXMS_EXPORTABLE RecvEx(SOCKET hSocket, void *data, size_t len, int flags, UINT32 timeout);
@@ -2380,6 +2361,22 @@ char LIBNETXMS_EXPORTABLE *strlwr(char *str);
 WCHAR LIBNETXMS_EXPORTABLE *wcslwr(WCHAR *str);
 #endif
 
+#if !HAVE_STRLCPY
+size_t LIBNETXMS_EXPORTABLE strlcpy(char *dst, const char *src, size_t size);
+#endif
+
+#if !HAVE_WCSLCPY
+size_t LIBNETXMS_EXPORTABLE wcslcpy(WCHAR *dst, const WCHAR *src, size_t size);
+#endif
+
+#if !HAVE_STRLCAT
+size_t LIBNETXMS_EXPORTABLE strlcat(char *dst, const char *src, size_t size);
+#endif
+
+#if !HAVE_WCSLCAT
+size_t LIBNETXMS_EXPORTABLE wcslcat(WCHAR *dst, const WCHAR *src, size_t size);
+#endif
+
 #if !HAVE_WCSCASECMP && !defined(_WIN32)
 int LIBNETXMS_EXPORTABLE wcscasecmp(const wchar_t *s1, const wchar_t *s2);
 #endif
@@ -2493,11 +2490,6 @@ int LIBNETXMS_EXPORTABLE wmkstemp(WCHAR *tmpl);
 #endif
 #endif
 
-#ifndef _WIN32
-int strcat_s(char *dst, size_t dstSize, const char *src);
-int wcscat_s(WCHAR *dst, size_t dstSize, const WCHAR *src);
-#endif
-
 #if !HAVE_STRPTIME
 char LIBNETXMS_EXPORTABLE *strptime(const char *buf, const char *fmt, struct tm *_tm);
 #endif
index 239bae3..7297cff 100644 (file)
@@ -58,6 +58,8 @@
 #define _tcstoll  wcstoll
 #define _tcstoull wcstoull
 #define _tcstok_r wcstok_s
+#define _tcslcpy  wcslcpy
+#define _tcslcat  wcslcat
 
 #define _ERR_error_tstring             ERR_error_string_W
 
 #define _tcstoll  strtoll
 #define _tcstoull strtoull
 #define _tcstok_r strtok_s
+#define _tcslcpy  strlcpy
+#define _tcslcat  strlcat
 
 #define _ERR_error_tstring             ERR_error_string
 
 #endif /* UNICODE */
 
-#define UCS2CHAR       WCHAR
-#define UCS4CHAR  unsigned int
+#define UCS2CHAR WCHAR
+#define UCS4CHAR unsigned int
 
 #else    /* not _WIN32 */
 
 
 #define _tcscpy   wcscpy
 #define _tcsncpy  wcsncpy
+#define _tcslcpy  wcslcpy
 #define _tcslen   wcslen
 #define _tcsnlen  wcsnlen
 #define _tcschr   wcschr
 #define _tcscat   wcscat
 #define _tcscat_s wcscat_s
 #define _tcsncat  wcsncat
+#define _tcslcat  wcslcat
 #define _tcspbrk  wcspbrk
 #define _tcstok_r wcstok
 #define _topen    wopen
 
 #define _tcscpy   strcpy
 #define _tcsncpy  strncpy
+#define _tcslcpy  strlcpy
 #define _tcslen   strlen
 #define _tcsnlen  strnlen
 #define _tcschr   strchr
 #define _tcscat   strcat
 #define _tcscat_s strcat_s
 #define _tcsncat  strncat
+#define _tcslcat  strlcat
 #define _tcspbrk  strpbrk
 #define _tcstok_r strtok_r
 #define _topen    _open
index 8cf7bf3..058ddbc 100644 (file)
@@ -49,15 +49,16 @@ TCHAR LIBNXAGENT_EXPORTABLE *ReadRegistryAsString(const TCHAR *attr, TCHAR *buff
       }
    }
 
-   if (value == NULL)
+   if ((value == NULL) && (defaultValue != NULL))
    {
       if (buffer == NULL)
       {
-         value = _tcsdup_ex(defaultValue);
+         value = _tcsdup(defaultValue);
       }
       else
       {
-         value = (defaultValue != NULL) ? nx_strncpy(buffer, defaultValue, bufSize) : NULL;
+         _tcslcpy(buffer, defaultValue, bufSize);
+         value = buffer;
       }
    }
    return value;
index ab4c92f..630ef2e 100644 (file)
@@ -92,11 +92,11 @@ static bool ParseDrbdStatus()
                                memset(&device, 0, sizeof(DRBD_DEVICE));
                                device.id = strtol(&line[pmatch[1].rm_so], NULL, 10);
                                device.protocol = line[pmatch[8].rm_so];
-                               nx_strncpy_mb(device.connState, &line[pmatch[2].rm_so], STATUS_FIELD_LEN);
-                               nx_strncpy_mb(device.localDeviceState, &line[pmatch[4].rm_so], STATUS_FIELD_LEN);
-                               nx_strncpy_mb(device.remoteDeviceState, &line[pmatch[5].rm_so], STATUS_FIELD_LEN);
-                               nx_strncpy_mb(device.localDataState, &line[pmatch[6].rm_so], STATUS_FIELD_LEN);
-                               nx_strncpy_mb(device.remoteDataState, &line[pmatch[7].rm_so], STATUS_FIELD_LEN);
+                               strlcpy(device.connState, &line[pmatch[2].rm_so], STATUS_FIELD_LEN);
+                               strlcpy(device.localDeviceState, &line[pmatch[4].rm_so], STATUS_FIELD_LEN);
+                               strlcpy(device.remoteDeviceState, &line[pmatch[5].rm_so], STATUS_FIELD_LEN);
+                               strlcpy(device.localDataState, &line[pmatch[6].rm_so], STATUS_FIELD_LEN);
+                               strlcpy(device.remoteDataState, &line[pmatch[7].rm_so], STATUS_FIELD_LEN);
 
                                if ((device.id >= 0) && (device.id < MAX_DEVICE_COUNT))
                                {
@@ -109,9 +109,9 @@ static bool ParseDrbdStatus()
                                        line[pmatch[i].rm_eo] = 0;
 
                                MutexLock(s_versionAccess);
-                               nx_strncpy_mb(s_drbdVersion, &line[pmatch[1].rm_so], 32);
+                               strlcpy(s_drbdVersion, &line[pmatch[1].rm_so], 32);
                                s_apiVersion = strtol(&line[pmatch[2].rm_so], NULL, 10);
-                               nx_strncpy_mb(s_protocolVersion, &line[pmatch[3].rm_so], 32);
+                               strlcpy(s_protocolVersion, &line[pmatch[3].rm_so], 32);
                                MutexUnlock(s_versionAccess);
                        }
                }
index 81acf9e..d74c246 100644 (file)
@@ -7,10 +7,11 @@ SOURCES = array.cpp base64.cpp bytestream.cpp cc_mb.cpp cc_ucs2.cpp \
          pa.cpp parisc_atomic.cpp \
           qsort.c queue.cpp rbuffer.cpp rwlock.cpp scandir.c serial.cpp \
          sha1.cpp sha2.cpp solaris9_atomic.c spoll.cpp streamcomp.cpp \
-         string.cpp stringlist.cpp strmap.cpp strmapbase.cpp strptime.c \
+         string.cpp stringlist.cpp strlcat.c strlcpy.c strmap.cpp \
+         strmapbase.cpp strptime.c \
          strset.cpp strtoll.c strtoull.c table.cpp threads.cpp timegm.c \
          tools.cpp tp.cpp unicode.cpp uuid.cpp wcstoll.c wcstoull.c xml.cpp \
-         wcscasecmp.cpp wcsncasecmp.cpp
+         wcscasecmp.cpp wcslcat.c wcslcpy.c wcsncasecmp.cpp
 
 lib_LTLIBRARIES = libnetxms.la
 
index 1b97727..01077e4 100644 (file)
@@ -756,13 +756,13 @@ bool Config::parseTemplate(const TCHAR *section, NX_CFG_TEMPLATE *cfgTemplate)
    ConfigEntry *entry;
 
    name[0] = _T('/');
-   nx_strncpy(&name[1], section, MAX_PATH - 2);
+   _tcslcpy(&name[1], section, MAX_PATH - 2);
    _tcscat(name, _T("/"));
    pos = (int)_tcslen(name);
 
    for(i = 0; cfgTemplate[i].type != CT_END_OF_LIST; i++)
    {
-      nx_strncpy(&name[pos], cfgTemplate[i].token, MAX_PATH - pos);
+      _tcslcpy(&name[pos], cfgTemplate[i].token, MAX_PATH - pos);
       entry = getEntry(name);
       if (entry != NULL)
       {
@@ -821,7 +821,7 @@ bool Config::parseTemplate(const TCHAR *section, NX_CFG_TEMPLATE *cfgTemplate)
                {
                   break;   // this parameter was already initialized, and override from config is forbidden
                }
-               nx_strncpy((TCHAR *)cfgTemplate[i].buffer, value, (size_t)cfgTemplate[i].bufferSize);
+               _tcslcpy((TCHAR *)cfgTemplate[i].buffer, value, (size_t)cfgTemplate[i].bufferSize);
                break;
             case CT_MB_STRING:
                if ((cfgTemplate[i].overrideIndicator != NULL) &&
@@ -833,7 +833,7 @@ bool Config::parseTemplate(const TCHAR *section, NX_CFG_TEMPLATE *cfgTemplate)
                memset(cfgTemplate[i].buffer, 0, (size_t)cfgTemplate[i].bufferSize);
                WideCharToMultiByte(CP_ACP, WC_COMPOSITECHECK | WC_DEFAULTCHAR, value, -1, (char *)cfgTemplate[i].buffer, (int)cfgTemplate[i].bufferSize - 1, NULL, NULL);
 #else
-               nx_strncpy((TCHAR *)cfgTemplate[i].buffer, value, (size_t)cfgTemplate[i].bufferSize);
+               strlcpy((TCHAR *)cfgTemplate[i].buffer, value, (size_t)cfgTemplate[i].bufferSize);
 #endif
                break;
             case CT_STRING_LIST:
@@ -1352,7 +1352,7 @@ static void StartElement(void *userData, const char *name, const char **attrs)
          if (id != 0)
             snprintf(entryName, MAX_PATH, "%s#%u", name, (unsigned int) id);
          else
-            nx_strncpy(entryName, name, MAX_PATH);
+            strlcpy(entryName, name, MAX_PATH);
 #endif
          bool merge = XMLGetAttrBoolean(attrs, "merge", ps->merge);
          ps->stack[ps->level] = merge ? ps->stack[ps->level - 1]->findEntry(entryName) : NULL;
index 2996658..8e9878b 100644 (file)
@@ -1,7 +1,7 @@
 /** 
 ** NetXMS - Network Management System
 ** Utility Library
-** Copyright (C) 2003-2014 Victor Kirhenshtein
+** Copyright (C) 2003-2017 Victor Kirhenshtein
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published
@@ -86,7 +86,7 @@ HMODULE LIBNETXMS_EXPORTABLE DLOpen(const TCHAR *pszLibName, TCHAR *pszErrorText
    TCHAR szBuffer[MAX_PATH + 4];
    int nError;
 
-   nx_strncpy(&szBuffer[4], pszLibName, MAX_PATH);
+   _tcslcpy(&szBuffer[4], pszLibName, MAX_PATH);
    nError = LoadModule(getnetwarelogger(), &szBuffer[4], LO_RETURN_HANDLE);
    if (nError == 0)
    {
@@ -98,7 +98,7 @@ HMODULE LIBNETXMS_EXPORTABLE DLOpen(const TCHAR *pszLibName, TCHAR *pszErrorText
    {
       hModule = NULL;
                if (pszErrorText != NULL)
-       nx_strncpy(pszErrorText, (nError <= 19) ? m_pszErrorText[nError] : "Unknown error code", 255);
+       _tcslcpy(pszErrorText, (nError <= 19) ? m_pszErrorText[nError] : "Unknown error code", 255);
    }
 #else    /* not _WIN32 and not _NETWARE */
 #ifdef UNICODE
@@ -107,14 +107,14 @@ HMODULE LIBNETXMS_EXPORTABLE DLOpen(const TCHAR *pszLibName, TCHAR *pszErrorText
    if ((hModule == NULL) && (pszErrorText != NULL))
    {
        WCHAR *wbuffer = WideStringFromMBString(dlerror());
-      nx_strncpy(pszErrorText, wbuffer, 255);
+      _tcslcpy(pszErrorText, wbuffer, 255);
       free(wbuffer);
    }
    free(mbbuffer);
 #else
    hModule = dlopen(pszLibName, RTLD_NOW | RTLD_LOCAL);
    if ((hModule == NULL) && (pszErrorText != NULL))
-      nx_strncpy(pszErrorText, dlerror(), 255);
+      _tcslcpy(pszErrorText, dlerror(), 255);
 #endif
 #endif
    return hModule;
@@ -162,10 +162,10 @@ void LIBNETXMS_EXPORTABLE *DLGetSymbolAddr(HMODULE hModule, const char *pszSymbo
        {
 #ifdef UNICODE
        WCHAR *wbuffer = WideStringFromMBString(dlerror());
-      nx_strncpy(pszErrorText, wbuffer, 255);
+      _tcslcpy(pszErrorText, wbuffer, 255);
       free(wbuffer);
 #else
-      nx_strncpy(pszErrorText, dlerror(), 255);
+      _tcslcpy(pszErrorText, dlerror(), 255);
 #endif
        }
 #endif
index bac1b5b..55d5546 100644 (file)
@@ -1,6 +1,6 @@
 /*
 ** NetXMS - Network Management System
-** Copyright (C) 2003-2013 Victor Kirhenshtein
+** Copyright (C) 2003-2017 Victor Kirhenshtein
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published
@@ -85,8 +85,8 @@ GeoLocation::GeoLocation(const GeoLocation &src)
        m_type = src.m_type;
        m_lat = src.m_lat;
        m_lon = src.m_lon;
-       nx_strncpy(m_latStr, src.m_latStr, 20);
-       nx_strncpy(m_lonStr, src.m_lonStr, 20);
+       _tcslcpy(m_latStr, src.m_latStr, 20);
+       _tcslcpy(m_lonStr, src.m_lonStr, 20);
        m_isValid = src.m_isValid;
    m_accuracy = src.m_accuracy;
        m_timestamp = src.m_timestamp;
@@ -156,8 +156,8 @@ GeoLocation& GeoLocation::operator =(const GeoLocation &src)
        m_type = src.m_type;
        m_lat = src.m_lat;
        m_lon = src.m_lon;
-       nx_strncpy(m_latStr, src.m_latStr, 20);
-       nx_strncpy(m_lonStr, src.m_lonStr, 20);
+       _tcslcpy(m_latStr, src.m_latStr, 20);
+       _tcslcpy(m_lonStr, src.m_lonStr, 20);
        m_isValid = src.m_isValid;
        m_accuracy = src.m_accuracy;
        m_timestamp = src.m_timestamp;
@@ -400,7 +400,7 @@ GeoLocation GeoLocation::parseAgentData(const TCHAR *data)
    time_t timestamp;
 
    TCHAR buffer[256];
-   nx_strncpy(buffer, data, 256);
+   _tcslcpy(buffer, data, 256);
 
    int pos = 0;
    TCHAR *curr = buffer;
index 60f7082..3afff46 100644 (file)
@@ -1,7 +1,7 @@
 /*
 ** NetXMS - Network Management System
 ** Utility Library
-** Copyright (C) 2003-2015 Victor Kirhenshtein
+** Copyright (C) 2003-2017 Victor Kirhenshtein
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published
@@ -405,7 +405,7 @@ TCHAR *InetAddress::getHostByAddr(TCHAR *buffer, size_t buflen) const
        MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, hs->h_name, -1, buffer, (int)buflen);
        buffer[buflen - 1] = 0;
 #else
-   nx_strncpy(buffer, hs->h_name, buflen);
+   strlcpy(buffer, hs->h_name, buflen);
 #endif
 
    return buffer;
index 374e844..a335e73 100644 (file)
  */
 NamedPipeListener::NamedPipeListener(const TCHAR *name, HPIPE handle, NamedPipeRequestHandler reqHandler, void *userArg, const TCHAR *user)
 {
-   nx_strncpy(m_name, name, MAX_PIPE_NAME_LEN);
+   _tcslcpy(m_name, name, MAX_PIPE_NAME_LEN);
    m_handle = handle;
    m_reqHandler = reqHandler;
    m_userArg = userArg;
    m_serverThread = INVALID_THREAD_HANDLE;
    m_stop = false;
-   nx_strncpy(m_user, CHECK_NULL_EX(user), 64);
+   _tcslcpy(m_user, CHECK_NULL_EX(user), 64);
 }
 
 /**
@@ -74,8 +74,8 @@ THREAD_RESULT THREAD_CALL NamedPipeListener::serverThreadStarter(void *arg)
  */
 NamedPipe::NamedPipe(const TCHAR *name, HPIPE handle, const TCHAR *user)
 {
-   nx_strncpy(m_name, name, MAX_PIPE_NAME_LEN);
+   _tcslcpy(m_name, name, MAX_PIPE_NAME_LEN);
    m_handle = handle;
    m_writeLock = MutexCreate();
-   nx_strncpy(m_user, CHECK_NULL_EX(user), 64);
+   _tcslcpy(m_user, CHECK_NULL_EX(user), 64);
 }
index e55fc9a..4728329 100644 (file)
@@ -164,7 +164,7 @@ void NamedPipeListener::serverThread()
 #ifdef UNICODE
                MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, pw->pw_name, -1, user, 64);
 #else
-               nx_strncpy(user, pw->pw_name, 64);
+               strlcpy(user, pw->pw_name, 64);
 #endif
             }
             else
index 528f7db..114fdfb 100644 (file)
@@ -97,9 +97,9 @@ void LIBNETXMS_EXPORTABLE SetExceptionHandler(BOOL (*pfHandler)(EXCEPTION_POINTE
        m_pfExceptionHandler = pfHandler;
        m_pfWriter = pfWriter;
        if (pszBaseProcessName != NULL)
-               nx_strncpy(m_szBaseProcessName, pszBaseProcessName, 64);
+               _tcslcpy(m_szBaseProcessName, pszBaseProcessName, 64);
        if (pszDumpDir != NULL)
-               nx_strncpy(m_szDumpDir, pszDumpDir, MAX_PATH);
+               _tcslcpy(m_szDumpDir, pszDumpDir, MAX_PATH);
        m_dwLogMessageCode = dwLogMsgCode;
        m_writeFullDump = writeFullDump;
        m_printToScreen = printToScreen;
diff --git a/src/libnetxms/strlcat.c b/src/libnetxms/strlcat.c
new file mode 100644 (file)
index 0000000..488d6c4
--- /dev/null
@@ -0,0 +1,68 @@
+/*-
+ * Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL
+ * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "libnetxms.h"
+
+#if !HAVE_STRLCAT
+
+/*
+ * Appends src to string dst of size size (unlike strncat, size is the
+ * full size of dst, not space left).  At most size-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 LIBNETXMS_EXPORTABLE 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
diff --git a/src/libnetxms/strlcpy.c b/src/libnetxms/strlcpy.c
new file mode 100644 (file)
index 0000000..b87630e
--- /dev/null
@@ -0,0 +1,54 @@
+/*-
+ * Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include "libnetxms.h"
+
+#if !HAVE_STRLCPY
+
+/*
+ * Copy src to string dst of size size.  At most size-1 characters
+ * will be copied.  Always NUL terminates (unless size == 0).
+ * Returns strlen(src); if retval >= size, truncation occurred.
+ */
+size_t LIBNETXMS_EXPORTABLE 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)
+   {
+      while(--n != 0)
+      {
+         if ((*d++ = *s++) == '\0')
+            break;
+      }
+   }
+
+   /* 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 */
+}
+
+#endif
index 72e2097..b5ab639 100644 (file)
@@ -1,6 +1,6 @@
 /*
 ** NetXMS - Network Management System
-** Copyright (C) 2003-2014 Victor Kirhenshtein
+** Copyright (C) 2003-2017 Victor Kirhenshtein
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU Lesser General Public License as published
@@ -869,7 +869,7 @@ void Table::buildInstanceString(int row, TCHAR *buffer, size_t bufLen)
             instance += value;
       }
    }
-   nx_strncpy(buffer, (const TCHAR *)instance, bufLen);
+   _tcslcpy(buffer, (const TCHAR *)instance, bufLen);
 }
 
 /**
index 0693b95..f39fe97 100644 (file)
@@ -801,7 +801,7 @@ TCHAR LIBNETXMS_EXPORTABLE *GetSystemErrorText(UINT32 dwError, TCHAR *pszBuffer,
                      (LPTSTR)&msgBuf, 0, NULL) > 0)
    {
       msgBuf[_tcscspn(msgBuf, _T("\r\n"))] = 0;
-      nx_strncpy(pszBuffer, msgBuf, iBufSize);
+      _tcslcpy(pszBuffer, msgBuf, iBufSize);
       LocalFree(msgBuf);
    }
    else
@@ -821,7 +821,8 @@ TCHAR LIBNETXMS_EXPORTABLE *GetLastSocketErrorText(TCHAR *buffer, size_t size)
 #ifdef _WIN32
    return GetSystemErrorText(WSAGetLastError(), buffer, size);
 #else
-   return nx_strncpy(buffer, _tcserror(errno), size);
+   _tcslcpy(buffer, _tcserror(errno), size);
+   return buffer;
 #endif
 }
 
@@ -2284,32 +2285,6 @@ int LIBNETXMS_EXPORTABLE wmkstemp(WCHAR *tmpl)
 
 #endif
 
-#ifndef _WIN32
-
-/**
- * strcat_s implementation
- */
-int LIBNETXMS_EXPORTABLE strcat_s(char *dst, size_t dstSize, const char *src)
-{
-       if (strlen(dst) + strlen(src) + 1 >= dstSize)
-               return EINVAL;
-       strcat(dst, src);
-       return 0;
-}
-
-/**
- * wcscat_s implementation
- */
-int LIBNETXMS_EXPORTABLE wcscat_s(WCHAR *dst, size_t dstSize, const WCHAR *src)
-{
-       if (wcslen(dst) + wcslen(src) + 1 >= dstSize)
-               return EINVAL;
-       wcscat(dst, src);
-       return 0;
-}
-
-#endif
-
 /**
  * Destructor for RefCountObject
  */
@@ -2594,7 +2569,7 @@ void LIBNETXMS_EXPORTABLE GetNetXMSDirectory(nxDirectoryType type, TCHAR *dir)
             _sntprintf(dir, MAX_PATH, _T("%s\\share"), homeDir);
             break;
          default:
-            nx_strncpy(dir, homeDir, MAX_PATH);
+            _tcslcpy(dir, homeDir, MAX_PATH);
             break;
       }
 #else
@@ -2616,7 +2591,7 @@ void LIBNETXMS_EXPORTABLE GetNetXMSDirectory(nxDirectoryType type, TCHAR *dir)
             _sntprintf(dir, MAX_PATH, _T("%s/share/netxms"), homeDir);
             break;
          default:
-            nx_strncpy(dir, homeDir, MAX_PATH);
+            _tcslcpy(dir, homeDir, MAX_PATH);
             break;
       }
 #endif
@@ -2682,7 +2657,7 @@ void LIBNETXMS_EXPORTABLE GetNetXMSDirectory(nxDirectoryType type, TCHAR *dir)
          _sntprintf(dir, MAX_PATH, _T("%s\\share"), installPath);
          break;
       default:
-         nx_strncpy(dir, installPath, MAX_PATH);
+         _tcslcpy(dir, installPath, MAX_PATH);
          break;
    }
 #else
diff --git a/src/libnetxms/wcslcat.c b/src/libnetxms/wcslcat.c
new file mode 100644 (file)
index 0000000..f3e67f0
--- /dev/null
@@ -0,0 +1,68 @@
+/*-
+ * Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL
+ * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "libnetxms.h"
+
+#if !HAVE_WCSLCAT
+
+/*
+ * Appends src to string dst of size size (unlike strncat, size is the
+ * full size of dst, not space left).  At most size-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 LIBNETXMS_EXPORTABLE wcslcat(WCHAR *dst, const WCHAR *src, size_t size)
+{
+   WCHAR *d = dst;
+   const WCHAR *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 + wcslen(s));
+   while(*s != 0)
+   {
+      if (n != 1)
+      {
+         *d++ = *s;
+         n--;
+      }
+      s++;
+   }
+   *d = 0;
+
+   return (dlen + (s - src)); /* count does not include NUL */
+}
+
+#endif
diff --git a/src/libnetxms/wcslcpy.c b/src/libnetxms/wcslcpy.c
new file mode 100644 (file)
index 0000000..5b2c686
--- /dev/null
@@ -0,0 +1,54 @@
+/*-
+ * Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include "libnetxms.h"
+
+#if !HAVE_WCSLCPY
+
+/*
+ * Copy src to string dst of size size.  At most size-1 characters
+ * will be copied.  Always NUL terminates (unless size == 0).
+ * Returns strlen(src); if retval >= size, truncation occurred.
+ */
+size_t LIBNETXMS_EXPORTABLE wcslcpy(WCHAR *dst, const WCHAR *src, size_t size)
+{
+   WCHAR *d = dst;
+   const WCHAR *s = src;
+   size_t n = size;
+
+   /* Copy as many bytes as will fit */
+   if (n != 0)
+   {
+      while(--n != 0)
+      {
+         if ((*d++ = *s++) == 0)
+            break;
+      }
+   }
+
+   /* 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 */
+}
+
+#endif
index 3b47c21..2a4177c 100644 (file)
@@ -257,10 +257,10 @@ void NetworkMapObjectList::linkObjects(UINT32 id1, UINT32 id2, int linkType, con
  */
 static void UpdatePortNames(ObjLink *link, const TCHAR *port1, const TCHAR *port2)
 {
-       _tcscat_s(link->port1, MAX_CONNECTOR_NAME, _T(", "));
-       _tcscat_s(link->port1, MAX_CONNECTOR_NAME, port1);
-       _tcscat_s(link->port2, MAX_CONNECTOR_NAME, _T(", "));
-       _tcscat_s(link->port2, MAX_CONNECTOR_NAME, port2);
+       _tcslcat(link->port1, _T(", "), MAX_CONNECTOR_NAME);
+       _tcslcat(link->port1, port1, MAX_CONNECTOR_NAME);
+       _tcslcat(link->port2, _T(", "), MAX_CONNECTOR_NAME);
+       _tcslcat(link->port2, port2, MAX_CONNECTOR_NAME);
 }
 
 /**