pespin submitted this change.
1 is the latest approved patch-set.
No files were changed between the latest approved patch-set and the submitted one.
pcap-server: Resolve real path of pcap file before opening
This means we always end up with a canonicalized absolute path.
While at it, also valdiate that we can indeed resolve the path (eg. it
exists and is reachable with current process permissions) during
startup.
It is preferrable to resolve it everytime a file is opened, this allows
the user to eg. change the base-path to a different symlink it they wish
to change the base-path for new pcaps without restarting osmo-pcap.
Change-Id: I8d161010dc8b480dd4cf90e19ca28a77914a50ad
---
M include/osmo-pcap/osmo_pcap_server.h
M src/osmo_server_network.c
M src/osmo_server_vty.c
3 files changed, 19 insertions(+), 4 deletions(-)
diff --git a/include/osmo-pcap/osmo_pcap_server.h b/include/osmo-pcap/osmo_pcap_server.h
index 0a43a69..50bb121 100644
--- a/include/osmo-pcap/osmo_pcap_server.h
+++ b/include/osmo-pcap/osmo_pcap_server.h
@@ -87,6 +87,7 @@
/* Remote connection */
struct osmo_wqueue rem_wq;
int local_fd;
+ /* canonicalized absolute pathname of pcap file we write to */
char *curr_filename;
/* pcap stuff */
diff --git a/src/osmo_server_network.c b/src/osmo_server_network.c
index 0b0073f..8747091 100644
--- a/src/osmo_server_network.c
+++ b/src/osmo_server_network.c
@@ -166,6 +166,7 @@
time_t now = time(NULL);
struct tm tm;
int rc;
+ char *real_base_path;
osmo_pcap_server_close_trace(conn);
@@ -178,11 +179,17 @@
}
localtime_r(&now, &tm);
+ real_base_path = realpath(conn->server->base_path, NULL);
+ if (!real_base_path) {
+ LOGP(DSERVER, LOGL_ERROR, "Failed to resolve real path '%s': %s\n",
+ conn->server->base_path, strerror(errno));
+ return;
+ }
conn->curr_filename = talloc_asprintf(conn, "%s/trace-%s-%d%.2d%.2d_%.2d%.2d%.2d.pcap",
- conn->server->base_path, conn->name,
- tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday,
- tm.tm_hour, tm.tm_min, tm.tm_sec);
-
+ real_base_path, conn->name,
+ tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday,
+ tm.tm_hour, tm.tm_min, tm.tm_sec);
+ free(real_base_path);
if (!conn->curr_filename) {
LOGP(DSERVER, LOGL_ERROR, "Failed to assemble filename for %s.\n", conn->name);
return;
diff --git a/src/osmo_server_vty.c b/src/osmo_server_vty.c
index c3014c9..ee3f995 100644
--- a/src/osmo_server_vty.c
+++ b/src/osmo_server_vty.c
@@ -148,6 +148,13 @@
"base-path PATH",
"Base path for log files\n" "Path\n")
{
+ /* Validate we can resolve path: */
+ char *tmp = realpath(argv[0], NULL);
+ if (!tmp) {
+ vty_out(vty, "%% Failed to resolve path '%s': %s%s", argv[0], strerror(errno), VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+ free(tmp);
osmo_talloc_replace_string(pcap_server, &pcap_server->base_path, argv[0]);
return CMD_SUCCESS;
}
To view, visit change 39200. To unsubscribe, or for help writing mail filters, visit settings.