Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(18)

Side by Side Diff: third_party/protobuf/src/google/protobuf/io/coded_stream.h

Issue 21208003: Update protobuf to r428, part 1. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 7 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Protocol Buffers - Google's data interchange format 1 // Protocol Buffers - Google's data interchange format
2 // Copyright 2008 Google Inc. All rights reserved. 2 // Copyright 2008 Google Inc. All rights reserved.
3 // http://code.google.com/p/protobuf/ 3 // http://code.google.com/p/protobuf/
4 // 4 //
5 // Redistribution and use in source and binary forms, with or without 5 // Redistribution and use in source and binary forms, with or without
6 // modification, are permitted provided that the following conditions are 6 // modification, are permitted provided that the following conditions are
7 // met: 7 // met:
8 // 8 //
9 // * Redistributions of source code must retain the above copyright 9 // * Redistributions of source code must retain the above copyright
10 // notice, this list of conditions and the following disclaimer. 10 // notice, this list of conditions and the following disclaimer.
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after
163 // this constructor. 163 // this constructor.
164 explicit CodedInputStream(const uint8* buffer, int size); 164 explicit CodedInputStream(const uint8* buffer, int size);
165 165
166 // Destroy the CodedInputStream and position the underlying 166 // Destroy the CodedInputStream and position the underlying
167 // ZeroCopyInputStream at the first unread byte. If an error occurred while 167 // ZeroCopyInputStream at the first unread byte. If an error occurred while
168 // reading (causing a method to return false), then the exact position of 168 // reading (causing a method to return false), then the exact position of
169 // the input stream may be anywhere between the last value that was read 169 // the input stream may be anywhere between the last value that was read
170 // successfully and the stream's byte limit. 170 // successfully and the stream's byte limit.
171 ~CodedInputStream(); 171 ~CodedInputStream();
172 172
173 // Return true if this CodedInputStream reads from a flat array instead of
174 // a ZeroCopyInputStream.
175 inline bool IsFlat() const;
173 176
174 // Skips a number of bytes. Returns false if an underlying read error 177 // Skips a number of bytes. Returns false if an underlying read error
175 // occurs. 178 // occurs.
176 bool Skip(int count); 179 bool Skip(int count);
177 180
178 // Sets *data to point directly at the unread part of the CodedInputStream's 181 // Sets *data to point directly at the unread part of the CodedInputStream's
179 // underlying buffer, and *size to the size of that buffer, but does not 182 // underlying buffer, and *size to the size of that buffer, but does not
180 // advance the stream's current position. This will always either produce 183 // advance the stream's current position. This will always either produce
181 // a non-empty buffer or return false. If the caller consumes any of 184 // a non-empty buffer or return false. If the caller consumes any of
182 // this data, it should then call Skip() to skip over the consumed bytes. 185 // this data, it should then call Skip() to skip over the consumed bytes.
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
304 // The value returned by PushLimit() is opaque to the caller, and must 307 // The value returned by PushLimit() is opaque to the caller, and must
305 // be passed unchanged to the corresponding call to PopLimit(). 308 // be passed unchanged to the corresponding call to PopLimit().
306 Limit PushLimit(int byte_limit); 309 Limit PushLimit(int byte_limit);
307 310
308 // Pops the last limit pushed by PushLimit(). The input must be the value 311 // Pops the last limit pushed by PushLimit(). The input must be the value
309 // returned by that call to PushLimit(). 312 // returned by that call to PushLimit().
310 void PopLimit(Limit limit); 313 void PopLimit(Limit limit);
311 314
312 // Returns the number of bytes left until the nearest limit on the 315 // Returns the number of bytes left until the nearest limit on the
313 // stack is hit, or -1 if no limits are in place. 316 // stack is hit, or -1 if no limits are in place.
314 int BytesUntilLimit(); 317 int BytesUntilLimit() const;
318
319 // Returns current position relative to the beginning of the input stream.
320 int CurrentPosition() const;
315 321
316 // Total Bytes Limit ----------------------------------------------- 322 // Total Bytes Limit -----------------------------------------------
317 // To prevent malicious users from sending excessively large messages 323 // To prevent malicious users from sending excessively large messages
318 // and causing integer overflows or memory exhaustion, CodedInputStream 324 // and causing integer overflows or memory exhaustion, CodedInputStream
319 // imposes a hard limit on the total number of bytes it will read. 325 // imposes a hard limit on the total number of bytes it will read.
320 326
321 // Sets the maximum number of bytes that this CodedInputStream will read 327 // Sets the maximum number of bytes that this CodedInputStream will read
322 // before refusing to continue. To prevent integer overflows in the 328 // before refusing to continue. To prevent integer overflows in the
323 // protocol buffers implementation, as well as to prevent servers from 329 // protocol buffers implementation, as well as to prevent servers from
324 // allocating enormous amounts of memory to hold parsed messages, the 330 // allocating enormous amounts of memory to hold parsed messages, the
325 // maximum message length should be limited to the shortest length that 331 // maximum message length should be limited to the shortest length that
326 // will not harm usability. The theoretical shortest message that could 332 // will not harm usability. The theoretical shortest message that could
327 // cause integer overflows is 512MB. The default limit is 64MB. Apps 333 // cause integer overflows is 512MB. The default limit is 64MB. Apps
328 // should set shorter limits if possible. If warning_threshold is not -1, 334 // should set shorter limits if possible. If warning_threshold is not -1,
329 // a warning will be printed to stderr after warning_threshold bytes are 335 // a warning will be printed to stderr after warning_threshold bytes are
330 // read. An error will always be printed to stderr if the limit is 336 // read. For backwards compatibility all negative values get squached to -1,
331 // reached. 337 // as other negative values might have special internal meanings.
338 // An error will always be printed to stderr if the limit is reached.
332 // 339 //
333 // This is unrelated to PushLimit()/PopLimit(). 340 // This is unrelated to PushLimit()/PopLimit().
334 // 341 //
335 // Hint: If you are reading this because your program is printing a 342 // Hint: If you are reading this because your program is printing a
336 // warning about dangerously large protocol messages, you may be 343 // warning about dangerously large protocol messages, you may be
337 // confused about what to do next. The best option is to change your 344 // confused about what to do next. The best option is to change your
338 // design such that excessively large messages are not necessary. 345 // design such that excessively large messages are not necessary.
339 // For example, try to design file formats to consist of many small 346 // For example, try to design file formats to consist of many small
340 // messages rather than a single large one. If this is infeasible, 347 // messages rather than a single large one. If this is infeasible,
341 // you will need to increase the limit. Chances are, though, that 348 // you will need to increase the limit. Chances are, though, that
342 // your code never constructs a CodedInputStream on which the limit 349 // your code never constructs a CodedInputStream on which the limit
343 // can be set. You probably parse messages by calling things like 350 // can be set. You probably parse messages by calling things like
344 // Message::ParseFromString(). In this case, you will need to change 351 // Message::ParseFromString(). In this case, you will need to change
345 // your code to instead construct some sort of ZeroCopyInputStream 352 // your code to instead construct some sort of ZeroCopyInputStream
346 // (e.g. an ArrayInputStream), construct a CodedInputStream around 353 // (e.g. an ArrayInputStream), construct a CodedInputStream around
347 // that, then call Message::ParseFromCodedStream() instead. Then 354 // that, then call Message::ParseFromCodedStream() instead. Then
348 // you can adjust the limit. Yes, it's more work, but you're doing 355 // you can adjust the limit. Yes, it's more work, but you're doing
349 // something unusual. 356 // something unusual.
350 void SetTotalBytesLimit(int total_bytes_limit, int warning_threshold); 357 void SetTotalBytesLimit(int total_bytes_limit, int warning_threshold);
351 358
352 // Recursion Limit ------------------------------------------------- 359 // Recursion Limit -------------------------------------------------
353 // To prevent corrupt or malicious messages from causing stack overflows, 360 // To prevent corrupt or malicious messages from causing stack overflows,
354 // we must keep track of the depth of recursion when parsing embedded 361 // we must keep track of the depth of recursion when parsing embedded
355 // messages and groups. CodedInputStream keeps track of this because it 362 // messages and groups. CodedInputStream keeps track of this because it
356 // is the only object that is passed down the stack during parsing. 363 // is the only object that is passed down the stack during parsing.
357 364
358 // Sets the maximum recursion depth. The default is 64. 365 // Sets the maximum recursion depth. The default is 100.
359 void SetRecursionLimit(int limit); 366 void SetRecursionLimit(int limit);
360 367
368
361 // Increments the current recursion depth. Returns true if the depth is 369 // Increments the current recursion depth. Returns true if the depth is
362 // under the limit, false if it has gone over. 370 // under the limit, false if it has gone over.
363 bool IncrementRecursionDepth(); 371 bool IncrementRecursionDepth();
364 372
365 // Decrements the recursion depth. 373 // Decrements the recursion depth.
366 void DecrementRecursionDepth(); 374 void DecrementRecursionDepth();
367 375
368 // Extension Registry ---------------------------------------------- 376 // Extension Registry ----------------------------------------------
369 // ADVANCED USAGE: 99.9% of people can ignore this section. 377 // ADVANCED USAGE: 99.9% of people can ignore this section.
370 // 378 //
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
426 // if these objects are represented using DynamicMessage. 434 // if these objects are represented using DynamicMessage.
427 // 435 //
428 // Using DynamicMessageFactory on which you have called 436 // Using DynamicMessageFactory on which you have called
429 // SetDelegateToGeneratedFactory(true) should be sufficient to satisfy the 437 // SetDelegateToGeneratedFactory(true) should be sufficient to satisfy the
430 // above requirement. 438 // above requirement.
431 // 439 //
432 // If either pool or factory is NULL, both must be NULL. 440 // If either pool or factory is NULL, both must be NULL.
433 // 441 //
434 // Note that this feature is ignored when parsing "lite" messages as they do 442 // Note that this feature is ignored when parsing "lite" messages as they do
435 // not have descriptors. 443 // not have descriptors.
436 void SetExtensionRegistry(DescriptorPool* pool, MessageFactory* factory); 444 void SetExtensionRegistry(const DescriptorPool* pool,
445 MessageFactory* factory);
437 446
438 // Get the DescriptorPool set via SetExtensionRegistry(), or NULL if no pool 447 // Get the DescriptorPool set via SetExtensionRegistry(), or NULL if no pool
439 // has been provided. 448 // has been provided.
440 const DescriptorPool* GetExtensionPool(); 449 const DescriptorPool* GetExtensionPool();
441 450
442 // Get the MessageFactory set via SetExtensionRegistry(), or NULL if no 451 // Get the MessageFactory set via SetExtensionRegistry(), or NULL if no
443 // factory has been provided. 452 // factory has been provided.
444 MessageFactory* GetExtensionFactory(); 453 MessageFactory* GetExtensionFactory();
445 454
446 private: 455 private:
(...skipping 28 matching lines...) Expand all
475 // only tracks the number of bytes before that limit. This field 484 // only tracks the number of bytes before that limit. This field
476 // contains the number of bytes after it. Note that this implies that if 485 // contains the number of bytes after it. Note that this implies that if
477 // buffer_size_ == 0 and buffer_size_after_limit_ > 0, we know we've 486 // buffer_size_ == 0 and buffer_size_after_limit_ > 0, we know we've
478 // hit a limit. However, if both are zero, it doesn't necessarily mean 487 // hit a limit. However, if both are zero, it doesn't necessarily mean
479 // we aren't at a limit -- the buffer may have ended exactly at the limit. 488 // we aren't at a limit -- the buffer may have ended exactly at the limit.
480 int buffer_size_after_limit_; 489 int buffer_size_after_limit_;
481 490
482 // Maximum number of bytes to read, period. This is unrelated to 491 // Maximum number of bytes to read, period. This is unrelated to
483 // current_limit_. Set using SetTotalBytesLimit(). 492 // current_limit_. Set using SetTotalBytesLimit().
484 int total_bytes_limit_; 493 int total_bytes_limit_;
494
495 // If positive/0: Limit for bytes read after which a warning due to size
496 // should be logged.
497 // If -1: Printing of warning disabled. Can be set by client.
498 // If -2: Internal: Limit has been reached, print full size when destructing.
485 int total_bytes_warning_threshold_; 499 int total_bytes_warning_threshold_;
486 500
487 // Current recursion depth, controlled by IncrementRecursionDepth() and 501 // Current recursion depth, controlled by IncrementRecursionDepth() and
488 // DecrementRecursionDepth(). 502 // DecrementRecursionDepth().
489 int recursion_depth_; 503 int recursion_depth_;
490 // Recursion depth limit, set by SetRecursionLimit(). 504 // Recursion depth limit, set by SetRecursionLimit().
491 int recursion_limit_; 505 int recursion_limit_;
492 506
493 // See SetExtensionRegistry(). 507 // See SetExtensionRegistry().
494 const DescriptorPool* extension_pool_; 508 const DescriptorPool* extension_pool_;
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
532 uint32 ReadTagFallback(); 546 uint32 ReadTagFallback();
533 uint32 ReadTagSlow(); 547 uint32 ReadTagSlow();
534 bool ReadStringFallback(string* buffer, int size); 548 bool ReadStringFallback(string* buffer, int size);
535 549
536 // Return the size of the buffer. 550 // Return the size of the buffer.
537 int BufferSize() const; 551 int BufferSize() const;
538 552
539 static const int kDefaultTotalBytesLimit = 64 << 20; // 64MB 553 static const int kDefaultTotalBytesLimit = 64 << 20; // 64MB
540 554
541 static const int kDefaultTotalBytesWarningThreshold = 32 << 20; // 32MB 555 static const int kDefaultTotalBytesWarningThreshold = 32 << 20; // 32MB
542 static const int kDefaultRecursionLimit = 64; 556
557 static int default_recursion_limit_; // 100 by default.
543 }; 558 };
544 559
545 // Class which encodes and writes binary data which is composed of varint- 560 // Class which encodes and writes binary data which is composed of varint-
546 // encoded integers and fixed-width pieces. Wraps a ZeroCopyOutputStream. 561 // encoded integers and fixed-width pieces. Wraps a ZeroCopyOutputStream.
547 // Most users will not need to deal with CodedOutputStream. 562 // Most users will not need to deal with CodedOutputStream.
548 // 563 //
549 // Most methods of CodedOutputStream which return a bool return false if an 564 // Most methods of CodedOutputStream which return a bool return false if an
550 // underlying I/O error occurs. Once such a failure occurs, the 565 // underlying I/O error occurs. Once such a failure occurs, the
551 // CodedOutputStream is broken and is no longer useful. The Write* methods do 566 // CodedOutputStream is broken and is no longer useful. The Write* methods do
552 // not return the stream status, but will invalidate the stream if an error 567 // not return the stream status, but will invalidate the stream if an error
(...skipping 331 matching lines...) Expand 10 before | Expand all | Expand 10 after
884 inline void CodedInputStream::GetDirectBufferPointerInline(const void** data, 899 inline void CodedInputStream::GetDirectBufferPointerInline(const void** data,
885 int* size) { 900 int* size) {
886 *data = buffer_; 901 *data = buffer_;
887 *size = buffer_end_ - buffer_; 902 *size = buffer_end_ - buffer_;
888 } 903 }
889 904
890 inline bool CodedInputStream::ExpectAtEnd() { 905 inline bool CodedInputStream::ExpectAtEnd() {
891 // If we are at a limit we know no more bytes can be read. Otherwise, it's 906 // If we are at a limit we know no more bytes can be read. Otherwise, it's
892 // hard to say without calling Refresh(), and we'd rather not do that. 907 // hard to say without calling Refresh(), and we'd rather not do that.
893 908
894 if (buffer_ == buffer_end_ && buffer_size_after_limit_ != 0) { 909 if (buffer_ == buffer_end_ &&
910 ((buffer_size_after_limit_ != 0) ||
911 (total_bytes_read_ == current_limit_))) {
895 last_tag_ = 0; // Pretend we called ReadTag()... 912 last_tag_ = 0; // Pretend we called ReadTag()...
896 legitimate_message_end_ = true; // ... and it hit EOF. 913 legitimate_message_end_ = true; // ... and it hit EOF.
897 return true; 914 return true;
898 } else { 915 } else {
899 return false; 916 return false;
900 } 917 }
901 } 918 }
902 919
920 inline int CodedInputStream::CurrentPosition() const {
921 return total_bytes_read_ - (BufferSize() + buffer_size_after_limit_);
922 }
923
903 inline uint8* CodedOutputStream::GetDirectBufferForNBytesAndAdvance(int size) { 924 inline uint8* CodedOutputStream::GetDirectBufferForNBytesAndAdvance(int size) {
904 if (buffer_size_ < size) { 925 if (buffer_size_ < size) {
905 return NULL; 926 return NULL;
906 } else { 927 } else {
907 uint8* result = buffer_; 928 uint8* result = buffer_;
908 Advance(size); 929 Advance(size);
909 return result; 930 return result;
910 } 931 }
911 } 932 }
912 933
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
1032 1053
1033 inline bool CodedInputStream::IncrementRecursionDepth() { 1054 inline bool CodedInputStream::IncrementRecursionDepth() {
1034 ++recursion_depth_; 1055 ++recursion_depth_;
1035 return recursion_depth_ <= recursion_limit_; 1056 return recursion_depth_ <= recursion_limit_;
1036 } 1057 }
1037 1058
1038 inline void CodedInputStream::DecrementRecursionDepth() { 1059 inline void CodedInputStream::DecrementRecursionDepth() {
1039 if (recursion_depth_ > 0) --recursion_depth_; 1060 if (recursion_depth_ > 0) --recursion_depth_;
1040 } 1061 }
1041 1062
1042 inline void CodedInputStream::SetExtensionRegistry(DescriptorPool* pool, 1063 inline void CodedInputStream::SetExtensionRegistry(const DescriptorPool* pool,
1043 MessageFactory* factory) { 1064 MessageFactory* factory) {
1044 extension_pool_ = pool; 1065 extension_pool_ = pool;
1045 extension_factory_ = factory; 1066 extension_factory_ = factory;
1046 } 1067 }
1047 1068
1048 inline const DescriptorPool* CodedInputStream::GetExtensionPool() { 1069 inline const DescriptorPool* CodedInputStream::GetExtensionPool() {
1049 return extension_pool_; 1070 return extension_pool_;
1050 } 1071 }
1051 1072
1052 inline MessageFactory* CodedInputStream::GetExtensionFactory() { 1073 inline MessageFactory* CodedInputStream::GetExtensionFactory() {
(...skipping 11 matching lines...) Expand all
1064 total_bytes_read_(0), 1085 total_bytes_read_(0),
1065 overflow_bytes_(0), 1086 overflow_bytes_(0),
1066 last_tag_(0), 1087 last_tag_(0),
1067 legitimate_message_end_(false), 1088 legitimate_message_end_(false),
1068 aliasing_enabled_(false), 1089 aliasing_enabled_(false),
1069 current_limit_(kint32max), 1090 current_limit_(kint32max),
1070 buffer_size_after_limit_(0), 1091 buffer_size_after_limit_(0),
1071 total_bytes_limit_(kDefaultTotalBytesLimit), 1092 total_bytes_limit_(kDefaultTotalBytesLimit),
1072 total_bytes_warning_threshold_(kDefaultTotalBytesWarningThreshold), 1093 total_bytes_warning_threshold_(kDefaultTotalBytesWarningThreshold),
1073 recursion_depth_(0), 1094 recursion_depth_(0),
1074 recursion_limit_(kDefaultRecursionLimit), 1095 recursion_limit_(default_recursion_limit_),
1075 extension_pool_(NULL), 1096 extension_pool_(NULL),
1076 extension_factory_(NULL) { 1097 extension_factory_(NULL) {
1077 // Eagerly Refresh() so buffer space is immediately available. 1098 // Eagerly Refresh() so buffer space is immediately available.
1078 Refresh(); 1099 Refresh();
1079 } 1100 }
1080 1101
1081 inline CodedInputStream::CodedInputStream(const uint8* buffer, int size) 1102 inline CodedInputStream::CodedInputStream(const uint8* buffer, int size)
1082 : input_(NULL), 1103 : input_(NULL),
1083 buffer_(buffer), 1104 buffer_(buffer),
1084 buffer_end_(buffer + size), 1105 buffer_end_(buffer + size),
1085 total_bytes_read_(size), 1106 total_bytes_read_(size),
1086 overflow_bytes_(0), 1107 overflow_bytes_(0),
1087 last_tag_(0), 1108 last_tag_(0),
1088 legitimate_message_end_(false), 1109 legitimate_message_end_(false),
1089 aliasing_enabled_(false), 1110 aliasing_enabled_(false),
1090 current_limit_(size), 1111 current_limit_(size),
1091 buffer_size_after_limit_(0), 1112 buffer_size_after_limit_(0),
1092 total_bytes_limit_(kDefaultTotalBytesLimit), 1113 total_bytes_limit_(kDefaultTotalBytesLimit),
1093 total_bytes_warning_threshold_(kDefaultTotalBytesWarningThreshold), 1114 total_bytes_warning_threshold_(kDefaultTotalBytesWarningThreshold),
1094 recursion_depth_(0), 1115 recursion_depth_(0),
1095 recursion_limit_(kDefaultRecursionLimit), 1116 recursion_limit_(default_recursion_limit_),
1096 extension_pool_(NULL), 1117 extension_pool_(NULL),
1097 extension_factory_(NULL) { 1118 extension_factory_(NULL) {
1098 // Note that setting current_limit_ == size is important to prevent some 1119 // Note that setting current_limit_ == size is important to prevent some
1099 // code paths from trying to access input_ and segfaulting. 1120 // code paths from trying to access input_ and segfaulting.
1100 } 1121 }
1101 1122
1102 inline CodedInputStream::~CodedInputStream() { 1123 inline bool CodedInputStream::IsFlat() const {
1103 if (input_ != NULL) { 1124 return input_ == NULL;
1104 BackUpInputToCurrentPosition();
1105 }
1106 } 1125 }
1107 1126
1108 } // namespace io 1127 } // namespace io
1109 } // namespace protobuf 1128 } // namespace protobuf
1110 1129
1111 1130
1112 #if defined(_MSC_VER) && _MSC_VER >= 1300 1131 #if defined(_MSC_VER) && _MSC_VER >= 1300
1113 #pragma runtime_checks("c", restore) 1132 #pragma runtime_checks("c", restore)
1114 #endif // _MSC_VER 1133 #endif // _MSC_VER
1115 1134
1116 } // namespace google 1135 } // namespace google
1117 #endif // GOOGLE_PROTOBUF_IO_CODED_STREAM_H__ 1136 #endif // GOOGLE_PROTOBUF_IO_CODED_STREAM_H__
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698