Skip to content

Commit bbf49a8

Browse files
committed
Refactor: libcrmcommon: Return (gchar *) from pcmk__digest_xml()
To avoid a pointless string copy Signed-off-by: Reid Wahl <[email protected]>
1 parent ccdb6fc commit bbf49a8

File tree

8 files changed

+40
-41
lines changed

8 files changed

+40
-41
lines changed

daemons/based/based_callbacks.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -367,7 +367,7 @@ cib_common_callback(qb_ipcs_connection_t * c, void *data, size_t size, gboolean
367367
}
368368

369369
static uint64_t ping_seq = 0;
370-
static char *ping_digest = NULL;
370+
static gchar *ping_digest = NULL;
371371
static bool ping_modified_since = FALSE;
372372

373373
static gboolean
@@ -378,7 +378,7 @@ cib_digester_cb(gpointer data)
378378
xmlNode *ping = pcmk__xe_create(NULL, PCMK__XE_PING);
379379

380380
ping_seq++;
381-
free(ping_digest);
381+
g_free(ping_digest);
382382
ping_digest = NULL;
383383
ping_modified_since = FALSE;
384384
snprintf(buffer, 32, "%" PRIu64, ping_seq);

daemons/based/based_messages.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ cib_process_ping(const char *op, int options, const char *section, xmlNode * req
140140
{
141141
const char *host = pcmk__xe_get(req, PCMK__XA_SRC);
142142
const char *seq = pcmk__xe_get(req, PCMK__XA_CIB_PING_ID);
143-
char *digest = pcmk__digest_xml(the_cib, true);
143+
gchar *digest = pcmk__digest_xml(the_cib, true);
144144

145145
xmlNode *wrapper = NULL;
146146

@@ -177,7 +177,7 @@ cib_process_ping(const char *op, int options, const char *section, xmlNode * req
177177
pcmk__xe_get(existing_cib, PCMK_XA_EPOCH),
178178
pcmk__xe_get(existing_cib, PCMK_XA_NUM_UPDATES));
179179

180-
free(digest);
180+
g_free(digest);
181181

182182
return pcmk_ok;
183183
}
@@ -406,7 +406,7 @@ int
406406
sync_our_cib(xmlNode * request, gboolean all)
407407
{
408408
int result = pcmk_ok;
409-
char *digest = NULL;
409+
gchar *digest = NULL;
410410
const char *host = pcmk__xe_get(request, PCMK__XA_SRC);
411411
const char *op = pcmk__xe_get(request, PCMK__XA_CIB_OP);
412412
pcmk__node_status_t *peer = NULL;
@@ -448,7 +448,7 @@ sync_our_cib(xmlNode * request, gboolean all)
448448
result = -ENOTCONN;
449449
}
450450
pcmk__xml_free(replace_request);
451-
free(digest);
451+
g_free(digest);
452452
return result;
453453
}
454454

daemons/schedulerd/schedulerd_messages.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -53,13 +53,13 @@ handle_pecalc_request(pcmk__request_t *request)
5353
xmlNode *wrapper = pcmk__xe_first_child(msg, PCMK__XE_CRM_XML, NULL, NULL);
5454
xmlNode *xml_data = pcmk__xe_first_child(wrapper, NULL, NULL, NULL);
5555

56-
static char *last_digest = NULL;
56+
static gchar *last_digest = NULL;
5757
static char *filename = NULL;
5858

5959
unsigned int seq = 0U;
6060
int series_id = 0;
6161
int series_wrap = 0;
62-
char *digest = NULL;
62+
gchar *digest = NULL;
6363
const char *value = NULL;
6464
time_t execution_date = time(NULL);
6565
xmlNode *converted = NULL;
@@ -79,14 +79,14 @@ handle_pecalc_request(pcmk__request_t *request)
7979
pcmk__xe_set_int(scheduler->priv->graph, "transition_id", 0);
8080
pcmk__xe_set_int(scheduler->priv->graph, PCMK_OPT_CLUSTER_DELAY, 0);
8181
process = false;
82-
free(digest);
82+
g_free(digest);
8383

8484
} else if (pcmk__str_eq(digest, last_digest, pcmk__str_casei)) {
8585
is_repoke = true;
86-
free(digest);
86+
g_free(digest);
8787

8888
} else {
89-
free(last_digest);
89+
g_free(last_digest);
9090
last_digest = digest;
9191
}
9292

include/crm/common/digest_internal.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ typedef struct {
4343

4444
gchar *pcmk__digest_on_disk_cib(const xmlNode *input);
4545
gchar *pcmk__digest_operation(const xmlNode *input);
46-
char *pcmk__digest_xml(const xmlNode *input, bool filter);
46+
gchar *pcmk__digest_xml(const xmlNode *input, bool filter);
4747

4848
bool pcmk__verify_digest(const xmlNode *input, const char *expected);
4949

lib/cib/cib_ops.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -343,7 +343,7 @@ cib_process_replace(const char *op, int options, const char *section, xmlNode *
343343
const char *digest = pcmk__xe_get(req, PCMK__XA_DIGEST);
344344

345345
if (digest) {
346-
char *digest_verify = pcmk__digest_xml(input, true);
346+
gchar *digest_verify = pcmk__digest_xml(input, true);
347347

348348
if (!pcmk__str_eq(digest_verify, digest, pcmk__str_casei)) {
349349
crm_err("Digest mis-match on replace from %s: %s vs. %s (expected)", peer,
@@ -353,7 +353,7 @@ cib_process_replace(const char *op, int options, const char *section, xmlNode *
353353
} else {
354354
crm_info("Digest matched on replace from %s: %s", peer, digest);
355355
}
356-
free(digest_verify);
356+
g_free(digest_verify);
357357

358358
} else {
359359
crm_trace("No digest to verify");

lib/common/digest.c

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -194,25 +194,25 @@ pcmk__digest_operation(const xmlNode *input)
194194
* \param[in] filter Whether to filter certain XML attributes
195195
*
196196
* \return Newly allocated string containing digest
197+
*
198+
* \note The caller is responsible for freeing the return value using
199+
* \c g_free().
197200
*/
198-
char *
201+
gchar *
199202
pcmk__digest_xml(const xmlNode *xml, bool filter)
200203
{
201204
/* @TODO Filtering accounts for significant CPU usage. Consider removing if
202205
* possible.
203206
*/
204207
GString *buf = g_string_sized_new(1024);
205-
gchar *digest_g = NULL;
206-
char *digest = NULL;
208+
gchar *digest = NULL;
207209

208210
pcmk__xml_string(xml, (filter? pcmk__xml_fmt_filtered : 0), buf, 0);
209-
digest_g = pcmk__md5sum(buf->str);
210-
if (digest_g == NULL) {
211+
digest = pcmk__md5sum(buf->str);
212+
if (digest == NULL) {
211213
goto done;
212214
}
213215

214-
digest = pcmk__str_copy(digest_g);
215-
216216
pcmk__if_tracing(
217217
{
218218
char *trace_file = pcmk__assert_asprintf("digest-%s", digest);
@@ -230,7 +230,6 @@ pcmk__digest_xml(const xmlNode *xml, bool filter)
230230

231231
done:
232232
g_string_free(buf, TRUE);
233-
g_free(digest_g);
234233
return digest;
235234
}
236235

@@ -386,10 +385,11 @@ char *
386385
calculate_xml_versioned_digest(xmlNode *input, gboolean sort,
387386
gboolean do_filter, const char *version)
388387
{
388+
gchar *digest_g = NULL;
389+
char *digest = NULL;
390+
389391
if ((version == NULL) || (compare_version("3.0.5", version) > 0)) {
390392
xmlNode *sorted = NULL;
391-
gchar *digest_g = NULL;
392-
char *digest = NULL;
393393

394394
if (sort) {
395395
xmlNode *sorted = sorted_xml(input, NULL, true);
@@ -401,14 +401,16 @@ calculate_xml_versioned_digest(xmlNode *input, gboolean sort,
401401
pcmk__s(version, "unknown feature set"));
402402

403403
digest_g = calculate_xml_digest_v1(input);
404-
digest = pcmk__str_copy(digest_g);
405-
406404
pcmk__xml_free(sorted);
407-
g_free(digest_g);
408-
return digest;
405+
406+
} else {
407+
crm_trace("Using v2 digest algorithm for %s", version);
408+
digest_g = pcmk__digest_xml(input, do_filter);
409409
}
410-
crm_trace("Using v2 digest algorithm for %s", version);
411-
return pcmk__digest_xml(input, do_filter);
410+
411+
digest = pcmk__str_copy(digest_g);
412+
g_free(digest_g);
413+
return digest;
412414
}
413415

414416
char *

lib/common/patchset.c

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -297,7 +297,7 @@ xml_create_patchset(int format, xmlNode *source, xmlNode *target,
297297
void
298298
pcmk__xml_patchset_add_digest(xmlNode *patchset, const xmlNode *target)
299299
{
300-
char *digest = NULL;
300+
gchar *digest = NULL;
301301

302302
CRM_CHECK((patchset != NULL) && (target != NULL), return);
303303

@@ -310,7 +310,7 @@ pcmk__xml_patchset_add_digest(xmlNode *patchset, const xmlNode *target)
310310
digest = pcmk__digest_xml(target, true);
311311

312312
pcmk__xe_set(patchset, PCMK__XA_DIGEST, digest);
313-
free(digest);
313+
g_free(digest);
314314
}
315315

316316
/*!
@@ -843,9 +843,8 @@ xml_apply_patchset(xmlNode *xml, const xmlNode *patchset, bool check_version)
843843
}
844844

845845
if ((rc == pcmk_ok) && (digest != NULL)) {
846-
char *new_digest = NULL;
846+
gchar *new_digest = pcmk__digest_xml(xml, true);
847847

848-
new_digest = pcmk__digest_xml(xml, true);
849848
if (!pcmk__str_eq(new_digest, digest, pcmk__str_casei)) {
850849
crm_info("v%d digest mis-match: expected %s, calculated %s",
851850
format, digest, new_digest);
@@ -864,7 +863,7 @@ xml_apply_patchset(xmlNode *xml, const xmlNode *patchset, bool check_version)
864863
crm_trace("v%d digest matched: expected %s, calculated %s",
865864
format, digest, new_digest);
866865
}
867-
free(new_digest);
866+
g_free(new_digest);
868867
}
869868
pcmk__xml_free(old);
870869
return rc;
@@ -980,7 +979,7 @@ void
980979
patchset_process_digest(xmlNode *patch, const xmlNode *source,
981980
const xmlNode *target, bool with_digest)
982981
{
983-
char *digest = NULL;
982+
gchar *digest = NULL;
984983

985984
if ((patch == NULL) || (source == NULL) || (target == NULL)
986985
|| !with_digest) {
@@ -996,9 +995,7 @@ patchset_process_digest(xmlNode *patch, const xmlNode *source,
996995
digest = pcmk__digest_xml(target, true);
997996

998997
pcmk__xe_set(patch, PCMK__XA_DIGEST, digest);
999-
free(digest);
1000-
1001-
return;
998+
g_free(digest);
1002999
}
10031000

10041001
// LCOV_EXCL_STOP

tools/cibadmin.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -738,7 +738,7 @@ main(int argc, char **argv)
738738
goto done;
739739

740740
} else if (strcmp(options.cib_action, "md5-sum-versioned") == 0) {
741-
char *digest = NULL;
741+
gchar *digest = NULL;
742742

743743
if (input == NULL) {
744744
exit_code = CRM_EX_USAGE;
@@ -749,7 +749,7 @@ main(int argc, char **argv)
749749

750750
digest = pcmk__digest_xml(input, true);
751751
fprintf(stdout, "%s\n", pcmk__s(digest, "<null>"));
752-
free(digest);
752+
g_free(digest);
753753
goto done;
754754

755755
} else if (pcmk__str_eq(options.cib_action, PCMK__CIB_REQUEST_MODIFY,

0 commit comments

Comments
 (0)