Fixed memory leak in shell.

pull/22/head
weetmuts 2019-01-04 22:27:51 +01:00
rodzic accdb1c0e9
commit 38c3287f68
11 zmienionych plików z 49 dodań i 21 usunięć

Wyświetl plik

@ -1,4 +1,12 @@
Version 0.8.1: 2019-01-04
Fixed memory leak in shell invocation.
Improved dvparser to properly handle the supercom587 telegrams.
(It still does not extract all the data, but the data is properly parsed and chunked.)
Added address sanitizer to debug build.
Added static analysis check.sh.
Version 0.8: 2018-11-29
Multical21 now reports flow temperature and external temperature.

Wyświetl plik

@ -44,7 +44,7 @@ endif
$(shell mkdir -p $(BUILD))
CXXFLAGS := $(DEBUG_FLAGS) -fPIC -fmessage-length=0 -std=c++11 -Wall -Wno-maybe-uninitialized -Wno-unused-function "-DWMBUSMETERS_VERSION=\"0.8\""
CXXFLAGS := $(DEBUG_FLAGS) -fPIC -fmessage-length=0 -std=c++11 -Wall -Wno-maybe-uninitialized -Wno-unused-function "-DWMBUSMETERS_VERSION=\"0.8.1\""
$(BUILD)/%.o: %.cc $(wildcard %.h)
$(CXX) $(CXXFLAGS) $< -c -o $@
@ -72,20 +72,20 @@ METERS_OBJS:=\
all: $(BUILD)/wmbusmeters $(BUILD)/testinternals
@$(STRIP_BINARY)
dist: wmbusmeters_0.8_$(DEBARCH).deb
dist: wmbusmeters_0.8.1_$(DEBARCH).deb
wmbusmeters_0.8_$(DEBARCH).deb:
wmbusmeters_0.8.1_$(DEBARCH).deb:
@mkdir -p $(BUILD)/debian/wmbusmeters/DEBIAN
@mkdir -p $(BUILD)/debian/wmbusmeters/usr/local/bin
@cp $(BUILD)/wmbusmeters $(BUILD)/debian/wmbusmeters/usr/local/bin
@rm -f $(BUILD)/debian/wmbusmeters/DEBIAN/control
@echo "Package: wmbusmeters" >> $(BUILD)/debian/wmbusmeters/DEBIAN/control
@echo "Version: 0.8" >> $(BUILD)/debian/wmbusmeters/DEBIAN/control
@echo "Version: 0.8.1" >> $(BUILD)/debian/wmbusmeters/DEBIAN/control
@echo "Maintainer: Fredrik Öhrström" >> $(BUILD)/debian/wmbusmeters/DEBIAN/control
@echo "Architecture: $(DEBARCH)" >> $(BUILD)/debian/wmbusmeters/DEBIAN/control
@echo "Description: A tool to read wireless mbus telegrams from utility meters." >> $(BUILD)/debian/wmbusmeters/DEBIAN/control
@(cd $(BUILD)/debian; dpkg-deb --build wmbusmeters .)
@mv $(BUILD)/debian/wmbusmeters_0.8_$(DEBARCH).deb .
@mv $(BUILD)/debian/wmbusmeters_0.8.1_$(DEBARCH).deb .
@echo Built package $@
$(BUILD)/wmbusmeters: $(METERS_OBJS) $(BUILD)/main.o
@ -96,7 +96,7 @@ $(BUILD)/testinternals: $(METERS_OBJS) $(BUILD)/testinternals.o
$(CXX) -o $(BUILD)/testinternals $(METERS_OBJS) $(BUILD)/testinternals.o $(DEBUG_LDFLAGS) -lpthread
clean:
rm -f build/* build_arm/* build_debug/* build_arm_debug/* *~
rm -rf build/* build_arm/* build_debug/* build_arm_debug/* *~
test:
./build/testinternals

6
check.sh 100755
Wyświetl plik

@ -0,0 +1,6 @@
#!/bin/bash
# Build with static analysis tool Coverity
make clean
rm -rf cov-int
cov-build --dir cov-int make
tar czvf wmbusmeters.tgz cov-int

Wyświetl plik

@ -80,8 +80,8 @@ struct SerialDeviceTTY : public SerialDeviceImp {
private:
string device_;
int baud_rate_;
int fd_;
int baud_rate_ {};
int fd_ {};
pthread_mutex_t write_lock_ = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t read_lock_ = PTHREAD_MUTEX_INITIALIZER;
SerialCommunicationManagerImp *manager_;
@ -208,6 +208,9 @@ unique_ptr<SerialDevice> SerialCommunicationManagerImp::createSerialDeviceTTY(st
void SerialCommunicationManagerImp::listenTo(SerialDevice *sd, function<void()> cb) {
SerialDeviceImp *si = dynamic_cast<SerialDeviceImp*>(sd);
if (!si) {
error("Internal error: Invalid serial device passed to listenTo.\n");
}
si->on_data_ = cb;
}

Wyświetl plik

@ -36,6 +36,7 @@ struct SerialDevice {
virtual int receive(std::vector<uchar> *data) = 0;
virtual int fd() = 0;
virtual SerialCommunicationManager *manager() = 0;
virtual ~SerialDevice() = default;
};
struct SerialCommunicationManager {

Wyświetl plik

@ -27,7 +27,7 @@
void invokeShell(string program, vector<string> args, vector<string> envs)
{
const char **argv = new const char*[args.size()+2];
vector<const char*> argv(args.size()+2);
argv[0] = program.c_str();
int i = 1;
debug("exec \"%s\"\n", program.c_str());
@ -38,7 +38,7 @@ void invokeShell(string program, vector<string> args, vector<string> envs)
}
argv[i] = NULL;
const char **env = new const char*[envs.size()+1];
vector<const char*> env(envs.size()+1);
env[0] = program.c_str();
i = 0;
for (auto &e : envs) {
@ -53,7 +53,7 @@ void invokeShell(string program, vector<string> args, vector<string> envs)
if (pid == 0) {
// I am the child!
close(0); // Close stdin
execvpe(program.c_str(), (char*const*)argv, (char*const*)env);
execvpe(program.c_str(), (char*const*)&argv[0], (char*const*)&env[0]);
perror("Execvp failed:");
error("Invoking shell %s failed!\n", program.c_str());
} else {

14
test.sh
Wyświetl plik

@ -43,3 +43,17 @@ then
else
Failure.
fi
$PROG --shell='echo "$METER_JSON"' simulation_shell.txt MWW supercom587 12345678 "" > test_output.txt
if [ "$?" == "0" ]
then
cat test_output.txt | sed 's/"timestamp":"....-..-..T..:..:..Z"/"timestamp":"1111-11-11T11:11:11Z"/' > test_responses.txt
echo '{"media":"warm water","meter":"supercom587","name":"MWW","id":"12345678","total_m3":5.548000,"timestamp":"1111-11-11T11:11:11Z"}' > test_expected.txt
diff test_expected.txt test_responses.txt
if [ "$?" == "0" ]
then
echo SHELL OK
fi
else
Failure.
fi

Wyświetl plik

@ -655,7 +655,6 @@ string vifType(int vif)
case 0x78: return "Fabrication no";
case 0x79: return "Enhanced identification";
case 0x80: return "Address";
case 0x7C: return "VIF in following string (length in first byte)";
case 0x7E: return "Any VIF";
@ -988,7 +987,6 @@ string vifKey(int vif)
case 0x78: return "fabrication_no"; // Fabrication no
case 0x79: return "enhanced_identification"; // Enhanced identification
case 0x80: return "address"; // Address
case 0x7C: // VIF in following string (length in first byte)
case 0x7E: // Any VIF
@ -1146,7 +1144,6 @@ string vifUnit(int vif)
case 0x78: return ""; // Fabrication no
case 0x79: return ""; // Enhanced identification
case 0x80: return ""; // Address
case 0x7C: // VIF in following string (length in first byte)
case 0x7E: // Any VIF
@ -1530,7 +1527,7 @@ string vif_FB_ExtensionType(uchar dif, uchar vif, uchar vife)
return s;
}
if ((vife & 0x7e) == 0x29 ||
if ((vife & 0x7f) == 0x29 ||
(vife & 0x7c) == 0x2c) {
return "Reserved";
}

Wyświetl plik

@ -48,8 +48,8 @@ private:
vector<uchar> read_buffer_;
pthread_mutex_t command_lock_ = PTHREAD_MUTEX_INITIALIZER;
sem_t command_wait_;
int sent_command_;
int received_command_;
int sent_command_ {};
int received_command_ {};
vector<uchar> received_payload_;
vector<function<void(Telegram*)>> telegram_listeners_;

Wyświetl plik

@ -45,8 +45,8 @@ private:
vector<function<void(Telegram*)>> telegram_listeners_;
string file_;
SerialCommunicationManager *manager_;
LinkMode link_mode_;
SerialCommunicationManager *manager_ {};
LinkMode link_mode_ {};
vector<string> lines_;
};

Wyświetl plik

@ -120,14 +120,13 @@ void decryptMode5_AES_CBC(Telegram *t, vector<uchar> &aeskey)
uchar decrypted_data[content.size()];
AES_CBC_decrypt_buffer(decrypted_data, &content[0], content.size(), &aeskey[0], iv);
vector<uchar> decrypted(decrypted_data, decrypted_data+content.size());
if (decrypted_data[0] != 0x2F || decrypted_data[1] != 0x2F) {
verbose("(Mode5) decrypt failed!\n");
}
t->content.clear();
t->content.insert(t->content.end(), decrypted.begin(), decrypted.end());
t->content.insert(t->content.end(), decrypted_data, decrypted_data+content.size());
debugPayload("(Mode5) decrypted", t->content);
}