pilosus / pip-license-checker

Check license types for third-party dependencies: permissive, copyleft, proprietory, etc.
https://blog.pilosus.org/posts/2021/09/07/pip-license-checker/
Other
67 stars 3 forks source link

Number format exception due too long patch number #136

Closed jmfernandez closed 1 year ago

jmfernandez commented 1 year ago

One of my Python projects uses action-pip-license-checker, which has as its main component this project in its 0.44.0 release (see https://github.com/pilosus/action-pip-license-checker/blob/941b76dd138ba125db40753243e1751a8c01ca55/Dockerfile#L1). Today next exception has arisen, due my project indirectly depends on schema-salad-8.4.20230213094415

Exception in thread "main" java.lang.NumberFormatException: For input string: "20230213094415"
    at java.base/java.lang.NumberFormatException.forInputString(Unknown Source)
    at java.base/java.lang.Integer.parseInt(Unknown Source)
    at java.base/java.lang.Integer.parseInt(Unknown Source)
    at pip_license_checker.version$validate_version$fn__4331.invoke(version.clj:179)
    at clojure.core$map$fn__5935.invoke(core.clj:2770)
    at clojure.lang.LazySeq.sval(LazySeq.java:42)
    at clojure.lang.LazySeq.seq(LazySeq.java:51)
    at clojure.lang.RT.seq(RT.java:535)
    at clojure.lang.LazilyPersistentVector.create(LazilyPersistentVector.java:44)
    at clojure.core$vec.invokeStatic(core.clj:379)
    at pip_license_checker.version$validate_version.invokeStatic(version.clj:178)
    at pip_license_checker.version$parse_version.invokeStatic(version.clj:211)
    at pip_license_checker.version$parse_version.invoke(version.clj:192)
    at pip_license_checker.version$parse_version.invokeStatic(version.clj:195)
    at pip_license_checker.version$parse_specifier.invokeStatic(version.clj:403)
    at pip_license_checker.version$parse_specifier.invoke(version.clj:395)
    at clojure.core$map$fn__5935.invoke(core.clj:2770)
    at clojure.lang.LazySeq.sval(LazySeq.java:42)
    at clojure.lang.LazySeq.seq(LazySeq.java:51)
    at clojure.lang.RT.seq(RT.java:535)
    at clojure.lang.LazilyPersistentVector.create(LazilyPersistentVector.java:44)
    at clojure.core$vec.invokeStatic(core.clj:379)
    at pip_license_checker.version$parse_specifiers.invokeStatic(version.clj:411)
    at pip_license_checker.pypi$requirement__GT_rec.invokeStatic(pypi.clj:194)
    at pip_license_checker.pypi$requirement__GT_rec.invoke(pypi.clj:188)
    at clojure.core$map$fn__5935.invoke(core.clj:2770)
    at clojure.lang.LazySeq.sval(LazySeq.java:42)
    at clojure.lang.LazySeq.seq(LazySeq.java:51)
    at clojure.lang.RT.seq(RT.java:535)
    at clojure.core$seq__5467.invokeStatic(core.clj:139)
    at clojure.core$map$fn__5935.invoke(core.clj:2763)
    at clojure.lang.LazySeq.sval(LazySeq.java:42)
    at clojure.lang.LazySeq.seq(LazySeq.java:51)
    at clojure.lang.RT.seq(RT.java:535)
    at clojure.core$seq__5467.invokeStatic(core.clj:139)
    at clojure.core$pmap$step__8557$fn__8561.invoke(core.clj:7091)
    at clojure.lang.LazySeq.sval(LazySeq.java:42)
    at clojure.lang.LazySeq.seq(LazySeq.java:51)
    at clojure.lang.RT.seq(RT.java:535)
    at clojure.core$seq__5467.invokeStatic(core.clj:139)
    at clojure.core$concat$fn__5558.invoke(core.clj:727)
    at clojure.lang.LazySeq.sval(LazySeq.java:42)
    at clojure.lang.LazySeq.seq(LazySeq.java:51)
    at clojure.lang.RT.seq(RT.java:535)
    at clojure.core$seq__5467.invokeStatic(core.clj:139)
    at clojure.core$map$fn__5935.invoke(core.clj:2763)
    at clojure.lang.LazySeq.sval(LazySeq.java:42)
    at clojure.lang.LazySeq.seq(LazySeq.java:51)
    at clojure.lang.RT.seq(RT.java:535)
    at clojure.core$seq__5467.invokeStatic(core.clj:139)
    at clojure.core$map$fn__5935.invoke(core.clj:2763)
    at clojure.lang.LazySeq.sval(LazySeq.java:42)
    at clojure.lang.LazySeq.seq(LazySeq.java:51)
    at clojure.lang.Cons.next(Cons.java:39)
    at clojure.lang.RT.next(RT.java:713)
    at clojure.core$next__5451.invokeStatic(core.clj:64)
    at clojure.core.protocols$fn__8249.invokeStatic(protocols.clj:169)
    at clojure.core.protocols$fn__8249.invoke(protocols.clj:124)
    at clojure.core.protocols$fn__8204$G__8199__8213.invoke(protocols.clj:19)
    at clojure.core.protocols$seq_reduce.invokeStatic(protocols.clj:31)
    at clojure.core.protocols$fn__8236.invokeStatic(protocols.clj:75)
    at clojure.core.protocols$fn__8236.invoke(protocols.clj:75)
    at clojure.core.protocols$fn__8178$G__8173__8191.invoke(protocols.clj:13)
    at clojure.core$reduce.invokeStatic(core.clj:6886)
    at clojure.core$frequencies.invokeStatic(core.clj:7271)
    at pip_license_checker.core$get_totals.invokeStatic(core.clj:50)
    at pip_license_checker.core$get_report.invokeStatic(core.clj:71)
    at pip_license_checker.core$_main.invokeStatic(core.clj:258)
    at pip_license_checker.core$_main.doInvoke(core.clj:252)
    at clojure.lang.RestFn.applyTo(RestFn.java:137)
    at pip_license_checker.core.main(Unknown Source)

The culprit is at https://github.com/pilosus/pip-license-checker/blob/11d9a22f12254aef5497ae5114446dbbbdd96cc3/src/pip_license_checker/version.clj#L178-L179

I did my own internal microtests with this method, and Integer.parseInt fires an exception on too long integers.

So I suggest that Integer.parseInt should be replaced by BigInteger or similar.

pilosus commented 1 year ago

Hey @jmfernandez thanks for reporting. Should be fixed now:

$ lein run 'schema-salad==8.4.20230213094415'
schema-salad:8.4.20230213094415     Apache Software License                                 Permissive  
jmfernandez commented 1 year ago

Yes, now it works for these cases! Thanks!