kalium icon indicating copy to clipboard operation
kalium copied to clipboard

Exception During Initialization (Windows)

Open m4dc4p opened this issue 7 years ago • 3 comments

Kalium with libsodium 1.0.15 & 1.0.16 is broken, due to incorrect string handling in jnr-ffi.

  • libsodium stores the version string in 1.0.15 as 1.0.15\0\0xsalsa20.... (https://github.com/jedisct1/libsodium/issues/665)
  • jnr-ffi does not correctly read NULL-terminated static strings from binaries - its look for a double null (\0\0\0\0). (https://github.com/jnr/jnr-ffi/issues/108)

As a result, sodium_lib_version returns "1.0.15\0\0xsalsa20", and checkVersion fails because it tries to convert 15\0\0xsalsa20 to an integer.

Short of fixing jnr-ffi, Kalium could update its regex when parsing the input string to avoid this bug.

m4dc4p avatar Jan 18 '18 23:01 m4dc4p

The exception thrown is:

Exception in thread "main" java.lang.NumberFormatException: For input string: "16  xsalsa20"
at java.lang.NumberFormatException.forInputString(Unknown Source)
 at java.lang.Integer.parseInt(Unknown Source)
 at java.lang.Integer.<init>(Unknown Sour
 at org.abstractj.kalium.NaCl.checkVersion(NaCl.java:66)
 at org.abstractj.kalium.NaCl.sodium(NaCl.java:30)

Here is a short test program that demonstrates the problem (requires using 1.0.16 on Windows). Assumes jUnit:

import org.abstractj.kalium.NaCl;
import org.abstractj.kalium.NaCl.Sodium;
import org.junit.*;
import static org.junit.Assert.*;

class Test {
  @Test
  public void testSodiumVersion() {
    Sodium x = jnr.ffi.LibraryLoader.create(Sodium.class).load("libsodium");
    assertEquals(x.sodium_version_string(), "1.0.16");
  }
}

m4dc4p avatar Jan 18 '18 23:01 m4dc4p

Can be fixed by adding an @Encoding annotation (from jnr-ffi) to the method:

        @Encoding("US-ASCII")
        String sodium_version_string();

m4dc4p avatar Jan 18 '18 23:01 m4dc4p

@m4dc4p Works like a charm. It fixed an issue with parsing a Json response from C/C++ library

Amraneze avatar Dec 14 '20 21:12 Amraneze