server: Fix various error paths if startup fails

Don't segfault or use heap after free if osmo-remsim-server cannot
fully initialize, e.g. due to ports already in use.

Change-Id: I558e6a0ea089a779f916aa5576341d1c55da1271
diff --git a/src/server/remsim_server.c b/src/server/remsim_server.c
index 71590f4..419dcad 100644
--- a/src/server/remsim_server.c
+++ b/src/server/remsim_server.c
@@ -139,7 +139,6 @@
 	close(g_event_ofd.fd);
 out_rps:
 	talloc_free(g_rps->slotmaps);
-	talloc_free(g_rps);
 out_rspro:
 	rspro_server_destroy(g_rps);
 
diff --git a/src/server/rest_api.c b/src/server/rest_api.c
index 540fbd4..d3279c4 100644
--- a/src/server/rest_api.c
+++ b/src/server/rest_api.c
@@ -512,6 +512,7 @@
 
 	if (ulfius_start_framework(&g_instance) != U_OK) {
 		LOGP(DREST, LOGL_FATAL, "Cannot start REST API on port %u\n", port);
+		ulfius_clean_instance(&g_instance);
 		return -1;
 	}
 	return 0;
diff --git a/src/server/rspro_server.c b/src/server/rspro_server.c
index 7ce99c9..550179d 100644
--- a/src/server/rspro_server.c
+++ b/src/server/rspro_server.c
@@ -854,6 +854,11 @@
 	pthread_rwlock_unlock(&srv->rwlock);
 
 	srv->link = ipa_server_link_create(ctx, NULL, host, port, accept_cb, srv);
+	if (!srv->link) {
+		talloc_free(srv);
+		return NULL;
+	}
+
 	ipa_server_link_open(srv->link);
 
 	return srv;
@@ -865,5 +870,6 @@
 
 	ipa_server_link_destroy(srv->link);
 	srv->link = NULL;
+	pthread_rwlock_destroy(&srv->rwlock);
 	talloc_free(srv);
 }