diff --git a/software/drscl/CMakeLists.txt b/software/drscl/CMakeLists.txt index bb32dce..76f53ac 100644 --- a/software/drscl/CMakeLists.txt +++ b/software/drscl/CMakeLists.txt @@ -8,9 +8,9 @@ set(SRC ../src/DRS.cpp ../src/averager.cpp ../src/musbstd.c - ../mxml/mxml.cxx - ../mxml/strlcpy.cxx) - + ../src/strlcpy.cxx + ../mxml/mxml.cxx) + add_executable(drscl ${SRC} drscl.cpp) add_executable(drs_exam ${SRC} drs_exam.cpp) add_executable(drs_exam_multi ${SRC} drs_exam_multi.cpp) diff --git a/software/drsosc/CMakeLists.txt b/software/drsosc/CMakeLists.txt index 4c8a085..c4414c6 100644 --- a/software/drsosc/CMakeLists.txt +++ b/software/drsosc/CMakeLists.txt @@ -12,8 +12,8 @@ set(LIBSRC ../src/DRS.cpp ../src/averager.cpp ../src/musbstd.c - ../mxml/mxml.cxx - ../mxml/strlcpy.cxx) + ../src/strlcpy.cxx + ../mxml/mxml.cxx) set(SRC ConfigDialog.cpp diff --git a/software/include/strlcpy.h b/software/include/strlcpy.h new file mode 100644 index 0000000..589a644 --- /dev/null +++ b/software/include/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_ */ diff --git a/software/mxml b/software/mxml index 5e10343..726495c 160000 --- a/software/mxml +++ b/software/mxml @@ -1 +1 @@ -Subproject commit 5e10343edbf0c56dc635d5b9752d4c052ac3e5d6 +Subproject commit 726495c1e52deee1263f856b8c78925225a3e589 diff --git a/software/src/DRS.cpp b/software/src/DRS.cpp index 3034536..6a529e6 100644 --- a/software/src/DRS.cpp +++ b/software/src/DRS.cpp @@ -322,7 +322,7 @@ DRS::DRS() usb_interface->usb_type = 1; // USB 1.1 fBoard[fNumberOfBoards] = new DRSBoard(usb_interface, usb_slot++); if (!fBoard[fNumberOfBoards]->HasCorrectFirmware()) - sprintf(fError, "Wrong firmware version: board has %d, required is %d. Board may not work correctly.\n", + snprintf(fError, sizeof(fError), "Wrong firmware version: board has %d, required is %d. Board may not work correctly.\n", fBoard[fNumberOfBoards]->GetFirmwareVersion(), fBoard[fNumberOfBoards]->GetRequiredFirmwareVersion()); fNumberOfBoards++; @@ -350,7 +350,7 @@ DRS::DRS() usb_interface->usb_type = 2; // USB 2.0 fBoard[fNumberOfBoards] = new DRSBoard(usb_interface, usb_slot++); if (!fBoard[fNumberOfBoards]->HasCorrectFirmware()) - sprintf(fError, "Wrong firmware version: board has %d, required is %d. Board may not work correctly.\n", + snprintf(fError, sizeof(fError), "Wrong firmware version: board has %d, required is %d. Board may not work correctly.\n", fBoard[fNumberOfBoards]->GetFirmwareVersion(), fBoard[fNumberOfBoards]->GetRequiredFirmwareVersion()); fNumberOfBoards++; @@ -4893,7 +4893,7 @@ DRSBoard::TimeData * DRSBoard::GetTimeCalibration(unsigned int chipIndex, bool r if (i <= 499 || (i >= 501 && i <= 999) || (i >= 1001 && i <= 1499) || (i >= 1501 && i <= 1999) || (i >= 2001 && i <= 2499) || i >= 2501) continue; - sprintf(fileName, "%s/board%d/TimeCalib_board%d_chip%d_%dMHz.xml", fCalibDirectory, fBoardSerialNumber, + snprintf(fileName, sizeof(fileName), "%s/board%d/TimeCalib_board%d_chip%d_%dMHz.xml", fCalibDirectory, fBoardSerialNumber, fBoardSerialNumber, chipIndex, i); rootNode = mxml_parse_file(fileName, error, sizeof(error), NULL); if (rootNode == NULL) @@ -4925,8 +4925,7 @@ DRSBoard::TimeData * DRSBoard::GetTimeCalibration(unsigned int chipIndex, bool r void DRSBoard::SetCalibrationDirectory(const char *calibrationDirectoryPath) { - strncpy(fCalibDirectory, calibrationDirectoryPath, strlen(calibrationDirectoryPath)); - fCalibDirectory[strlen(calibrationDirectoryPath)] = 0; + strlcpy(fCalibDirectory, calibrationDirectoryPath, sizeof(fCalibDirectory)); }; /*------------------------------------------------------------------*/ @@ -6220,12 +6219,12 @@ bool ResponseCalibration::WriteCalibrationV3(unsigned int chipIndex) // Open File fBoard->GetCalibrationDirectory(strt); - sprintf(str, "%s/board%d", strt, fBoard->GetBoardSerialNumber()); + snprintf(str, sizeof(str), "%s/board%d", strt, fBoard->GetBoardSerialNumber()); if (MakeDir(str) == -1) { printf("Error: Cannot create directory \"%s\"\n", str); return false; } - sprintf(str, "%s/board%d/ResponseCalib_board%d_chip%d_%dMHz.bin", strt, fBoard->GetBoardSerialNumber(), + snprintf(str, sizeof(str), "%s/board%d/ResponseCalib_board%d_chip%d_%dMHz.bin", strt, fBoard->GetBoardSerialNumber(), fBoard->GetBoardSerialNumber(), chipIndex, static_cast < int >(fBoard->GetNominalFrequency() * 1000)); fCalibFile = fopen(str, "wb"); if (fCalibFile == NULL) { @@ -6279,12 +6278,12 @@ bool ResponseCalibration::WriteCalibrationV4(unsigned int chipIndex) // Open File fBoard->GetCalibrationDirectory(strt); - sprintf(str, "%s/board%d", strt, fBoard->GetBoardSerialNumber()); + snprintf(str, sizeof(str), "%s/board%d", strt, fBoard->GetBoardSerialNumber()); if (MakeDir(str) == -1) { printf("Error: Cannot create directory \"%s\"\n", str); return false; } - sprintf(str, "%s/board%d/ResponseCalib_board%d_chip%d_%dMHz.bin", strt, fBoard->GetBoardSerialNumber(), + snprintf(str, sizeof(str), "%s/board%d/ResponseCalib_board%d_chip%d_%dMHz.bin", strt, fBoard->GetBoardSerialNumber(), fBoard->GetBoardSerialNumber(), chipIndex, static_cast < int >(fBoard->GetNominalFrequency() * 1000)); fCalibFile = fopen(str, "wb"); if (fCalibFile == NULL) { @@ -7233,7 +7232,7 @@ bool ResponseCalibration::ReadCalibrationV3(unsigned int chipIndex) fCalibrationData[chipIndex] = NULL; fBoard->GetCalibrationDirectory(calibDir); - sprintf(fileName, "%s/board%d/ResponseCalib_board%d_chip%d_%dMHz.bin", calibDir, + snprintf(fileName, sizeof(fileName), "%s/board%d/ResponseCalib_board%d_chip%d_%dMHz.bin", calibDir, fBoard->GetBoardSerialNumber(), fBoard->GetBoardSerialNumber(), chipIndex, static_cast < int >(fBoard->GetNominalFrequency() * 1000)); @@ -7391,7 +7390,7 @@ bool ResponseCalibration::ReadCalibrationV4(unsigned int chipIndex) // Read Response Calibration fBoard->GetCalibrationDirectory(calibDir); - sprintf(fileName, "%s/board%d/ResponseCalib_board%d_chip%d_%dMHz.bin", calibDir, + snprintf(fileName, sizeof(fileName), "%s/board%d/ResponseCalib_board%d_chip%d_%dMHz.bin", calibDir, fBoard->GetBoardSerialNumber(), fBoard->GetBoardSerialNumber(), chipIndex, static_cast < int >(fBoard->GetNominalFrequency() * 1000)); diff --git a/software/src/strlcpy.cxx b/software/src/strlcpy.cxx new file mode 100644 index 0000000..586c2bc --- /dev/null +++ b/software/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