Core: LowLevelHttpResponse not disconnected when HttpResponse construction throws RuntimeException
Evaluación
- Dificultad
- 2/5
- Tiempo estimado
- 1-3 horas
- Aptitud para principiantes
- 84/100
- Tipo de issue
- Error
- Claridad
- Bien especificado
- Estado de actividad
- Tranquilo
- Stack tecnológico
- java
- Área
- networking
Línea de trabajo
Empieza en google-http-client/src/main/java/com/google/api/client/http/HttpRequest.java, centrándote en HttpRequest.execute() y su bloque finally. Reproduce el fallo con un LowLevelHttpResponse cuyo getContentEncoding() lance una excepción y, después, ejecuta testExecute_disconnectOnResponseConstructionFailure. Se considera terminado cuando la respuesta de bajo nivel se desconecta si falla la construcción de la respuesta y la prueba de regresión pasa.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Environment details:
- Core — HttpRequest.execute() in google-http-client
- OS type and version: Any (not OS-specific)
- Java version: Any (reproduces on Java 8+)
- google-http-client version(s): reproducible on current main
Steps to reproduce:
- Implement a LowLevelHttpResponse whose getContentEncoding() throws a RuntimeException.
- Execute an HttpRequest against that transport.
- Catch the RuntimeException from execute().
- Observe disconnect() was never called on the low-level response.
Code example:
MockLowLevelHttpResponse failingResponse = new MockLowLevelHttpResponse() {
@Override
public String getContentEncoding() {
throw new RuntimeException("simulated failure");
}
};
HttpTransport transport = new MockHttpTransport() {
@Override
public LowLevelHttpRequest buildRequest(String method, String url) throws IOException {
return new MockLowLevelHttpRequest().setResponse(failingResponse);
}
};
HttpRequest req = transport.createRequestFactory()
.buildGetRequest(new GenericUrl("http://example.com"));
try {
req.execute();
} catch (RuntimeException e) {
// failingResponse.isDisconnected() == false <-- BUG: socket leaked
}
Stack trace:
None — silent resource leak, not a crash. The RuntimeException propagates as expected; the
bug is that execute()'s finally block never calls LowLevelHttpResponse#disconnect() here.
External references:
- HttpRequest#execute(): google-http-client/src/main/java/com/google/api/client/http/HttpRequest.java
Any additional information:
Under sustained error conditions, leaked connections accumulate until the pool is exhausted,
risking DoS/thread starvation. Pre-existing bug, unrelated to security hardening — found
opportunistically during a security audit of this file.
Proposed fix — in execute()'s finally block, add a guarded disconnect():
} finally {
if (!responseConstructed && lowLevelHttpResponse != null) {
try {
InputStream c = lowLevelHttpResponse.getContent();
if (c != null) c.close();
} catch (IOException ignored) {}
try {
lowLevelHttpResponse.disconnect();
} catch (IOException ignored) {}
}
}
Regression test testExecute_disconnectOnResponseConstructionFailure included in the
accompanying PR.
- Lenguaje dominante
- Java
- Estrellas
- 1.4k
- Forks
- 474
- Métricas de merge de PR
- Sin PR fusionados en 30 d
Preparar el entorno
- Sin Dockerfile ni archivo de Docker Compose
- Tiene una plantilla de pull request
- Leer la guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de googleapis/google-http-java-client
-
GenericData.containsKey() returns true for unset (null) declared fields, violating Map contractAbierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 84/100
googleapis/google-http-java-client#2187 · 1 comentario ·
-
Core: Validate header names and values to prevent CRLF injectionPosiblemente ocupada @insaf021 la tomó hace 65 días. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
-
Core: XmlPullParser processes external DTD entities (XXE) — disable FEATURE_PROCESS_DOCDECL in Xml#createParser()Posiblemente ocupada @insaf021 la tomó hace 65 días. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 84/100
-
type: cleanup
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
-
org.apache.http.conn.ssl.SSLSocketFactory is deprecatedQuizá libre de nuevo Un pull request para esta issue se cerró sin fusionarse. Abiertopriority: p2 type: cleanup
Dificultad 2/5 1-3 horas Aptitud para principiantes 65/100
Todos los issues de googleapis/google-http-java-client
Issues similares
-
Clarify Javadoc for Logger methods taking Object... arguments with regards to Throwable detectionAbierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
-
Dificultad 1/5 1-3 horas Aptitud para principiantes 88/100
-
[Bug] The shared instance selector's placeholder and no-match text ignore the display languagePosiblemente ocupada Un pull request vinculado a esta issue está abierto o ya se fusionó. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 90/100
apache/rocketmq-dashboard#5561 ·
Los mantenedores suelen responder en 3 días
-
enhancement
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
HMCL-dev/HMCL#6934 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
test(setup): GitHub configuration tests fail when the temp path is long enough for YAML foldingPosiblemente ocupada Un pull request vinculado a esta issue está abierto o ya se fusionó. Abiertobug good first issue help wanted priority medium size S
Dificultad 2/5 1-3 horas Aptitud para principiantes 84/100
martin-francois/symphony-trello#776 · 1 comentario ·
Los mantenedores suelen responder en 1 día