summaryrefslogtreecommitdiff
path: root/librpc
diff options
context:
space:
mode:
authorDouglas Bagnall <douglas.bagnall@catalyst.net.nz>2018-02-16 17:53:15 +1300
committerDouglas Bagnall <dbagnall@samba.org>2018-02-22 01:04:18 +0100
commit6ef6ddce5a64c55729c2e3d423757f504b0ab15e (patch)
treec4196990dd5fd42ee3db23e05d279d888133f6cb /librpc
parent33ef0e57a4f08eae5ea06f482374fbc0a1014de6 (diff)
downloadsamba-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.c98
-rw-r--r--librpc/wscript_build2
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',