@@ -84,28 +84,47 @@ static char* disambiguated_link_name(qdr_connection_info_t *conn, char *original
84
84
85
85
/**
86
86
* Generate a temporary routable address for a destination connected to this
87
- * router node.
87
+ * router node. Caller must free() return value when done.
88
88
*/
89
- static void qdr_generate_temp_addr (qdr_core_t * core , char * buffer , size_t length )
89
+ static char * qdr_generate_temp_addr (qdr_core_t * core )
90
90
{
91
+ static const char edge_template [] = "amqp:/_edge/%s/temp.%s" ;
92
+ static const char topo_template [] = "amqp:/_topo/%s/%s/temp.%s" ;
93
+ const size_t max_template = 19 ; // printable chars
91
94
char discriminator [QD_DISCRIMINATOR_SIZE ];
95
+
92
96
qd_generate_discriminator (discriminator );
93
- if (core -> router_mode == QD_ROUTER_MODE_EDGE )
94
- snprintf (buffer , length , "amqp:/_edge/%s/temp.%s" , core -> router_id , discriminator );
95
- else
96
- snprintf (buffer , length , "amqp:/_topo/%s/%s/temp.%s" , core -> router_area , core -> router_id , discriminator );
97
+ size_t len = max_template + QD_DISCRIMINATOR_SIZE +
98
+ strlen (core -> router_id ) + strlen (core -> router_area ) + 1 ;
99
+
100
+ int rc ;
101
+ char * buffer = qd_malloc (len );
102
+ if (core -> router_mode == QD_ROUTER_MODE_EDGE ) {
103
+ rc = snprintf (buffer , len , edge_template , core -> router_id , discriminator );
104
+ } else {
105
+ rc = snprintf (buffer , len , topo_template , core -> router_area , core -> router_id , discriminator );
106
+ }
107
+ (void )rc ; assert (rc < len );
108
+ return buffer ;
97
109
}
98
110
99
111
100
112
/**
101
113
* Generate a temporary mobile address for a producer connected to this
102
- * router node.
114
+ * router node. Caller must free() return value when done.
103
115
*/
104
- static void qdr_generate_mobile_addr (qdr_core_t * core , char * buffer , size_t length )
116
+ static char * qdr_generate_mobile_addr (qdr_core_t * core )
105
117
{
118
+ static const char mobile_template [] = "amqp:/_$temp.%s" ;
119
+ const size_t max_template = 13 ; // printable chars
106
120
char discriminator [QD_DISCRIMINATOR_SIZE ];
121
+
107
122
qd_generate_discriminator (discriminator );
108
- snprintf (buffer , length , "amqp:/_$temp.%s" , discriminator );
123
+ size_t len = max_template + QD_DISCRIMINATOR_SIZE + 1 ;
124
+ char * buffer = qd_malloc (len );
125
+ int rc = snprintf (buffer , len , mobile_template , discriminator );
126
+ (void )rc ; assert (rc < len );
127
+ return buffer ;
109
128
}
110
129
111
130
@@ -182,18 +201,18 @@ static qdr_address_t *qdr_lookup_terminus_address_CT(qdr_core_t *core,
182
201
if (!accept_dynamic )
183
202
return 0 ;
184
203
185
- char temp_addr [200 ];
186
204
bool generating = true;
187
205
while (generating ) {
188
206
//
189
207
// The address-generation process is performed in a loop in case the generated
190
208
// address collides with a previously generated address (this should be _highly_
191
209
// unlikely).
192
210
//
211
+ char * temp_addr = 0 ;
193
212
if (dir == QD_OUTGOING )
194
- qdr_generate_temp_addr (core , temp_addr , 200 );
213
+ temp_addr = qdr_generate_temp_addr (core );
195
214
else
196
- qdr_generate_mobile_addr (core , temp_addr , 200 );
215
+ temp_addr = qdr_generate_mobile_addr (core );
197
216
198
217
qd_iterator_t * temp_iter = qd_iterator_string (temp_addr , ITER_VIEW_ADDRESS_HASH );
199
218
qd_hash_retrieve (core -> addr_hash , temp_iter , (void * * ) & addr );
@@ -205,6 +224,7 @@ static qdr_address_t *qdr_lookup_terminus_address_CT(qdr_core_t *core,
205
224
generating = false;
206
225
}
207
226
qd_iterator_free (temp_iter );
227
+ free (temp_addr );
208
228
}
209
229
return addr ;
210
230
}
0 commit comments