Hacktoberfest 2026: le issue che i maintainer hanno segnato per ottobre, aperte e adatte ai principianti. Sfoglia le issue Hacktoberfest

`CBORParser.getText(Writer)` writes stale text for numeric tokens, NPE for binary

Chiusa Adatta ai principianti
#844 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 1 giorno

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
2/5
Tempo stimato
1-3 ore
Idoneità per principianti
84/100
Tipo di issue
Bug
Chiarezza
Specificata chiaramente
Stato di attività
Attiva
Stack tecnologico
java

Direzione di ricerca

Inizia individuando CBORParser.getText(Writer) e confrontalo con getText() e con la correzione Smile proposta in #835. Aggiungi una copertura di regressione per i token numerici e VALUE_EMBEDDED_OBJECT usando la riproduzione fornita, verificando che l'output del writer e le lunghezze restituite corrispondano al comportamento previsto senza un'eccezione.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

cbor

Same problem as #835 (Smile), in CBORParser.getText(Writer):

  1. For numeric tokens, it writes the contents of _textBuffer (or _sharedString). CBOR never decodes numbers into _textBuffer, so whatever text was last decoded gets written, usually the previous String value. The return value is that text's length.
  2. For VALUE_EMBEDDED_OBJECT (binary), t.asCharArray() returns null, so writer.write(null) throws NullPointerException. getText() returns null for the same token.

getText() handles both cases correctly.

Reproduction
CBORFactory f = new CBORFactory();
ByteArrayOutputStream bo = new ByteArrayOutputStream();
try (JsonGenerator g = f.createGenerator(bo)) {
    g.writeStartArray();
    g.writeString("abcdefghijklmnopqrstuvwxyz0123456789");
    g.writeNumber(42);
    g.writeNumber(1.25);
    g.writeNumber(new BigInteger("123456789012345678901234567890"));
    g.writeBinary(new byte[] { 1, 2, 3 });
    g.writeEndArray();
}
try (JsonParser p = f.createParser(bo.toByteArray())) {
    JsonToken t;
    while ((t = p.nextToken()) != null) {
        if (t.isScalarValue()) {
            StringWriter w = new StringWriter();
            int n = p.getText(w);
            System.out.println(t + ": getText()=" + p.getText() + ", getText(Writer)=" + w + " (" + n + ")");
        }
    }
}

Observed (2.x; same code on 2.21), for both byte[] and InputStream input:

Token getText() getText(Writer)
VALUE_STRING "abcdefghij..." "abcdefghij..." (36)
VALUE_NUMBER_INT 42 "42" "abcdefghij..." (36)
VALUE_NUMBER_FLOAT 1.25 "1.25" "abcdefghij..." (36)
VALUE_NUMBER_INT (BigInteger) "1234567890..." "abcdefghij..." (36)
VALUE_EMBEDDED_OBJECT null NullPointerException
Suggested fix

As in #835: handle VALUE_STRING (and FIELD_NAME) directly, and fall back to super.getText(writer) for everything else. jackson-core's default goes through getText() and writes nothing for null.

Lingua principale
Java
Stelle
348
Fork
159
Merge medio
22h 34m
PR unite (30g)
39

Preparare l'ambiente

Questo progetto non fornisce container di sviluppo, Dockerfile né guida per i contributori, quindi l'ambiente è a tuo carico: parti dal suo README e consulta la nostra guida al primo contributo per i passaggi generali.

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di FasterXML/jackson-dataformats-binary

Tutte le issue di FasterXML/jackson-dataformats-binary

Issue simili

Altre issue su Java

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.