]> source.dussan.org Git - jgit.git/commitdiff
Consume request body before flushing the buffer 21/103721/2
authorMasaya Suzuki <masayasuzuki@google.com>
Fri, 25 Aug 2017 22:05:45 +0000 (15:05 -0700)
committerMasaya Suzuki <masayasuzuki@google.com>
Fri, 25 Aug 2017 22:23:20 +0000 (15:23 -0700)
This is continuation from https://git.eclipse.org/r/#/c/94249/. When an
error happens, we might not read the entire stream. Consume the request
body before we flush the buffer.

Change-Id: Ia473a04ace600653b2d1f2822e3023570d992410
Signed-off-by: Masaya Suzuki <masayasuzuki@google.com>
org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java

index 17af0b98388d315ff7a58e1f1b861c6845276ce2..c3f50a4d1bfed7e2bebfa9dc288e887946b20246 100644 (file)
@@ -719,7 +719,7 @@ public class UploadPack {
        }
 
        private void service() throws IOException {
-               boolean sendPack;
+               boolean sendPack = false;
                // If it's a non-bidi request, we need to read the entire request before
                // writing a response. Buffer the response until then.
                try {
@@ -752,6 +752,17 @@ public class UploadPack {
                        if (!clientShallowCommits.isEmpty())
                                walk.assumeShallow(clientShallowCommits);
                        sendPack = negotiate();
+                       if (sendPack && !biDirectionalPipe) {
+                               // Ensure the request was fully consumed. Any remaining input must
+                               // be a protocol error. If we aren't at EOF the implementation is broken.
+                               int eof = rawIn.read();
+                               if (0 <= eof) {
+                                       sendPack = false;
+                                       throw new CorruptObjectException(MessageFormat.format(
+                                                       JGitText.get().expectedEOFReceived,
+                                                       "\\x" + Integer.toHexString(eof))); //$NON-NLS-1$
+                               }
+                       }
                } catch (ServiceMayNotContinueException err) {
                        if (!err.isOutput() && err.getMessage() != null) {
                                try {
@@ -778,6 +789,11 @@ public class UploadPack {
                        }
                        throw err;
                } finally {
+                       if (!sendPack && !biDirectionalPipe) {
+                               while (0 < rawIn.skip(2048) || 0 <= rawIn.read()) {
+                                       // Discard until EOF.
+                               }
+                       }
                        rawOut.stopBuffering();
                }
 
@@ -1390,17 +1406,6 @@ public class UploadPack {
        private void sendPack() throws IOException {
                final boolean sideband = options.contains(OPTION_SIDE_BAND)
                                || options.contains(OPTION_SIDE_BAND_64K);
-
-               if (!biDirectionalPipe) {
-                       // Ensure the request was fully consumed. Any remaining input must
-                       // be a protocol error. If we aren't at EOF the implementation is broken.
-                       int eof = rawIn.read();
-                       if (0 <= eof)
-                               throw new CorruptObjectException(MessageFormat.format(
-                                               JGitText.get().expectedEOFReceived,
-                                               "\\x" + Integer.toHexString(eof))); //$NON-NLS-1$
-               }
-
                if (sideband) {
                        try {
                                sendPack(true);