B2InputStreamExcerpt casts remaining length to int, so parts over 2 GiB fail to read

Aperta Adatta ai principianti
#242 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 3 giorni

Nessuno ha ancora preso questa issue.

Valutazione

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

Direzione di ricerca

Il bug si trova in getRemaining in core/src/main/java/com/backblaze/b2/util/B2InputStreamExcerpt.java, che converte una differenza long in int. Leggi quel metodo e i suoi chiamanti alle righe 69, 85 e 96 (read, skip, available). Un unit test che avvolge uno stream con un estratto da 3 GiB e chiama read con un buffer piccolo dovrebbe riprodurre la lunghezza negativa. È completato quando la lunghezza viene limitata a Integer.MAX_VALUE e quel test passa.

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

Descrizione

What happens

getRemaining() returns (int) (pastEnd - iPosition). For an excerpt longer than Integer.MAX_VALUE bytes, the cast wraps to a negative number, and read, skip and available (which use it with Math.min) then pass a negative length down and fail. This affects only parts larger than 2 GiB.

Where

core/src/main/java/com/backblaze/b2/util/B2InputStreamExcerpt.java:146 (getRemaining), used at :69, :85 and :96.

Why it matters

Impact: Availability (an upload of such a part fails), loud. Severity: High, because it only happens for a part over 2 GiB, which needs a custom part size because the default part sizes come from the server's recommended size (about 100 MB), and there is no workaround besides smaller parts.

How to check

Found by reading the code, not reproduced. Read getRemaining and its callers. A unit test could wrap a stream in B2InputStreamExcerpt with a start of 0 and a length of 3 GiB and call read(buf, 0, 10). Clamping with (int) Math.min(Integer.MAX_VALUE, pastEnd - iPosition) would avoid the overflow.

Version

Seen at v6.5.0. Present on the default branch: present.

Lingua principale
Java
Stelle
103
Fork
23
Merge medio
5g 8h
PR unite (30g)
3

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 Backblaze/b2-sdk-java

Tutte le issue di Backblaze/b2-sdk-java

Issue simili

Altre issue su Java

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.