OLD | NEW |
1 // Copyright 2014 The Crashpad Authors. All rights reserved. | 1 // Copyright 2014 The Crashpad Authors. All rights reserved. |
2 // | 2 // |
3 // Licensed under the Apache License, Version 2.0 (the "License"); | 3 // Licensed under the Apache License, Version 2.0 (the "License"); |
4 // you may not use this file except in compliance with the License. | 4 // you may not use this file except in compliance with the License. |
5 // You may obtain a copy of the License at | 5 // You may obtain a copy of the License at |
6 // | 6 // |
7 // http://www.apache.org/licenses/LICENSE-2.0 | 7 // http://www.apache.org/licenses/LICENSE-2.0 |
8 // | 8 // |
9 // Unless required by applicable law or agreed to in writing, software | 9 // Unless required by applicable law or agreed to in writing, software |
10 // distributed under the License is distributed on an "AS IS" BASIS, | 10 // distributed under the License is distributed on an "AS IS" BASIS, |
(...skipping 15 matching lines...) Expand all Loading... |
26 | 26 |
27 namespace crashpad { | 27 namespace crashpad { |
28 | 28 |
29 StringFile::StringFile() : string_(), offset_(0) { | 29 StringFile::StringFile() : string_(), offset_(0) { |
30 } | 30 } |
31 | 31 |
32 StringFile::~StringFile() { | 32 StringFile::~StringFile() { |
33 } | 33 } |
34 | 34 |
35 void StringFile::SetString(const std::string& string) { | 35 void StringFile::SetString(const std::string& string) { |
36 CHECK_LE(string.size(), | 36 CHECK_LE( |
37 implicit_cast<size_t>(std::numeric_limits<ssize_t>::max())); | 37 string.size(), |
| 38 implicit_cast<size_t>(std::numeric_limits<FileOperationResult>::max())); |
38 string_ = string; | 39 string_ = string; |
39 offset_ = 0; | 40 offset_ = 0; |
40 } | 41 } |
41 | 42 |
42 void StringFile::Reset() { | 43 void StringFile::Reset() { |
43 string_.clear(); | 44 string_.clear(); |
44 offset_ = 0; | 45 offset_ = 0; |
45 } | 46 } |
46 | 47 |
47 ssize_t StringFile::Read(void* data, size_t size) { | 48 FileOperationResult StringFile::Read(void* data, size_t size) { |
48 DCHECK(offset_.IsValid()); | 49 DCHECK(offset_.IsValid()); |
49 | 50 |
50 const size_t offset = offset_.ValueOrDie(); | 51 const size_t offset = offset_.ValueOrDie(); |
51 if (offset >= string_.size()) { | 52 if (offset >= string_.size()) { |
52 return 0; | 53 return 0; |
53 } | 54 } |
54 | 55 |
55 const size_t nread = std::min(size, string_.size() - offset); | 56 const size_t nread = std::min(size, string_.size() - offset); |
56 | 57 |
57 base::CheckedNumeric<ssize_t> new_offset = offset_; | 58 base::CheckedNumeric<FileOperationResult> new_offset = offset_; |
58 new_offset += nread; | 59 new_offset += nread; |
59 if (!new_offset.IsValid()) { | 60 if (!new_offset.IsValid()) { |
60 LOG(ERROR) << "Read(): file too large"; | 61 LOG(ERROR) << "Read(): file too large"; |
61 return -1; | 62 return -1; |
62 } | 63 } |
63 | 64 |
64 memcpy(data, &string_[offset], nread); | 65 memcpy(data, &string_[offset], nread); |
65 offset_ = new_offset; | 66 offset_ = new_offset; |
66 | 67 |
67 return nread; | 68 return nread; |
68 } | 69 } |
69 | 70 |
70 bool StringFile::Write(const void* data, size_t size) { | 71 bool StringFile::Write(const void* data, size_t size) { |
71 DCHECK(offset_.IsValid()); | 72 DCHECK(offset_.IsValid()); |
72 | 73 |
73 const size_t offset = offset_.ValueOrDie(); | 74 const size_t offset = offset_.ValueOrDie(); |
74 if (offset > string_.size()) { | 75 if (offset > string_.size()) { |
75 string_.resize(offset); | 76 string_.resize(offset); |
76 } | 77 } |
77 | 78 |
78 base::CheckedNumeric<ssize_t> new_offset = offset_; | 79 base::CheckedNumeric<FileOperationResult> new_offset = offset_; |
79 new_offset += size; | 80 new_offset += size; |
80 if (!new_offset.IsValid()) { | 81 if (!new_offset.IsValid()) { |
81 LOG(ERROR) << "Write(): file too large"; | 82 LOG(ERROR) << "Write(): file too large"; |
82 return false; | 83 return false; |
83 } | 84 } |
84 | 85 |
85 string_.replace(offset, size, reinterpret_cast<const char*>(data), size); | 86 string_.replace(offset, size, reinterpret_cast<const char*>(data), size); |
86 offset_ = new_offset; | 87 offset_ = new_offset; |
87 | 88 |
88 return true; | 89 return true; |
89 } | 90 } |
90 | 91 |
91 bool StringFile::WriteIoVec(std::vector<WritableIoVec>* iovecs) { | 92 bool StringFile::WriteIoVec(std::vector<WritableIoVec>* iovecs) { |
92 DCHECK(offset_.IsValid()); | 93 DCHECK(offset_.IsValid()); |
93 | 94 |
94 if (iovecs->empty()) { | 95 if (iovecs->empty()) { |
95 LOG(ERROR) << "WriteIoVec(): no iovecs"; | 96 LOG(ERROR) << "WriteIoVec(): no iovecs"; |
96 return false; | 97 return false; |
97 } | 98 } |
98 | 99 |
99 // Avoid writing anything at all if it would cause an overflow. | 100 // Avoid writing anything at all if it would cause an overflow. |
100 base::CheckedNumeric<ssize_t> new_offset = offset_; | 101 base::CheckedNumeric<FileOperationResult> new_offset = offset_; |
101 for (const WritableIoVec& iov : *iovecs) { | 102 for (const WritableIoVec& iov : *iovecs) { |
102 new_offset += iov.iov_len; | 103 new_offset += iov.iov_len; |
103 if (!new_offset.IsValid()) { | 104 if (!new_offset.IsValid()) { |
104 LOG(ERROR) << "WriteIoVec(): file too large"; | 105 LOG(ERROR) << "WriteIoVec(): file too large"; |
105 return false; | 106 return false; |
106 } | 107 } |
107 } | 108 } |
108 | 109 |
109 for (const WritableIoVec& iov : *iovecs) { | 110 for (const WritableIoVec& iov : *iovecs) { |
110 if (!Write(iov.iov_base, iov.iov_len)) { | 111 if (!Write(iov.iov_base, iov.iov_len)) { |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
163 << " invalid for size_t"; | 164 << " invalid for size_t"; |
164 return -1; | 165 return -1; |
165 } | 166 } |
166 | 167 |
167 offset_ = new_offset_sizet; | 168 offset_ = new_offset_sizet; |
168 | 169 |
169 return offset_.ValueOrDie(); | 170 return offset_.ValueOrDie(); |
170 } | 171 } |
171 | 172 |
172 } // namespace crashpad | 173 } // namespace crashpad |
OLD | NEW |