Just a comment the function choosenum is not safe, the rand() is not a good PRG, i would use if it is possible arc4random in bsd/linux. Best Regards, Giorgio.
El lun., 22 jul. 2019 a las 9:12, jean-frederic clere (<jfcl...@gmail.com>) escribió: > On 18/07/2019 11:05, Rainer Jung wrote: > > Hi Jean-Frederic and Rémy, > > > > I do not have a real answer, but a workaround. It is possible to get the > > same result without any printf style functions or atoi, just by doing > > arithmetics. But: maybe then the crash simply moves to another position. > > That is what happened, I have now: > +++ > Thread 20 "apr-8443-exec-2" received signal SIGSEGV, Segmentation fault. > [Switching to Thread 0x7fffaf7fe700 (LWP 11074)] > 0x000000000169aa0d in free () > Missing separate debuginfos, use: dnf debuginfo-install > sssd-client-2.2.0-3.fc30.x86_64 zlib-1.2.11-15.fc30.x86_64 > (gdb) bt > #0 0x000000000169aa0d in free () > #1 0x00000000016956cd in _dlerror_run () > #2 0x000000000169528d in __dlsym () > +++ > > > > > In src/ssl.c you can use: > > > > static int ssl_rand_choosenum(int l, int h) > > { > > double dbl; > > int i; > > > > dbl = 1.0 * (rand() % RAND_MAX) * (h - l); > > i = (dbl / RAND_MAX + 0.5) + 1; > > if (i < l) i = l; > > if (i > h) i = h; > > return i; > > } > > > > This will also be much faster. > > Cool, Please commit the improvement ;-) > > > > > I tested the formula against the original one for each value of l and h > > Note, that currently the function is always called with l==0 and h==127! > > So you could also drop the h and l params and use fixed values, but of > > course would loose future flexibility. > > > > between 0 and 499 (and h>=l) and for each seed between 0 and 499 on twi > > different architectures (Linux 64 Bit on x64 and Solaris Sparc 32 Bit). > > You can run the following test program to convince yourself about the > > formula correctness on your platform: > > > > #include <stdlib.h> > > #include <stdio.h> > > > > #define MAX_SEED 500 > > #define MAX_BOUNDARY 500 > > #define FEEDBACK 100000 > > > > int main () > > { > > int seed; > > int l; > > int h; > > int i1; > > int i2; > > int rand_orig; > > int rand_reduced; > > double rand_normalized; > > double rand_prod; > > char buf[50]; > > long count = 0; > > > > fprintf(stdout, "RAND_MAX is %d\n", RAND_MAX); > > fprintf(stdout, "Number of tests to run: %ld\n", > > 1L*MAX_BOUNDARY*MAX_BOUNDARY/2*MAX_SEED); > > fprintf(stdout, "Feedback dot every %d tests\n", FEEDBACK); > > fprintf(stdout, "Expect %d feedback dots\n", > > 1L*MAX_BOUNDARY*MAX_BOUNDARY/2*MAX_SEED / FEEDBACK); > > > > fprintf(stdout, > > "l\th\tseed\trand\tred\tnorm\torig\tnew\tprod\tround\n"); > > fflush(stdout); > > > > for (seed = 0; seed < MAX_SEED; seed++) { > > srand(seed); > > for (l = 0; l < MAX_BOUNDARY; l++) { > > for (h = l; h < MAX_BOUNDARY; h++) { > > rand_orig = rand(); > > rand_reduced = rand_orig % RAND_MAX; > > > > rand_normalized = ((double)rand_reduced / RAND_MAX) * (h > > - l); > > /* %.0f does rounding */ > > sprintf(buf, "%.0f", rand_normalized); > > i1 = atoi(buf) + 1; > > if (i1 < l) i1 = l; > > if (i1 > h) i1 = h; > > > > rand_prod = 1.0 * rand_reduced * (h - l); > > i2 = (rand_prod / RAND_MAX + 0.5) + 1; > > if (i2 < l) i2 = l; > > if (i2 > h) i2 = h; > > > > if (i1 != i2) { > > fprintf(stdout, > "%d\t%d\t%d\t%d\t%d\t%f\t%d\t%d\t%f\n", > > l, h, seed, rand_orig, rand_reduced, > > rand_normalized, > > i1, i2, rand_prod); > > } > > count++; > > if (count % FEEDBACK == 0) { > > fprintf(stderr, "."); > > fflush(stderr); > > } > > } > > } > > } > > } > > > > Regards, > > > > Rainer > > > > Am 18.07.2019 um 08:57 schrieb jean-frederic clere: > >> On 12/07/2019 11:21, Rémy Maucherat wrote: > >>> On Thu, Jul 11, 2019 at 11:01 PM Rainer Jung <rainer.j...@kippdata.de > >>> <mailto:rainer.j...@kippdata.de>> wrote: > >>> > >>> Am 11.07.2019 um 22:10 schrieb Rémy Maucherat: > >>> > On Thu, Jul 11, 2019 at 8:42 PM Rainer Jung > >>> <rainer.j...@kippdata.de <mailto:rainer.j...@kippdata.de> > >>> > <mailto:rainer.j...@kippdata.de > >>> <mailto:rainer.j...@kippdata.de>>> > >>> wrote: > >>> > > >>> > Hi Rémy, > >>> > > >>> > When one looks up the macros in native/include/tcn.h, this > >>> boils > >>> > down to > >>> > the following returning null: > >>> > > >>> > (*env)->FindClass(env, "org/apache/tomcat/jni/FileInfo") > >>> > > >>> > So our own FileInfo class can not be found. FindClass docs > >>> indicate its > >>> > searched in the CLASSPATH although I'm not sure whether its > >>> really the > >>> > classpath or some search paths of a class loader hierarchy. > >>> > > >>> > You might want to add the JVM commandline flag > >>> "-verbose:class" for any > >>> > easy way to track class loading. > >>> > > >>> > I didn't really grok what you meant with "define in JNI > >>> configuration". > >>> > For normal JVMs the code just works, so what might be > special > >>> for Graal > >>> > that org.apache.tomcat.jni.FileInfo can't be found? > >>> > > >>> > > >>> > A Graal native image is indeed not a normal JVM and does not > >>> support any > >>> > kind of dynamic class loading, it has to be declared first in > >>> these > >>> > configuration files. > >>> > >>> Ah OK. > >>> > >>> > So I am adding this to the jni one: > >>> > { "name":"org.apache.tomcat.jni.FileInfo" }, > >>> > { "name":"org.apache.tomcat.jni.Sockaddr" }, > >>> > { "name":"org.apache.tomcat.jni.FileInfo" }, > >>> > >>> Again FileInfo? I think instead "org.apache.tomcat.jni.Error" > >>> should be > >>> the third one. > >>> > >>> > { "name":"java.lang.String", "methods" : > >>> > > >>> > >>> > [{"name":"<init>","parameterTypes":["byte[]"]},{"name":"getBytes","parameterTypes":[]}] > >>> > >>> > >>> > } > >>> > And loading now works. > >>> > Jul 11, 2019 9:39:28 PM > >>> org.apache.catalina.core.AprLifecycleListener > >>> > lifecycleEvent > >>> > INFO: Loaded APR based Apache Tomcat Native library [1.2.23] > >>> using > >>> APR > >>> > version [1.6.5]. > >>> > Jul 11, 2019 9:39:28 PM > >>> org.apache.catalina.core.AprLifecycleListener > >>> > lifecycleEvent > >>> > INFO: APR capabilities: IPv6 [true], sendfile [true], accept > >>> filters > >>> > [false], random [true]. > >>> > Jul 11, 2019 9:39:28 PM > >>> org.apache.catalina.core.AprLifecycleListener > >>> > lifecycleEvent > >>> > INFO: APR/OpenSSL configuration: useAprConnector [false], > >>> useOpenSSL [true] > >>> > Jul 11, 2019 9:39:28 PM > >>> org.apache.catalina.core.AprLifecycleListener > >>> > initializeSSL > >>> > INFO: OpenSSL successfully initialized [OpenSSL 1.1.1c FIPS 28 > >>> May 2019] > >>> > > >>> > However when trying to actually connect I got: > >>> > Segmentation fault (core dumped) > >>> > > >>> > Oops. > >>> > >>> If the above duplicate class was just a copy and paste typo, but > >>> you > >>> had > >>> it right in your actual work, the next one could try, would be > >>> activating writing core dumps in the underlying OS. The > >>> resulting core > >>> should be inspectable depending on OS via gdb or similar tools. > The > >>> simplest gdb invocation would be > >>> > >>> gdb /path/to/my/bin/java /path/to/my/corefile > >>> > >>> and then at the gdb prompt the command > >>> > >>> bt > >>> > >>> or > >>> > >>> bt full > >>> > >>> or > >>> > >>> thread apply all bt > >>> > >>> or > >>> > >>> thread apply all bt full > >>> > >>> That way we should at least see, in which function the crash > >>> happens. > >>> Depending on symbols etc. you might even get line numbers. > >>> > >>> > >>> In the native code, it crashes on: > >>> > https://github.com/apache/tomcat-native/blob/master/native/src/ssl.c#L635 > >>> > >>> > >>> I modified the code to: > >>> double d = (((double)(rand()%RAND_MAX)/RAND_MAX)*(h-l)); > >>> apr_snprintf(buf, sizeof(buf), "%.0f", d); > >>> > >>> And it cores on the apr_snprintf. I don't see how it is unsafe though. > >>> > >>> Rémy > >>> > >> > >> I also have the same core using the AprConnector I can't really see what > >> is wrong there. > >> > >> gdb doesn't really help :-( I have replaced the apr_snprintf by snprintf > >> and I also have a core: > >> +++ > >> Thread 19 "apr-8443-exec-1" received signal SIGSEGV, Segmentation fault. > >> [Switching to Thread 0x7fffaffff700 (LWP 24724)] > >> 0x00007ffff792e41a in __GI___printf_fp_l (fp=<optimized out>, > >> loc=<optimized out>, info=<optimized out>, args=<optimized out>) at > >> ../include/ctype.h:53 > >> 53 return __libc_tsd_address (const int32_t *, CTYPE_TOLOWER); > >> Missing separate debuginfos, use: dnf debuginfo-install > >> sssd-client-2.2.0-3.fc30.x86_64 zlib-1.2.11-15.fc30.x86_64 > >> (gdb) bt > >> #0 0x00007ffff792e41a in __GI___printf_fp_l (fp=<optimized out>, > >> loc=<optimized out>, info=<optimized out>, args=<optimized out>) at > >> ../include/ctype.h:53 > >> #1 0x00007ffff7946f71 in __vfprintf_internal (s=0x7fffafffe660, > >> format=0x7ffff7ff05f7 "%.0f", ap=0x7fffafffe7e0, mode_flags=<optimized > >> out>) at vfprintf-internal.c:1644 > >> #2 0x00007ffff7959f8a in __vsnprintf_internal (string=0x7ffff7ffa2a0 > >> <buf> "", maxlen=<optimized out>, format=0x7ffff7ff05f7 "%.0f", > >> args=0x7fffafffe7e0, mode_flags=0) at vsnprintf.c:114 > >> #3 0x00007ffff7933386 in __GI___snprintf (s=<optimized out>, > >> maxlen=<optimized out>, format=<optimized out>) at snprintf.c:31 > >> #4 0x00007ffff7fe6ea4 in ssl_rand_choosenum (l=0, h=127) at > >> src/ssl.c:720 > >> +++ > >> Suggestions? > > > > --------------------------------------------------------------------- > > To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org > > For additional commands, e-mail: dev-h...@tomcat.apache.org > > > > > > > -- > Cheers > > Jean-Frederic > > --------------------------------------------------------------------- > To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org > For additional commands, e-mail: dev-h...@tomcat.apache.org > > -- Life is a chess game - Anonymous.