From 31671ce204337b7c18bd06780b5571fdab079db9 Mon Sep 17 00:00:00 2001 From: Jiri Pittner Date: Fri, 30 Oct 2026 21:19:29 +0100 Subject: [PATCH] bugfixes in auxstorage --- auxstorage.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/auxstorage.h b/auxstorage.h index 7029278..876f23e 100644 --- a/auxstorage.h +++ b/auxstorage.h @@ -48,6 +48,8 @@ public: AuxStorage(void); AuxStorage(const char *name); ~AuxStorage(void) {close(fd); if(deleteme) unlink(filename);}; + AuxStorage(const AuxStorage &) = delete; //a copy would close the file twice + AuxStorage & operator=(const AuxStorage &) = delete; void get(NRVec &x, const int pos) const; void put(const NRVec &x, const int pos); void get(NRMat &x, const int pos) const; @@ -70,6 +72,7 @@ deleteme=1; template AuxStorage::AuxStorage(const char *name) { +if(strlen(name)>=sizeof(filename)) laerror("file name too long in AuxStorage"); strcpy(filename,name); unlink(filename); fd=open(filename,O_CREAT|O_LARGEFILE|O_RDWR,0777); @@ -84,6 +87,7 @@ template void AuxStorage::get(NRVec &x, const int pos) const { if(recl==0) laerror("get from an empty file in AuxStorage"); +if(recl!=x.size()*sizeof(T)) laerror("size mismatch in AuxStorage::get"); if((off64_t)-1 == lseek64(fd,pos*((off64_t)recl),SEEK_SET)) {perror(""); laerror("seek failed in AuxStorage");} x.copyonwrite(); if((ssize_t)recl!=read(fd,&x[0],recl)) {perror(""); laerror("read failed in AuxStorage");} @@ -103,6 +107,7 @@ template void AuxStorage::get(NRMat &x, const int pos) const { if(recl==0) laerror("get from an empty file in AuxStorage"); +if(recl!=(size_t)x.nrows()*x.ncols()*sizeof(T)) laerror("size mismatch in AuxStorage::get"); if((off64_t)-1 == lseek64(fd,pos*((off64_t)recl),SEEK_SET)) {perror(""); laerror("seek failed in AuxStorage");} x.copyonwrite(); if((ssize_t)recl!=read(fd,&x(0,0),recl)) {perror(""); laerror("read failed in AuxStorage");} @@ -122,6 +127,7 @@ template void AuxStorage::get(NRSMat &x, const int pos) const { if(recl==0) laerror("get from an empty file in AuxStorage"); +if(recl!=(size_t)x.nrows()*(x.nrows()+1)/2*sizeof(T)) laerror("size mismatch in AuxStorage::get"); if((off64_t)-1 == lseek64(fd,pos*((off64_t)recl),SEEK_SET)) {perror(""); laerror("seek failed in AuxStorage");} x.copyonwrite(); if((ssize_t)recl!=read(fd,&x(0,0),recl)) {perror(""); laerror("read failed in AuxStorage");}