• 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, e.g. it contains a malformed
37  * 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 
InvalidProtocolBufferException(final String description, IOException e)53   public InvalidProtocolBufferException(final String description, IOException e) {
54     super(description, e);
55   }
56 
57   /**
58    * Attaches an unfinished message to the exception to support best-effort parsing in {@code
59    * Parser} interface.
60    *
61    * @return this
62    */
setUnfinishedMessage(MessageLite unfinishedMessage)63   public InvalidProtocolBufferException setUnfinishedMessage(MessageLite unfinishedMessage) {
64     this.unfinishedMessage = unfinishedMessage;
65     return this;
66   }
67 
68   /**
69    * Returns the unfinished message attached to the exception, or null if no message is attached.
70    */
getUnfinishedMessage()71   public MessageLite getUnfinishedMessage() {
72     return unfinishedMessage;
73   }
74 
75   /**
76    * Unwraps the underlying {@link IOException} if this exception was caused by an I/O problem.
77    * Otherwise, returns {@code this}.
78    */
unwrapIOException()79   public IOException unwrapIOException() {
80     return getCause() instanceof IOException ? (IOException) getCause() : this;
81   }
82 
truncatedMessage()83   static InvalidProtocolBufferException truncatedMessage() {
84     return new InvalidProtocolBufferException(
85         "While parsing a protocol message, the input ended unexpectedly "
86             + "in the middle of a field.  This could mean either that the "
87             + "input has been truncated or that an embedded message "
88             + "misreported its own length.");
89   }
90 
negativeSize()91   static InvalidProtocolBufferException negativeSize() {
92     return new InvalidProtocolBufferException(
93         "CodedInputStream encountered an embedded string or message "
94             + "which claimed to have negative size.");
95   }
96 
malformedVarint()97   static InvalidProtocolBufferException malformedVarint() {
98     return new InvalidProtocolBufferException("CodedInputStream encountered a malformed varint.");
99   }
100 
invalidTag()101   static InvalidProtocolBufferException invalidTag() {
102     return new InvalidProtocolBufferException("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 InvalidWireTypeException invalidWireType() {
111     return new InvalidWireTypeException("Protocol message tag had invalid wire type.");
112   }
113 
114   /** Exception indicating that and unexpected wire type was encountered for a field. */
115   @ExperimentalApi
116   public static class InvalidWireTypeException extends InvalidProtocolBufferException {
117     private static final long serialVersionUID = 3283890091615336259L;
118 
InvalidWireTypeException(String description)119     public InvalidWireTypeException(String description) {
120       super(description);
121     }
122   }
123 
recursionLimitExceeded()124   static InvalidProtocolBufferException recursionLimitExceeded() {
125     return new InvalidProtocolBufferException(
126         "Protocol message had too many levels of nesting.  May be malicious.  "
127             + "Use CodedInputStream.setRecursionLimit() to increase the depth limit.");
128   }
129 
sizeLimitExceeded()130   static InvalidProtocolBufferException sizeLimitExceeded() {
131     return new InvalidProtocolBufferException(
132         "Protocol message was too large.  May be malicious.  "
133             + "Use CodedInputStream.setSizeLimit() to increase the size limit.");
134   }
135 
parseFailure()136   static InvalidProtocolBufferException parseFailure() {
137     return new InvalidProtocolBufferException("Failed to parse the message.");
138   }
139 
invalidUtf8()140   static InvalidProtocolBufferException invalidUtf8() {
141     return new InvalidProtocolBufferException("Protocol message had invalid UTF-8.");
142   }
143 }
144