mirror of
https://github.com/zerotier/ZeroTierOne.git
synced 2025-06-07 13:03:45 +02:00
Locator CGo API fixes.
This commit is contained in:
parent
1bb43476e8
commit
f8e3251efe
6 changed files with 59 additions and 17 deletions
|
@ -14,6 +14,7 @@
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
"fmt"
|
"fmt"
|
||||||
"zerotier/pkg/zerotier"
|
"zerotier/pkg/zerotier"
|
||||||
)
|
)
|
||||||
|
@ -47,7 +48,37 @@ func TestLocator() bool {
|
||||||
fmt.Printf("FAILED (%s)\n",err.Error())
|
fmt.Printf("FAILED (%s)\n",err.Error())
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
fmt.Printf("OK %s\n",loc.String())
|
locStr := loc.String()
|
||||||
|
locBytes := loc.Bytes()
|
||||||
|
fmt.Printf("OK (%d bytes)\n",len(locBytes))
|
||||||
|
|
||||||
|
fmt.Printf("Testing Locator Validate()... ")
|
||||||
|
if !loc.Validate(signer) {
|
||||||
|
fmt.Printf("FAILED (should have validated)\n")
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
fmt.Printf("OK\n")
|
||||||
|
|
||||||
|
fmt.Printf("Testing Locator marshal/unmarshal... ")
|
||||||
|
loc2, err := zerotier.NewLocatorFromString(locStr)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Printf("FAILED (%s)\n",err.Error())
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
if !bytes.Equal(locBytes, loc2.Bytes()) {
|
||||||
|
fmt.Printf("FAILED (not equal)\n")
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
loc2, err = zerotier.NewLocatorFromBytes(locBytes)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Printf("FAILED (%s)\n",err.Error())
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
if !bytes.Equal(locBytes, loc2.Bytes()) {
|
||||||
|
fmt.Printf("FAILED (not equal)\n")
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
fmt.Printf("OK\n")
|
||||||
|
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,14 +6,18 @@ import (
|
||||||
"runtime/debug"
|
"runtime/debug"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const numToRun = 10000
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
runtime.GOMAXPROCS(1)
|
runtime.GOMAXPROCS(1)
|
||||||
debug.SetGCPercent(10)
|
debug.SetGCPercent(10)
|
||||||
|
|
||||||
if !TestCertificate() {
|
for k:=0;k<numToRun;k++ {
|
||||||
|
if !TestCertificate(){
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
if !TestLocator() {
|
if !TestLocator(){
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -397,7 +397,7 @@ int ZT_Locator_marshal(const ZT_Locator *loc, void *buf, unsigned int bufSize)
|
||||||
{
|
{
|
||||||
if ((!loc) || (bufSize < ZT_LOCATOR_MARSHAL_SIZE_MAX))
|
if ((!loc) || (bufSize < ZT_LOCATOR_MARSHAL_SIZE_MAX))
|
||||||
return -1;
|
return -1;
|
||||||
return reinterpret_cast<const ZeroTier::Locator *>(loc)->marshal(reinterpret_cast<uint8_t *>(buf), (int) bufSize);
|
return reinterpret_cast<const ZeroTier::Locator *>(loc)->marshal(reinterpret_cast<uint8_t *>(buf), false);
|
||||||
}
|
}
|
||||||
|
|
||||||
char *ZT_Locator_toString(
|
char *ZT_Locator_toString(
|
||||||
|
|
|
@ -117,9 +117,13 @@ int Locator::marshal(uint8_t data[ZT_LOCATOR_MARSHAL_SIZE_MAX], const bool exclu
|
||||||
return -1;
|
return -1;
|
||||||
p += l;
|
p += l;
|
||||||
|
|
||||||
l = (int)e->second->data[0] + 1;
|
l = (int)e->second->data[0];
|
||||||
|
if (l > 0) {
|
||||||
Utils::copy(data + p, e->second->data, (unsigned int)l);
|
Utils::copy(data + p, e->second->data, (unsigned int)l);
|
||||||
p += l;
|
p += l;
|
||||||
|
} else {
|
||||||
|
data[p++] = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Utils::storeMachineEndian< uint16_t >(data + p, 0); // length of meta-data, currently always 0
|
Utils::storeMachineEndian< uint16_t >(data + p, 0); // length of meta-data, currently always 0
|
||||||
|
@ -139,7 +143,7 @@ int Locator::unmarshal(const uint8_t *data, const int len) noexcept
|
||||||
{
|
{
|
||||||
if (unlikely(len < 8))
|
if (unlikely(len < 8))
|
||||||
return -1;
|
return -1;
|
||||||
m_ts = (int64_t) Utils::loadBigEndian<uint64_t>(data);
|
m_ts = (int64_t)Utils::loadBigEndian<uint64_t>(data);
|
||||||
int p = 8;
|
int p = 8;
|
||||||
|
|
||||||
int l = m_signer.unmarshal(data + p, len - p);
|
int l = m_signer.unmarshal(data + p, len - p);
|
||||||
|
@ -161,25 +165,28 @@ int Locator::unmarshal(const uint8_t *data, const int len) noexcept
|
||||||
return -1;
|
return -1;
|
||||||
p += l;
|
p += l;
|
||||||
|
|
||||||
l = (int)data[p] + 1;
|
if (unlikely(p + 1) > len)
|
||||||
if (l <= 1) {
|
return -1;
|
||||||
|
l = (int)data[p];
|
||||||
|
if (l <= 0) {
|
||||||
m_endpoints[i].second = EndpointAttributes::DEFAULT;
|
m_endpoints[i].second = EndpointAttributes::DEFAULT;
|
||||||
|
++p;
|
||||||
} else {
|
} else {
|
||||||
m_endpoints[i].second.set(new EndpointAttributes());
|
m_endpoints[i].second.set(new EndpointAttributes());
|
||||||
Utils::copy(const_cast< uint8_t * >(m_endpoints[i].second->data), data + p, (unsigned int)l);
|
Utils::copy(const_cast< uint8_t * >(m_endpoints[i].second->data), data + p, (unsigned int)l);
|
||||||
}
|
|
||||||
p += l;
|
p += l;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (unlikely((p + 2) > len))
|
if (unlikely((p + 2) > len))
|
||||||
return -1;
|
return -1;
|
||||||
p += 2 + (int) Utils::loadBigEndian<uint16_t>(data + p);
|
p += 2 + (int)Utils::loadBigEndian<uint16_t>(data + p);
|
||||||
|
|
||||||
if (unlikely((p + 2) > len))
|
if (unlikely((p + 2) > len))
|
||||||
return -1;
|
return -1;
|
||||||
const unsigned int siglen = Utils::loadBigEndian<uint16_t>(data + p);
|
const unsigned int siglen = Utils::loadBigEndian<uint16_t>(data + p);
|
||||||
p += 2;
|
p += 2;
|
||||||
if (unlikely((siglen > ZT_SIGNATURE_BUFFER_SIZE) || ((p + (int) siglen) > len)))
|
if (unlikely((siglen > ZT_SIGNATURE_BUFFER_SIZE) || ((p + (int)siglen) > len)))
|
||||||
return -1;
|
return -1;
|
||||||
m_signature.unsafeSetSize(siglen);
|
m_signature.unsafeSetSize(siglen);
|
||||||
Utils::copy(m_signature.data(), data + p, siglen);
|
Utils::copy(m_signature.data(), data + p, siglen);
|
||||||
|
|
|
@ -75,7 +75,7 @@ public:
|
||||||
/**
|
/**
|
||||||
* Raw attributes data in the form of a dictionary prefixed by its size.
|
* Raw attributes data in the form of a dictionary prefixed by its size.
|
||||||
*
|
*
|
||||||
* The maximum size of attributes is 256, which is more than enough for
|
* The maximum size of attributes is 255, which is more than enough for
|
||||||
* tiny things like bandwidth and priority.
|
* tiny things like bandwidth and priority.
|
||||||
*/
|
*/
|
||||||
uint8_t data[ZT_LOCATOR_MAX_ENDPOINT_ATTRIBUTES_SIZE];
|
uint8_t data[ZT_LOCATOR_MAX_ENDPOINT_ATTRIBUTES_SIZE];
|
||||||
|
|
|
@ -98,8 +98,8 @@ func (loc *Locator) Bytes() []byte {
|
||||||
if loc.cl == nil {
|
if loc.cl == nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
var buf [4096]byte
|
var buf [16384]byte // larger than ZT_LOCATOR_MARSHAL_SIZE_MAX
|
||||||
bl := C.ZT_Locator_marshal(loc.cl, unsafe.Pointer(&buf[0]), 4096)
|
bl := C.ZT_Locator_marshal(loc.cl, unsafe.Pointer(&buf[0]), 16384)
|
||||||
if bl <= 0 {
|
if bl <= 0 {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -133,7 +133,7 @@ func (loc *Locator) UnmarshalJSON(j []byte) error {
|
||||||
|
|
||||||
func locatorFinalizer(obj interface{}) {
|
func locatorFinalizer(obj interface{}) {
|
||||||
if obj != nil {
|
if obj != nil {
|
||||||
cl := obj.(Locator).cl
|
cl := obj.(*Locator).cl
|
||||||
if cl != nil {
|
if cl != nil {
|
||||||
C.ZT_Locator_delete(cl)
|
C.ZT_Locator_delete(cl)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue