• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Protocol Buffers - Google's data interchange format
2 // Copyright 2008 Google Inc.  All rights reserved.
3 // https://developers.google.com/protocol-buffers/
4 //
5 // Redistribution and use in source and binary forms, with or without
6 // modification, are permitted provided that the following conditions are
7 // met:
8 //
9 //     * Redistributions of source code must retain the above copyright
10 // notice, this list of conditions and the following disclaimer.
11 //     * Redistributions in binary form must reproduce the above
12 // copyright notice, this list of conditions and the following disclaimer
13 // in the documentation and/or other materials provided with the
14 // distribution.
15 //     * Neither the name of Google Inc. nor the names of its
16 // contributors may be used to endorse or promote products derived from
17 // this software without specific prior written permission.
18 //
19 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 
31 package com.google.protobuf;
32 
33 import java.io.IOException;
34 
35 /**
36  * Thrown when a protocol message being parsed is invalid in some way,
37  * e.g. it contains a malformed varint or a negative byte length.
38  *
39  * @author kenton@google.com Kenton Varda
40  */
41 public class InvalidProtocolBufferException extends IOException {
42   private static final long serialVersionUID = -1616151763072450476L;
43   private MessageLite unfinishedMessage = null;
44 
InvalidProtocolBufferException(final String description)45   public InvalidProtocolBufferException(final String description) {
46     super(description);
47   }
48 
InvalidProtocolBufferException(IOException e)49   public InvalidProtocolBufferException(IOException e) {
50     super(e.getMessage(), e);
51   }
52 
53   /**
54    * Attaches an unfinished message to the exception to support best-effort
55    * parsing in {@code Parser} interface.
56    *
57    * @return this
58    */
setUnfinishedMessage( MessageLite unfinishedMessage)59   public InvalidProtocolBufferException setUnfinishedMessage(
60       MessageLite unfinishedMessage) {
61     this.unfinishedMessage = unfinishedMessage;
62     return this;
63   }
64 
65   /**
66    * Returns the unfinished message attached to the exception, or null if
67    * no message is attached.
68    */
getUnfinishedMessage()69   public MessageLite getUnfinishedMessage() {
70     return unfinishedMessage;
71   }
72 
73   /**
74    * Unwraps the underlying {@link IOException} if this exception was caused by an I/O
75    * problem. Otherwise, returns {@code this}.
76    */
unwrapIOException()77   public IOException unwrapIOException() {
78     return getCause() instanceof IOException ? (IOException) getCause() : this;
79   }
80 
truncatedMessage()81   static InvalidProtocolBufferException truncatedMessage() {
82     return new InvalidProtocolBufferException(
83       "While parsing a protocol message, the input ended unexpectedly " +
84       "in the middle of a field.  This could mean either that the " +
85       "input has been truncated or that an embedded message " +
86       "misreported its own length.");
87   }
88 
negativeSize()89   static InvalidProtocolBufferException negativeSize() {
90     return new InvalidProtocolBufferException(
91       "CodedInputStream encountered an embedded string or message " +
92       "which claimed to have negative size.");
93   }
94 
malformedVarint()95   static InvalidProtocolBufferException malformedVarint() {
96     return new InvalidProtocolBufferException(
97       "CodedInputStream encountered a malformed varint.");
98   }
99 
invalidTag()100   static InvalidProtocolBufferException invalidTag() {
101     return new InvalidProtocolBufferException(
102       "Protocol message contained an invalid tag (zero).");
103   }
104 
invalidEndTag()105   static InvalidProtocolBufferException invalidEndTag() {
106     return new InvalidProtocolBufferException(
107       "Protocol message end-group tag did not match expected tag.");
108   }
109 
invalidWireType()110   static InvalidProtocolBufferException invalidWireType() {
111     return new InvalidProtocolBufferException(
112       "Protocol message tag had invalid wire type.");
113   }
114 
recursionLimitExceeded()115   static InvalidProtocolBufferException recursionLimitExceeded() {
116     return new InvalidProtocolBufferException(
117       "Protocol message had too many levels of nesting.  May be malicious.  " +
118       "Use CodedInputStream.setRecursionLimit() to increase the depth limit.");
119   }
120 
sizeLimitExceeded()121   static InvalidProtocolBufferException sizeLimitExceeded() {
122     return new InvalidProtocolBufferException(
123       "Protocol message was too large.  May be malicious.  " +
124       "Use CodedInputStream.setSizeLimit() to increase the size limit.");
125   }
126 
parseFailure()127   static InvalidProtocolBufferException parseFailure() {
128     return new InvalidProtocolBufferException("Failed to parse the message.");
129   }
130 
invalidUtf8()131   static InvalidProtocolBufferException invalidUtf8() {
132     return new InvalidProtocolBufferException("Protocol message had invalid UTF-8.");
133   }
134 }
135