From bbaa9310eccdbd1d4701a9c7f792f7f3aacb8823 Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Tue, 13 Aug 2019 20:49:48 +0200 Subject: [PATCH] Ensure that buffers are always terminated --- src/algorithms/libs/rtklib/rtklib_rtkcmn.cc | 13 +++++++++++++ src/algorithms/libs/rtklib/rtklib_rtkpos.cc | 1 + src/algorithms/libs/rtklib/rtklib_rtksvr.cc | 1 + src/algorithms/libs/rtklib/rtklib_stream.cc | 17 ++++++++++++++++- 4 files changed, 31 insertions(+), 1 deletion(-) diff --git a/src/algorithms/libs/rtklib/rtklib_rtkcmn.cc b/src/algorithms/libs/rtklib/rtklib_rtkcmn.cc index 786d5f189..d924d3d69 100644 --- a/src/algorithms/libs/rtklib/rtklib_rtkcmn.cc +++ b/src/algorithms/libs/rtklib/rtklib_rtkcmn.cc @@ -674,30 +674,37 @@ void setcodepri(int sys, int freq, const char *pri) if (sys & SYS_GPS) { std::strncpy(codepris[0][freq - 1], pri, 16); + codepris[0][freq - 1][15] = '\0'; } if (sys & SYS_GLO) { std::strncpy(codepris[1][freq - 1], pri, 16); + codepris[1][freq - 1][15] = '\0'; } if (sys & SYS_GAL) { std::strncpy(codepris[2][freq - 1], pri, 16); + codepris[2][freq - 1][15] = '\0'; } if (sys & SYS_QZS) { std::strncpy(codepris[3][freq - 1], pri, 16); + codepris[3][freq - 1][15] = '\0'; } if (sys & SYS_SBS) { std::strncpy(codepris[4][freq - 1], pri, 16); + codepris[4][freq - 1][15] = '\0'; } if (sys & SYS_BDS) { std::strncpy(codepris[5][freq - 1], pri, 16); + codepris[5][freq - 1][15] = '\0'; } if (sys & SYS_IRN) { std::strncpy(codepris[6][freq - 1], pri, 16); + codepris[6][freq - 1][15] = '\0'; } } else @@ -2982,6 +2989,7 @@ pcv_t *searchpcv(int sat, const char *type, gtime_t time, if (strlen(type) < MAXANT + 1) { std::strncpy(buff, type, MAXANT); + buff[MAXANT - 1] = '\0'; } else { @@ -3873,6 +3881,7 @@ void traceopen(const char *file) if (strlen(file) < 1025) { std::strncpy(file_trace, file, 1024); + file_trace[1023] = '\0'; } else { @@ -4100,6 +4109,7 @@ void createdir(const char *path) if (strlen(path) < 1025) { std::strncpy(buff, path, 1024); + buff[1023] = '\0'; } else { @@ -4145,6 +4155,7 @@ int repstr(char *str, const char *pat, const char *rep) if (strlen(p) < 1025) { std::strncpy(r, p, 1024); + r[1023] = '\0'; } else { @@ -5083,6 +5094,7 @@ int rtk_uncompress(const char *file, char *uncfile) if (strlen(file) < 1025) { std::strncpy(tmpfile, file, 1024); + tmpfile[1023] = '\0'; } else { @@ -5279,6 +5291,7 @@ int expath(const char *path, char *paths[], int nmax) if (strlen(paths[i]) < 1025) { std::strncpy(tmp, paths[i], 1024); + tmp[1023] = '\0'; } else { diff --git a/src/algorithms/libs/rtklib/rtklib_rtkpos.cc b/src/algorithms/libs/rtklib/rtklib_rtkpos.cc index b860109bb..aef2ab19a 100644 --- a/src/algorithms/libs/rtklib/rtklib_rtkpos.cc +++ b/src/algorithms/libs/rtklib/rtklib_rtkpos.cc @@ -164,6 +164,7 @@ int rtkopenstat(const char *file, int level) if (strlen(file) < 1025) { std::strncpy(file_stat, file, 1024); + file_stat[1023] = '\0'; } else { diff --git a/src/algorithms/libs/rtklib/rtklib_rtksvr.cc b/src/algorithms/libs/rtklib/rtklib_rtksvr.cc index 6ef6354ed..0c7a1d477 100644 --- a/src/algorithms/libs/rtklib/rtklib_rtksvr.cc +++ b/src/algorithms/libs/rtklib/rtklib_rtksvr.cc @@ -996,6 +996,7 @@ int rtksvrstart(rtksvr_t *svr, int cycle, int buffsize, int *strs, if (strlen(rcvopts[i]) < 256) { std::strncpy(svr->rtcm[i].opt, rcvopts[i], 256); + svr->rtcm[i].opt[255] = '\0'; } /* connect dgps corrections */ diff --git a/src/algorithms/libs/rtklib/rtklib_stream.cc b/src/algorithms/libs/rtklib/rtklib_stream.cc index a7c209ae0..ea0821685 100644 --- a/src/algorithms/libs/rtklib/rtklib_stream.cc +++ b/src/algorithms/libs/rtklib/rtklib_stream.cc @@ -118,6 +118,7 @@ serial_t *openserial(const char *path, int mode, char *msg) else if (strlen(path) < 128) { std::strncpy(port, path, 128); + port[127] = '\0'; } for (i = 0; i < 10; i++) @@ -423,6 +424,7 @@ file_t *openfile(const char *path, int mode, char *msg) if (strlen(path) < MAXSTRPATH) { std::strncpy(file->path, path, MAXSTRPATH); + file->path[MAXSTRPATH - 1] = '\0'; } if ((p = strstr(file->path, "::"))) { @@ -744,6 +746,7 @@ void decodetcppath(const char *path, char *addr, char *port, char *user, if (strlen(path) < MAXSTRPATH) { std::strncpy(buff, path, MAXSTRPATH); + buff[MAXSTRPATH - 1] = '\0'; } if (!(p = strrchr(buff, '@'))) @@ -759,12 +762,14 @@ void decodetcppath(const char *path, char *addr, char *port, char *user, if (str) { std::strncpy(str, q + 1, NTRIP_MAXSTR); + str[NTRIP_MAXSTR - 1] = '\0'; } } *p = '\0'; if (mntpnt) { std::strncpy(mntpnt, p + 1, 256); + mntpnt[255] = '\0'; } } if ((p = strrchr(buff, '@'))) @@ -776,11 +781,13 @@ void decodetcppath(const char *path, char *addr, char *port, char *user, if (passwd) { std::strncpy(passwd, q + 1, 256); + passwd[255] = '\0'; } } if (user) { std::strncpy(user, buff, 256); + user[255] = '\0'; } } else @@ -794,11 +801,13 @@ void decodetcppath(const char *path, char *addr, char *port, char *user, if (port) { std::strncpy(port, q + 1, 256); + port[255] = '\0'; } } if (addr) { - std::strncpy(addr, p, 1024); + std::strncpy(addr, p, 256); + addr[255] = '\0'; } } @@ -1081,6 +1090,7 @@ void updatetcpsvr(tcpsvr_t *tcpsvr, char *msg) continue; } std::strncpy(saddr, tcpsvr->cli[i].saddr, 256); + saddr[255] = '\0'; n++; } if (n == 0) @@ -1149,6 +1159,7 @@ int accsock(tcpsvr_t *tcpsvr, char *msg) if (strlen(inet_ntoa(addr.sin_addr)) < 256) { std::strncpy(tcpsvr->cli[i].saddr, inet_ntoa(addr.sin_addr), 256); + tcpsvr->cli[i].saddr[255] = '\0'; } sprintf(msg, "%s", tcpsvr->cli[i].saddr); tracet(2, "accsock: connected sock=%d addr=%s\n", tcpsvr->cli[i].sock, tcpsvr->cli[i].saddr); @@ -1848,6 +1859,7 @@ void decodeftppath(const char *path, char *addr, char *file, char *user, if (strlen(path) < MAXSTRPATH) { std::strncpy(buff, path, MAXSTRPATH); + buff[MAXSTRPATH - 1] = '\0'; } if ((p = strchr(buff, '/'))) @@ -2292,6 +2304,7 @@ int stropen(stream_t *stream, int type, int mode, const char *path) if (strlen(path) < MAXSTRPATH) { std::strncpy(stream->path, path, MAXSTRPATH); + stream->path[MAXSTRPATH - 1] = '\0'; } stream->inb = stream->inr = stream->outb = stream->outr = 0; stream->tick = tickget(); @@ -2721,6 +2734,7 @@ void strsetdir(const char *dir) if (strlen(dir) < 1024) { std::strncpy(localdir, dir, 1024); + localdir[1023] = '\0'; } } @@ -2736,6 +2750,7 @@ void strsetproxy(const char *addr) if (strlen(addr) < 256) { std::strncpy(proxyaddr, addr, 256); + proxyaddr[255] = '\0'; } }