From: Alberto Leiva Popper Date: Sat, 24 Feb 2024 01:20:02 +0000 (-0600) Subject: Convert RRDP XML strings to char * X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f73c06a3d6d09e432657530a674165f690b496e2;p=thirdparty%2FFORT-validator.git Convert RRDP XML strings to char * To prevent extra allocations and copies, strings in the RRDP module used to be stored as `xmlChar *`s. This optimization doesn't hold water now that I'm planning to also convert them to JSON. --- diff --git a/src/rrdp.c b/src/rrdp.c index 18872d58..4e4255c0 100644 --- a/src/rrdp.c +++ b/src/rrdp.c @@ -34,11 +34,11 @@ /* These are supposed to be unbounded */ struct rrdp_serial { BIGNUM *num; - xmlChar *str; /* for printing */ + char *str; /* for printing */ }; struct rrdp_session { - xmlChar *session_id; + char *session_id; struct rrdp_serial serial; }; @@ -104,16 +104,16 @@ serial_cleanup(struct rrdp_serial *serial) { BN_free(serial->num); serial->num = NULL; - xmlFree(serial->str); + free(serial->str); serial->str = NULL; } static void session_cleanup(struct rrdp_session *meta) { - xmlFree(meta->session_id); + free(meta->session_id); BN_free(meta->serial.num); - xmlFree(meta->serial.str); + free(meta->serial.str); } static void @@ -164,16 +164,14 @@ parse_ulong(xmlTextReaderPtr reader, char const *attr, unsigned long *result) str = xmlTextReaderGetAttribute(reader, BAD_CAST attr); if (str == NULL) - return pr_val_err("RRDP file: Couldn't find xml attribute '%s'", - attr); + return pr_val_err("Couldn't find xml attribute '%s'", attr); errno = 0; *result = strtoul((char const *) str, NULL, 10); error = errno; xmlFree(str); if (error) { - pr_val_err("RRDP file: Invalid long value '%s': %s", - str, strerror(error)); + pr_val_err("Invalid long value '%s': %s", str, strerror(error)); return error; } @@ -318,12 +316,16 @@ validate_version(xmlTextReaderPtr reader, unsigned long expected) static int parse_serial(xmlTextReaderPtr reader, struct rrdp_serial *serial) { - serial->str = parse_string(reader, RRDP_ATTR_SERIAL); - if (serial->str == NULL) + xmlChar *xmlserial; + + xmlserial = parse_string(reader, RRDP_ATTR_SERIAL); + if (xmlserial == NULL) return EINVAL; + serial->str = pstrdup((const char *) xmlserial); + xmlFree(xmlserial); serial->num = BN_create(); - if (BN_dec2bn(&serial->num, (char const *) serial->str) == 0) + if (BN_dec2bn(&serial->num, serial->str) == 0) goto fail; if (BN_is_negative(serial->num)) { pr_val_err("Serial '%s' is negative.", serial->str); @@ -340,6 +342,7 @@ fail: static int parse_session(xmlTextReaderPtr reader, struct rrdp_session *meta) { + xmlChar *xmlsession; int error; /* @@ -356,13 +359,15 @@ parse_session(xmlTextReaderPtr reader, struct rrdp_session *meta) if (error) return error; - meta->session_id = parse_string(reader, RRDP_ATTR_SESSION_ID); - if (meta->session_id == NULL) + xmlsession = parse_string(reader, RRDP_ATTR_SESSION_ID); + if (xmlsession == NULL) return EINVAL; + meta->session_id = pstrdup((const char *) xmlsession); + xmlFree(xmlsession); error = parse_serial(reader, &meta->serial); if (error) { - xmlFree(meta->session_id); + free(meta->session_id); meta->session_id = NULL; return error; } @@ -380,7 +385,7 @@ validate_session(xmlTextReaderPtr reader, struct rrdp_session *expected) if (error) return error; - if (xmlStrcmp(expected->session_id, actual.session_id) != 0) { + if (strcmp(expected->session_id, actual.session_id) != 0) { error = pr_val_err("File session id [%s] doesn't match notification's session id [%s]", expected->session_id, actual.session_id); goto end; @@ -973,7 +978,7 @@ rrdp_update(struct rpki_uri *uri) goto revert_notification; } - if (xmlStrcmp(old.session_id, new.session.session_id) != 0) { + if (strcmp(old.session_id, new.session.session_id) != 0) { pr_val_debug("The Notification's session ID changed."); error = handle_snapshot(&new); goto revert_notification; diff --git a/test/rrdp_test.c b/test/rrdp_test.c index ca8c9a4b..60595ef4 100644 --- a/test/rrdp_test.c +++ b/test/rrdp_test.c @@ -114,7 +114,7 @@ END_TEST static int __sort_deltas(struct notification_deltas *deltas, unsigned int max_serial, - char const *max_serial_str) + char *max_serial_str) { struct update_notification notif; int error; @@ -123,7 +123,7 @@ __sort_deltas(struct notification_deltas *deltas, unsigned int max_serial, notif.session.serial.num = BN_create(); if (!BN_set_word(notif.session.serial.num, max_serial)) ck_abort_msg("BN_set_word() returned zero."); - notif.session.serial.str = (unsigned char *) max_serial_str; + notif.session.serial.str = max_serial_str; error = sort_deltas(¬if); @@ -403,8 +403,8 @@ START_TEST(test_parse_snapshot_bad_publish) snapshot_uri.local = "resources/rrdp/snapshot-bad-publish.xml"; snapshot_uri.references = 1; - notif.session.session_id = BAD_CAST "9df4b597-af9e-4dca-bdda-719cce2c4e28"; - notif.session.serial.str = BAD_CAST "2"; + notif.session.session_id = "9df4b597-af9e-4dca-bdda-719cce2c4e28"; + notif.session.serial.str = "2"; notif.session.serial.num = BN_two(); notif.snapshot.uri = &snapshot_uri; notif.uri = ¬if_uri;