Commit e6b648881e5017fda3b02edf3bd9ce219aa8910e
1 parent
32062c78
Safer modbus_close
Showing
4 changed files
with
20 additions
and
10 deletions
src/modbus-rtu.c
| @@ -925,7 +925,7 @@ int modbus_rtu_get_rts(modbus_t *ctx) { | @@ -925,7 +925,7 @@ int modbus_rtu_get_rts(modbus_t *ctx) { | ||
| 925 | 925 | ||
| 926 | static void _modbus_rtu_close(modbus_t *ctx) | 926 | static void _modbus_rtu_close(modbus_t *ctx) |
| 927 | { | 927 | { |
| 928 | - /* Closes the file descriptor in RTU mode */ | 928 | + /* Restore line settings and close file descriptor in RTU mode */ |
| 929 | modbus_rtu_t *ctx_rtu = ctx->backend_data; | 929 | modbus_rtu_t *ctx_rtu = ctx->backend_data; |
| 930 | 930 | ||
| 931 | #if defined(_WIN32) | 931 | #if defined(_WIN32) |
| @@ -938,8 +938,10 @@ static void _modbus_rtu_close(modbus_t *ctx) | @@ -938,8 +938,10 @@ static void _modbus_rtu_close(modbus_t *ctx) | ||
| 938 | fprintf(stderr, "ERROR Error while closing handle (LastError %d)\n", | 938 | fprintf(stderr, "ERROR Error while closing handle (LastError %d)\n", |
| 939 | (int)GetLastError()); | 939 | (int)GetLastError()); |
| 940 | #else | 940 | #else |
| 941 | - tcsetattr(ctx->s, TCSANOW, &(ctx_rtu->old_tios)); | ||
| 942 | - close(ctx->s); | 941 | + if (ctx->s != -1) { |
| 942 | + tcsetattr(ctx->s, TCSANOW, &(ctx_rtu->old_tios)); | ||
| 943 | + close(ctx->s); | ||
| 944 | + } | ||
| 943 | #endif | 945 | #endif |
| 944 | } | 946 | } |
| 945 | 947 |
src/modbus-tcp.c
| @@ -418,8 +418,10 @@ static int _modbus_tcp_pi_connect(modbus_t *ctx) | @@ -418,8 +418,10 @@ static int _modbus_tcp_pi_connect(modbus_t *ctx) | ||
| 418 | /* Closes the network connection and socket in TCP mode */ | 418 | /* Closes the network connection and socket in TCP mode */ |
| 419 | static void _modbus_tcp_close(modbus_t *ctx) | 419 | static void _modbus_tcp_close(modbus_t *ctx) |
| 420 | { | 420 | { |
| 421 | - shutdown(ctx->s, SHUT_RDWR); | ||
| 422 | - close(ctx->s); | 421 | + if (ctx->s != -1) { |
| 422 | + shutdown(ctx->s, SHUT_RDWR); | ||
| 423 | + close(ctx->s); | ||
| 424 | + } | ||
| 423 | } | 425 | } |
| 424 | 426 | ||
| 425 | static int _modbus_tcp_flush(modbus_t *ctx) | 427 | static int _modbus_tcp_flush(modbus_t *ctx) |
tests/bandwidth-server-one.c
| 1 | /* | 1 | /* |
| 2 | - * Copyright © 2008-2012 Stéphane Raimbault <stephane.raimbault@gmail.com> | 2 | + * Copyright © 2008-2013 Stéphane Raimbault <stephane.raimbault@gmail.com> |
| 3 | * | 3 | * |
| 4 | * This program is free software: you can redistribute it and/or modify | 4 | * This program is free software: you can redistribute it and/or modify |
| 5 | * it under the terms of the GNU General Public License as published by | 5 | * it under the terms of the GNU General Public License as published by |
| @@ -36,9 +36,9 @@ enum { | @@ -36,9 +36,9 @@ enum { | ||
| 36 | 36 | ||
| 37 | int main(int argc, char *argv[]) | 37 | int main(int argc, char *argv[]) |
| 38 | { | 38 | { |
| 39 | - int socket; | ||
| 40 | - modbus_t *ctx; | ||
| 41 | - modbus_mapping_t *mb_mapping; | 39 | + int socket = -1; |
| 40 | + modbus_t *ctx = NULL; | ||
| 41 | + modbus_mapping_t *mb_mapping = NULL; | ||
| 42 | int rc; | 42 | int rc; |
| 43 | int use_backend; | 43 | int use_backend; |
| 44 | 44 | ||
| @@ -92,7 +92,11 @@ int main(int argc, char *argv[]) | @@ -92,7 +92,11 @@ int main(int argc, char *argv[]) | ||
| 92 | printf("Quit the loop: %s\n", modbus_strerror(errno)); | 92 | printf("Quit the loop: %s\n", modbus_strerror(errno)); |
| 93 | 93 | ||
| 94 | modbus_mapping_free(mb_mapping); | 94 | modbus_mapping_free(mb_mapping); |
| 95 | - close(socket); | 95 | + if (socket != -1) { |
| 96 | + close(socket); | ||
| 97 | + } | ||
| 98 | + /* For RTU, skipped by TCP (no TCP connect) */ | ||
| 99 | + modbus_close(ctx); | ||
| 96 | modbus_free(ctx); | 100 | modbus_free(ctx); |
| 97 | 101 | ||
| 98 | return 0; | 102 | return 0; |
tests/unit-test-server.c
| @@ -191,6 +191,8 @@ int main(int argc, char*argv[]) | @@ -191,6 +191,8 @@ int main(int argc, char*argv[]) | ||
| 191 | } | 191 | } |
| 192 | modbus_mapping_free(mb_mapping); | 192 | modbus_mapping_free(mb_mapping); |
| 193 | free(query); | 193 | free(query); |
| 194 | + /* For RTU */ | ||
| 195 | + modbus_close(ctx); | ||
| 194 | modbus_free(ctx); | 196 | modbus_free(ctx); |
| 195 | 197 | ||
| 196 | return 0; | 198 | return 0; |