diff options
author | Douglas Bagnall <douglas.bagnall@catalyst.net.nz> | 2018-02-16 17:53:15 +1300 |
---|---|---|
committer | Douglas Bagnall <dbagnall@samba.org> | 2018-02-22 01:04:18 +0100 |
commit | 6ef6ddce5a64c55729c2e3d423757f504b0ab15e (patch) | |
tree | c4196990dd5fd42ee3db23e05d279d888133f6cb /librpc | |
parent | 33ef0e57a4f08eae5ea06f482374fbc0a1014de6 (diff) | |
download | samba-6ef6ddce5a64c55729c2e3d423757f504b0ab15e.tar.gz |
shift read_hex_bytes() and parse_guid_string() into lib/util
read_hex_bytes() is going to be used in lib/util/rfc1738.c.
parse_guid_string() is shifted for two reasons: Firstly, it is called
very often in some operations, sometimes constituting a few percent of
the CPU load, and it makes several calls to read_hex_bytes(). We want
the compiler to be able to inline those calls if it thinks that is
wise. Secondly, there are other places that could do with fast GUID
parsing.
Signed-off-by: Douglas Bagnall <douglas.bagnall@catalyst.net.nz>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
Diffstat (limited to 'librpc')
-rw-r--r-- | librpc/ndr/uuid.c | 98 | ||||
-rw-r--r-- | librpc/wscript_build | 2 |
2 files changed, 2 insertions, 98 deletions
diff --git a/librpc/ndr/uuid.c b/librpc/ndr/uuid.c index 037dd909fce..53540c7ddc8 100644 --- a/librpc/ndr/uuid.c +++ b/librpc/ndr/uuid.c @@ -24,7 +24,7 @@ #include "includes.h" #include "librpc/ndr/libndr.h" #include "librpc/gen_ndr/ndr_misc.h" - +#include "lib/util/util_str_hex.h" /** build a NDR blob from a GUID */ @@ -52,102 +52,6 @@ _PUBLIC_ NTSTATUS GUID_from_ndr_blob(const DATA_BLOB *b, struct GUID *guid) return ndr_map_error2ntstatus(ndr_err); } -static NTSTATUS read_hex_bytes(const char *s, uint hexchars, uint64_t *dest) -{ - uint64_t x = 0; - uint i; - char c; - - if ((hexchars & 1) || hexchars > 16) { - return NT_STATUS_INVALID_PARAMETER; - } - - for (i = 0; i < hexchars; i++) { - x <<= 4; - c = s[i]; - if (c >= '0' && c <= '9') { - x += c - '0'; - } - else if (c >= 'a' && c <= 'f') { - x += c - 'a' + 10; - } - else if (c >= 'A' && c <= 'F') { - x += c - 'A' + 10; - } - else { - /* BAD character (including '\0') */ - return NT_STATUS_INVALID_PARAMETER; - } - } - *dest = x; - return NT_STATUS_OK; -} - - -static NTSTATUS parse_guid_string(const char *s, - uint32_t *time_low, - uint32_t *time_mid, - uint32_t *time_hi_and_version, - uint32_t *clock_seq, - uint32_t *node) -{ - uint64_t tmp; - NTSTATUS status; - int i; - /* "e12b56b6-0a95-11d1-adbb-00c04fd8d5cd" - | | | | | - | | | | \ node[6] - | | | \_____ clock_seq[2] - | | \__________ time_hi_and_version - | \_______________ time_mid - \_____________________ time_low - */ - status = read_hex_bytes(s, 8, &tmp); - if (!NT_STATUS_IS_OK(status) || s[8] != '-') { - return NT_STATUS_INVALID_PARAMETER; - } - *time_low = tmp; - s += 9; - - status = read_hex_bytes(s, 4, &tmp); - if (!NT_STATUS_IS_OK(status) || s[4] != '-') { - return NT_STATUS_INVALID_PARAMETER; - } - *time_mid = tmp; - s += 5; - - status = read_hex_bytes(s, 4, &tmp); - if (!NT_STATUS_IS_OK(status) || s[4] != '-') { - return NT_STATUS_INVALID_PARAMETER; - } - *time_hi_and_version = tmp; - s += 5; - - for (i = 0; i < 2; i++) { - status = read_hex_bytes(s, 2, &tmp); - if (!NT_STATUS_IS_OK(status)) { - return NT_STATUS_INVALID_PARAMETER; - } - clock_seq[i] = tmp; - s += 2; - } - if (s[0] != '-') { - return NT_STATUS_INVALID_PARAMETER; - } - - s++; - - for (i = 0; i < 6; i++) { - status = read_hex_bytes(s, 2, &tmp); - if (!NT_STATUS_IS_OK(status)) { - return NT_STATUS_INVALID_PARAMETER; - } - node[i] = tmp; - s += 2; - } - - return NT_STATUS_OK; -} /** build a GUID from a string diff --git a/librpc/wscript_build b/librpc/wscript_build index c4b647c242d..36414fbddf4 100644 --- a/librpc/wscript_build +++ b/librpc/wscript_build @@ -717,7 +717,7 @@ bld.SAMBA_LIBRARY('dcerpc-samba', bld.SAMBA_LIBRARY('ndr', source='ndr/ndr_string.c ndr/ndr_basic.c ndr/uuid.c ndr/ndr.c ndr/ndr_misc.c gen_ndr/ndr_misc.c ndr/util.c', pc_files='ndr.pc', - public_deps='samba-errors talloc samba-util', + public_deps='samba-errors talloc samba-util util_str_hex', public_headers='gen_ndr/misc.h gen_ndr/ndr_misc.h ndr/libndr.h:ndr.h', header_path= [('*gen_ndr*', 'gen_ndr')], vnum='0.1.0', |