Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add support for OpenBSD #1313

Merged
merged 4 commits into from
Sep 3, 2021
Merged

Add support for OpenBSD #1313

merged 4 commits into from
Sep 3, 2021

Conversation

ZhanYF
Copy link
Contributor

@ZhanYF ZhanYF commented Aug 20, 2021

It's been on my to-do list for quite some time now, finally got a chance to do it. This PR aims to:

Tested on OpenBSD 7.0-beta/AMD64.

output of make check: https://github.com/ZhanYF/static/blob/main/checkLog

  • 1 of 3 tests failed, but I guess that's due to not building fibers?

any comment? I have to admit I'm not familiar with capnproto/fibers/c++ in general, so please feel free to tweak it :)

@ZhanYF ZhanYF marked this pull request as ready for review August 20, 2021 13:52
@jclee
Copy link
Collaborator

jclee commented Aug 20, 2021

FYI, I expect you'd want to amend this line in async-test as well, which might help with the failing test:
https://github.com/capnproto/capnproto/blob/4079a9c/c%2B%2B/src/kj/async-test.c%2B%2B#L29

Copy link
Member

@kentonv kentonv left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi @ZhanYF,

Thanks for working on this!

c++/Makefile.am Outdated
@@ -421,10 +421,14 @@ capnpc_c___SOURCES = src/capnp/compiler/capnpc-c++.c++
# Also attempt to run ldconfig, because otherwise users get confused. If
# it fails (e.g. because the platform doesn't have it, or because the
# user doesn't have root privileges), don't worry about it.
#
# We need to specify the path for OpenBSD.
install-exec-hook:
ln -sf capnp $(DESTDIR)$(bindir)/capnpc
ldconfig < /dev/null > /dev/null 2>&1 || true
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do you intentionally want to run ldconfig bare once, and then a second time with paths, on OpenBSD? Or should this be in an "else" block below?

Copy link
Contributor Author

@ZhanYF ZhanYF Aug 21, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Technically an 'else' block is not required since the second ldconfig will overwrite the effect of the first ldconfig on OpenBSD, but I see how an 'else' block can make things better. Updated.

@@ -85,7 +85,7 @@ void setCloseOnExec(int fd) {
}

static constexpr uint NEW_FD_FLAGS =
#if __linux__ && !__BIONIC__
#if __linux__ && KJ_USE_FIBERS
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It looks like you assumed every instance of !__BIONIC__ is guarding fiber code, but there are actually many reasons why we check for Bionic in different parts of the code. Most of these ifdefs are unrelated to fibers. This one here actually only matches Linux, so obviously it doesn't need to be updated to support OpenBSD. Can you remove the changes that aren't fiber-related?

In fact, nothing in this file is fiber-related.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for letting me know that, I restricted the scope the KJ_USE_FIBERS and reverted the change done on this file. Please take a look :)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm... @ZhanYF I don't see this (& other lines within this file) reverted. Is it possible you forgot to push the updated version or didn't revert it completely?

@@ -1483,7 +1483,7 @@ kj::Own<PeerIdentity> SocketAddress::getIdentity(kj::LowLevelAsyncIoProvider& ll
result.uid = creds.uid;
}

#elif defined(LOCAL_PEERCRED)
#elif defined(LOCAL_PEERCRED) && __OpenBSD__
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It looks like your change on this line will actually break platforms other than OpenBSD that use this block of code.

Copy link
Contributor Author

@ZhanYF ZhanYF Aug 21, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is a mistake and is now reverted, thanks!

Edit: actually I mean updated, it should be && !__OpenBSD__ on a different branch.

@ZhanYF
Copy link
Contributor Author

ZhanYF commented Aug 21, 2021

FYI, I expect you'd want to amend this line in async-test as well, which might help with the failing test:
https://github.com/capnproto/capnproto/blob/4079a9c/c%2B%2B/src/kj/async-test.c%2B%2B#L29

This indeed helped, but there are still some failed tests which I have no idea how to fix, e.g.:

kj/mutex.c++:963: error: pthread_mutex_destroy(&waiter.stupidMutex); strerror(pthreadError) = Invalid argument
kj/mutex.c++:963: pthread_mutex_destroy(&waiter.stupidMutex); strerror(pthreadError) = Invalid argument
stack: 

log:
https://raw.githubusercontent.com/ZhanYF/static/main/checkLog.2

Any idea on what might be causing that?

@ZhanYF ZhanYF requested a review from kentonv August 21, 2021 03:09
Copy link
Contributor

@vlovich vlovich left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It might be a good idea to set up CI for OpenBSD (https://github.com/cross-platform-actions/openbsd-builder ?). Otherwise, the bitrot risk seems high.

Regarding the failed tests, is that for the version of code that's pushed or some version you're testing locally? I'm assuming the tests are being run on OpenBSD? I don't know why the tests would be failing on OpenBSD. It looks like it's using the pthread-based implementation & I'm not sure how well that branch is covered by automation. I think you'll have to dig in & debug what's going on if you want to figure that part out. If you're just using plain cap'n'proto messages, then mutexes don't really come up. They're needed if you're using KJ's event loop (& cap'n'proto RPC since it's built on top of that).

That being said, AFAICT, OpenBSD has futex as of 6.2. Not sure if that's the minimum version that can be targeted for your use-case, but, if so, it might be to adjust the macro at the top of mutex.h to define KJ_USE_FUTEX to 1 by default on OpenBSD & see if that bypasses the problem.

install-exec-hook:
ln -sf capnp $(DESTDIR)$(bindir)/capnpc
ldconfig < /dev/null > /dev/null 2>&1 || true

if [ `uname` == 'OpenBSD' ]; then \
Copy link
Contributor

@vlovich vlovich Aug 22, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: Is this Bash or Bourne shell? If the former, I would prefer using [[ ]] for the conditional and $() for the subshell invocation. It's not a big deal here but it's just a safer pattern to just blindly follow & not think about shell nuances. As I said, not a big deal & feel free to ignore if you want (& definitely ignore if the shell is an old-school Bourne shell).

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is an automake file, so we need to assume bourne shell.

@@ -85,7 +85,7 @@ void setCloseOnExec(int fd) {
}

static constexpr uint NEW_FD_FLAGS =
#if __linux__ && !__BIONIC__
#if __linux__ && KJ_USE_FIBERS
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm... @ZhanYF I don't see this (& other lines within this file) reverted. Is it possible you forgot to push the updated version or didn't revert it completely?

@@ -1472,7 +1472,7 @@ kj::Own<PeerIdentity> SocketAddress::getIdentity(kj::LowLevelAsyncIoProvider& ll
// seen vague references on the internet saying that a PID of 0 and a UID of uid_t(-1) are used
// as invalid values.

#if defined(SO_PEERCRED)
#if defined(SO_PEERCRED) && !__OpenBSD__
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should this be reverted as well?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think so, this is intentional as OpenBSD requires struct xucred creds here. Reverting it will cause the following error:

src/kj/async-io-unix.c++:1476:20: error: variable has incomplete type 'struct ucred'
      struct ucred creds;
                   ^
src/kj/async-io-unix.c++:1476:14: note: forward declaration of 'ucred'
      struct ucred creds;

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It seems like I forget to push the fully reverted version last time, this file should be good now. Thanks for pointing that out.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you add a comment here that OpenBSD defines SO_PEERCRED but uses a different interface for it, hence we're falling back to LOCAL_PEERCRED?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agree, done.

@@ -1443,7 +1452,7 @@ FiberStack::FiberStack(size_t stackSizeParam)
// We can create fibers before we convert the main thread into a fiber in FiberBase
KJ_WIN32(osFiber = CreateFiber(stackSize, &StartRoutine::run, this));

#elif !__BIONIC__
#elif !__BIONIC__ && KJ_USE_FIBERS
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this condition redundant? Is this different from simply doing #elif KJ_USE_FIBERS?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It is indeed redundant here, forgot to change it last time, should be OK now.

@@ -1472,7 +1481,7 @@ FiberStack::FiberStack(size_t stackSizeParam)
FiberStack::~FiberStack() noexcept(false) {
#if _WIN32 || __CYGWIN__
DeleteFiber(osFiber);
#elif !__BIONIC__
#elif !__BIONIC__ && KJ_USE_FIBERS
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same here.

@ZhanYF
Copy link
Contributor Author

ZhanYF commented Aug 28, 2021

It might be a good idea to set up CI for OpenBSD (https://github.com/cross-platform-actions/openbsd-builder ?). Otherwise, the bitrot risk seems high.

I agree, it's just that the current approach used in cross-platform-actions is relying on macOS for nested virtualization, and since I don't have a mac, the debugging process has not been very smooth. My limited test results show that super-test.sh (and probably other scripts) will need to be tweaked to be compatible with bsd style tools. Perhaps I should open another PR/issue for that?

That being said, AFAICT, OpenBSD has futex as of 6.2. Not sure if that's the minimum version that can be targeted for your use-case, but, if so, it might be to adjust the macro at the top of mutex.h to define KJ_USE_FUTEX to 1 by default on OpenBSD & see if that bypasses the problem.

The current futex syscall on OpenBSD only supports three operations (FUTEX_WAIT/FUTEX_WAKE/FUTEX_REQUEUE) and mutex.c++ needs FUTEX_WAIT_BITSET_PRIVATE, so I don't think I can get it to work now. However since I don't need it for my use case it's not really a road blocker for me.

Copy link
Member

@kentonv kentonv left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why did you remove a bunch of CI tests?

@@ -1472,7 +1472,7 @@ kj::Own<PeerIdentity> SocketAddress::getIdentity(kj::LowLevelAsyncIoProvider& ll
// seen vague references on the internet saying that a PID of 0 and a UID of uid_t(-1) are used
// as invalid values.

#if defined(SO_PEERCRED)
#if defined(SO_PEERCRED) && !__OpenBSD__
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you add a comment here that OpenBSD defines SO_PEERCRED but uses a different interface for it, hence we're falling back to LOCAL_PEERCRED?

@sobomax
Copy link
Contributor

sobomax commented Aug 30, 2021

Just a quick note that I've integrated some OpenBSD conditionals into KJ_USE_FIBERS in PR #1321

@ZhanYF
Copy link
Contributor Author

ZhanYF commented Aug 31, 2021

Sorry, the CI removal part was a mistake, it was meant to be for my WIP CI test branch. Reverted.

@kentonv
Copy link
Member

kentonv commented Sep 1, 2021

#1321 has been merged covering a lot of similar ground to your PR. Can you rebase and reduce this PR to just the OpenBSD specifics?

@@ -77,7 +77,7 @@ $CAPNP convert json:binary $SCHEMA TestAllTypes < $TESTDATA/pretty.json | cmp $T
$CAPNP convert json:binary $SCHEMA TestAllTypes < $TESTDATA/short.json | cmp $TESTDATA/binary - || fail short json to binary

$CAPNP convert json:binary $JSON_SCHEMA TestJsonAnnotations -I"$SRCDIR" < $TESTDATA/annotated.json | cmp $TESTDATA/annotated-json.binary - || fail annotated json to binary
$CAPNP convert binary:json $JSON_SCHEMA TestJsonAnnotations -I"$SRCDIR" < $TESTDATA/annotated-json.binary | cmp $TESTDATA/annotated.json - || fail annotated json to binary
$CAPNP convert binary:json $JSON_SCHEMA TestJsonAnnotations -I"$SRCDIR" < $TESTDATA/annotated-json.binary | cmp $TESTDATA/annotated.json - || fail annotated binary to json
Copy link
Contributor Author

@ZhanYF ZhanYF Sep 3, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I understand this is not OpenBSD specific but since we are here perhaps we can also fix the naming in this line.

Tested this PR branch on OpenBSD 7.0 snapshot, works fine.

@kentonv kentonv merged commit 7cce94f into capnproto:master Sep 3, 2021
@kentonv
Copy link
Member

kentonv commented Sep 3, 2021

Thanks!

@kentonv
Copy link
Member

kentonv commented Sep 18, 2021

Hi @ZhanYF,

I've put together a point release including your OpenBSD changes:

https://capnproto.org/capnproto-c++-0.9.1-rc1.tar.gz

Can you verify it works?

@ZhanYF
Copy link
Contributor Author

ZhanYF commented Sep 23, 2021

Thanks for that, I can confirm this works on the latest OpenBSD snapshot w/ amd64.
(7.0 GENERIC.MP#223)

P.S.: I've got the GitHub CI pipeline working now, but tests for known-broken features generate a large amount of noise, should I patch those tests out in my pipeline?

@kentonv
Copy link
Member

kentonv commented Sep 23, 2021

@ZhanYF Hmm, what features are "known-broken"? We could #ifdef-out those tests on OpenBSD if needed, though obviously it would be better to fix the bugs if at all possible.

@ZhanYF
Copy link
Contributor Author

ZhanYF commented Sep 27, 2021

@kentonv

Sorry for the delay, I'm busy at the moment so can't investigate all the errors.

Here is a list of failed tests from log.test.txt:

  • Everything has to do with mutex, because at the moment futex syscall on OpenBSD only supports three operations (FUTEX_WAIT/FUTEX_WAKE/FUTEX_REQUEUE) and mutex.c++ needs at least FUTEX_WAIT_BITSET_PRIVATE

    • This is unlikely to change in near future and generates the most noise, so we should probably ifdef them out
  • Filesystem related things:

kj/filesystem-disk-test.c++:339: failed: expected kj::str(mapping.slice(0, 6).asChars()) == "quxbaz" [fDobaz == quxbaz]
kj/filesystem-disk-test.c++:340: failed: expected kj::str(writableMapping->get().slice(0, 6).asChars()) == "quxbaz" [fDobaz == quxbaz]
kj/filesystem-disk-test.c++:344: failed: expected kj::str(mapping.slice(12, 17).asChars()) == "corge" [^@^@^@^@^@ == corge]
kj/filesystem-disk-unix.c++:919: failed: create(path): Operation not permitted; path = .kj-tmp.81341.19.foo.partial

They seem to be related to kj, but I don't know how to debug that.

  • TLS errors
kj/compat/tls-test.c++:682: failed: expected ::kj::_::hasSubstring(e->getDescription(), message); exception description didn't contain expected substring; *e = kj/compat/tls.c++:162: failed: TLS peer's certificate is not trusted; reason = error number 62
kj/compat/tls-test.c++:732: failed: expected ::kj::_::hasSubstring(e->getDescription(), "alert"); exception description didn't contain expected substring; *e = kj/compat/tls.c++:66: failed: OpenSSL error; message = error:1404C45C:SSL routines:ST_OK:reason(1116)

This might be due to the fact that OpenBSD uses LibreSSL instead of OpenSSL, but I'm not sure.

  • Xthread error
[ FAIL ] kj/async-xthread-test.c++:473: cross-thread cancellation cycle (889 μs)
[ FAIL ] kj/async-xthread-test.c++:547: call own thread's executor (625 μs)
  • Some legacy tests for async io
[ TEST ] kj/async-io-test.c++:701: legacy test: AsyncIo/ScmRightsTruncatedEven
[ FAIL ] kj/async-io-test.c++:701: legacy test: AsyncIo/ScmRightsTruncatedEven (754 μs)

@kentonv
Copy link
Member

kentonv commented Sep 27, 2021

Everything has to do with mutex, because at the moment futex syscall on OpenBSD only supports three operations

KJ only uses futex if __linux__ is defined. OpenBSD should be falling back to the pthread-based mutex implementation. So I'm confused how you'd be seeing futex issues...

Filesystem related things:

Yikes, looks like some sort of corruption when using mmap?

TLS errors

Oh great, LibreSSL produces different error strings than either upstream OpenSSL or BoringSSL? I guess we'll need to adjust the test to accept any of them.

Xthread error

Were there any error messages associated with these two failures?

Some legacy tests for async io

To be clear the word "legacy" here refers to how the test was declared (using the googletest syntax vs. KJ syntax), but the test is still very much valid. It looks like OpenBSD may need to be added to the #if __APPLE__ || __FreeBSD__ check in async-io-unix.c++ that works around a bug in SCM_RIGHTS handling present on those systems.

@ZhanYF
Copy link
Contributor Author

ZhanYF commented Dec 2, 2021

Hi, sorry for the looong delay, I got way too busy recently...


KJ only uses futex if __linux__ is defined. OpenBSD should be falling back to the pthread-based mutex implementation. So I'm confused how you'd be seeing futex issues...

You're right, sorry for the confusion. This is not the default and I got those errors because I was testing with KJ_USE_FUTEX defined, due to the pthread-based implementation being broken. Unfortunately both the FUTEX implementation and the pthread-based one are broken. Here is the errors I got when using the pthread-based implementation:

kj/mutex.c++:963: pthread_mutex_destroy(&waiter.stupidMutex); strerror(pthreadError) = Invalid argument
stack:
kj/mutex.c++:963: error: pthread_mutex_destroy(&waiter.stupidMutex); strerror(pthreadError) = Invalid argument
kj/mutex.c++:963: pthread_mutex_destroy(&waiter.stupidMutex); strerror(pthreadError) = Invalid argument
stack:
kj/mutex.c++:963: pthread_mutex_destroy(&waiter.stupidMutex); strerror(pthreadError) = Invalid argument
stack:
kj/mutex.c++:963: pthread_mutex_destroy(&waiter.stupidMutex); strerror(pthreadError) = Invalid argument
stack:
[ FAIL ] kj/mutex-test.c++:262: legacy test: Mutex/WhenWithTimeout (279188 s)

looks like the pthread_mutex_destroy(&waiter.stupidMutex); call is the source of our problem here, errors disappeared after commenting it out, I tried to debug it but with no success, will come back to that later.


Yikes, looks like some sort of corruption when using mmap?

Yes, part of the string is corrupted. I tried to debug it but that rabbit hole is too deep...


Oh great, LibreSSL produces different error strings than either upstream OpenSSL or BoringSSL? I guess we'll need to adjust the test to accept any of them.

agree, after adding those strings to the test the errors went away.


Xthread error

Were there any error messages associated with these two failures?

The Xthread related failure is also caused by pthread_mutex_destroy not working properly and the messages are the same.


It looks like OpenBSD may need to be added to the #if __APPLE__ || __FreeBSD__ check in async-io-unix.c++ that works around a bug in SCM_RIGHTS handling present on those systems.

Thanks for the pointer! It does seem to be the case and this fixes the following failure:
kj/async-io-test.c++:701: legacy test: AsyncIo/ScmRightsTruncatedEven

... but there is still another failure in this category:

[ TEST ] kj/async-io-test.c++:174: legacy test: AsyncIo/UnixSocket
kj/async-io-test.c++:206: LocalPeerIdentity for unix socket had null UID
stack:
kj/async-io-test.c++:234: LocalPeerIdentity for unix socket had null UID
stack:
[ FAIL ] kj/async-io-test.c++:174: legacy test: AsyncIo/UnixSocket (612 _s))


humm... maybe I should send a PR to fix the libressl/ScmRights failures?


sidenote:

When testing in a guest VM running on OpenBSD's native hypervisor vmd, the following test will fail, which is likely due to a known bug which leads to clock drifting1. I think we can safely ignore this one for now as I would expect the clock drifting issue to be fixed before any large deployment of vmd......

[ TEST ] kj/time-test.c++:95: all clocks advance in real time
kj/time-test.c++:142: clocks seem inaccurate even after 20 tries; coarseCalDiff / kj::MICROSECONDS = 320008; prec
iseCalDiff / kj::MICROSECONDS = 320008; coarseMonoDiff / kj::MICROSECONDS = 320008; preciseMonoDiff / kj::MICROSE
CONDS = 320008
stack:
[ FAIL ] kj/time-test.c++:95: all clocks advance in real time (6398299 s)

@kentonv
Copy link
Member

kentonv commented Dec 3, 2021

pthread_mutex_destroy(&waiter.stupidMutex); strerror(pthreadError) = Invalid argument

I think this is because we're using PTHREAD_MUTEX_INITIALIZER to initialize the mutex instead of pthread_mutex_init()... technically PTHREAD_MUTEX_INITIALIZER should only be used for static-global mutexes which would never be destroyed. I think switching to pthread_mutex_init() at the start of Mutex::wait() should solve it. Probably should do the same with PTHREAD_COND_INITIALIZER used there as well.

LocalPeerIdentity for unix socket had null UID

I guess this suggests that LOCAL_PEERCRED is not working? You'll have to debug this. This test is not very important as Cap'n Proto doesn't really use this functionality, it's just something KJ supports for applications to use.

buildroot-auto-update pushed a commit to buildroot/buildroot that referenced this pull request Dec 11, 2021
- Drop patch (already in version)
- Fix build on musl by disabling fibers through the new KJ_USE_FIBERS
  variable:
  capnproto/capnproto#1167
  capnproto/capnproto#1313
- Update indentation in hash file (two spaces)

https://capnproto.org/news

Fixes:
 - http://autobuild.buildroot.org/results/1a54cf9e7223c2bd67a5c85a6f2f42aa98da3a53

Signed-off-by: Fabrice Fontaine <fontaine.fabrice@gmail.com>
Signed-off-by: Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be>
buildroot-auto-update pushed a commit to buildroot/buildroot that referenced this pull request Jan 14, 2022
- Drop patch (already in version)
- Fix build on musl by disabling fibers through the new KJ_USE_FIBERS
  variable:
  capnproto/capnproto#1167
  capnproto/capnproto#1313
- Update indentation in hash file (two spaces)

https://capnproto.org/news

Fixes:
 - http://autobuild.buildroot.org/results/1a54cf9e7223c2bd67a5c85a6f2f42aa98da3a53

Signed-off-by: Fabrice Fontaine <fontaine.fabrice@gmail.com>
Signed-off-by: Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be>
(cherry picked from commit ee3e17a)
Signed-off-by: Peter Korsgaard <peter@korsgaard.com>
buildroot-auto-update pushed a commit to buildroot/buildroot that referenced this pull request Jan 14, 2022
- Drop patch (already in version)
- Fix build on musl by disabling fibers through the new KJ_USE_FIBERS
  variable:
  capnproto/capnproto#1167
  capnproto/capnproto#1313
- Update indentation in hash file (two spaces)

https://capnproto.org/news

Fixes:
 - http://autobuild.buildroot.org/results/1a54cf9e7223c2bd67a5c85a6f2f42aa98da3a53

Signed-off-by: Fabrice Fontaine <fontaine.fabrice@gmail.com>
Signed-off-by: Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be>
(cherry picked from commit ee3e17a)
Signed-off-by: Peter Korsgaard <peter@korsgaard.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants