fix possible stackoverflow in git request handling

This commit is contained in:
Sebastian Sdorra
2017-06-01 16:07:18 +02:00
parent 2af11b1f9c
commit ee4a19365e

View File

@@ -95,6 +95,7 @@ public class ScmGitServlet extends GitServlet
* @param repositoryViewer * @param repositoryViewer
* @param repositoryProvider * @param repositoryProvider
* @param repositoryRequestListenerUtil * @param repositoryRequestListenerUtil
* @param lfsServletFactory
*/ */
@Inject @Inject
public ScmGitServlet(GitRepositoryResolver repositoryResolver, public ScmGitServlet(GitRepositoryResolver repositoryResolver,
@@ -164,22 +165,19 @@ public class ScmGitServlet extends GitServlet
* </ul> * </ul>
*/ */
private void handleRequest(HttpServletRequest request, HttpServletResponse response, Repository repository) throws ServletException, IOException { private void handleRequest(HttpServletRequest request, HttpServletResponse response, Repository repository) throws ServletException, IOException {
logger.trace("--- Repository is: {}", repository.getName()); logger.trace("--- Repository is: {}", repository.getName());
if (isLfsBatchApiRequest(request, repository.getName())) { if (isLfsBatchApiRequest(request, repository.getName())) {
logger.trace("--- detected LFS Batch API Request"); logger.trace("--- detected LFS Batch API Request");
HttpServlet servlet = lfsServletFactory.createProtocolServletFor(repository, request); handleGitLfsRequest(request, response, repository);
handleGitRequest(servlet, request, response, repository);
} else if (isLfsFileTransferRequest(request, repository.getName())) { } else if (isLfsFileTransferRequest(request, repository.getName())) {
logger.trace("--- detected LFS File Transfer Request"); logger.trace("--- detected LFS File Transfer Request");
HttpServlet servlet = lfsServletFactory.createFileLfsServletFor(repository, request); handleGitLfsRequest(request, response, repository);
handleGitRequest(servlet, request, response, repository);
} else if (isRegularGitAPIRequest(request)) { } else if (isRegularGitAPIRequest(request)) {
logger.trace("--- seems to be regular Git HTTP backend request: {}", request.getRequestURI()); logger.trace("--- seems to be regular Git HTTP backend request: {}", request.getRequestURI());
// continue with the regular git Backend // continue with the regular git Backend
handleGitRequest(this, request, response, repository); handleRegularGitRequest(request, response, repository);
} else { } else {
renderHtmlRepositryOverview(request, response); renderHtmlRepositryOverview(request, response);
} }
@@ -189,7 +187,8 @@ public class ScmGitServlet extends GitServlet
return HttpUtil.getStrippedURI(request).matches(REGEX_GITHTTPBACKEND); return HttpUtil.getStrippedURI(request).matches(REGEX_GITHTTPBACKEND);
} }
private void handleGitRequest(HttpServlet servlet, HttpServletRequest request, HttpServletResponse response, Repository repository) throws ServletException, IOException { private void handleGitLfsRequest(HttpServletRequest request, HttpServletResponse response, Repository repository) throws ServletException, IOException {
HttpServlet servlet = lfsServletFactory.createProtocolServletFor(repository, request);
if (repositoryRequestListenerUtil.callListeners(request, response, repository)) { if (repositoryRequestListenerUtil.callListeners(request, response, repository)) {
servlet.service(request, response); servlet.service(request, response);
} else if (logger.isDebugEnabled()) { } else if (logger.isDebugEnabled()) {
@@ -197,6 +196,14 @@ public class ScmGitServlet extends GitServlet
} }
} }
private void handleRegularGitRequest(HttpServletRequest request, HttpServletResponse response, Repository repository) throws ServletException, IOException {
if (repositoryRequestListenerUtil.callListeners(request, response, repository)) {
super.service(request, response);
} else if (logger.isDebugEnabled()) {
logger.debug("request aborted by repository request listener");
}
}
/** /**
* This method renders basic information about the repository into the response. The result is meant to be viewed by * This method renders basic information about the repository into the response. The result is meant to be viewed by