Also check EOF in getBuffer()

This commit is contained in:
Michael Hansen
2025-08-28 15:58:28 -07:00
parent 0e7be40367
commit 38799f5cfb
2 changed files with 13 additions and 9 deletions

View File

@@ -60,9 +60,12 @@ int PycFile::getByte()
return ch; return ch;
} }
int PycFile::getBuffer(int bytes, void* buffer) void PycFile::getBuffer(int bytes, void* buffer)
{ {
return (int)fread(buffer, 1, bytes, m_stream); if (fread(buffer, 1, bytes, m_stream) != (size_t)bytes) {
fputs("PycFile::getBuffer(): Unexpected end of stream\n", stderr);
std::exit(1);
}
} }
@@ -78,14 +81,15 @@ int PycBuffer::getByte()
return ch & 0xFF; // Make sure it's just a byte! return ch & 0xFF; // Make sure it's just a byte!
} }
int PycBuffer::getBuffer(int bytes, void* buffer) void PycBuffer::getBuffer(int bytes, void* buffer)
{ {
if (m_pos + bytes > m_size) if (m_pos + bytes > m_size) {
bytes = m_size - m_pos; fputs("PycBuffer::getBuffer(): Unexpected end of stream\n", stderr);
std::exit(1);
}
if (bytes != 0) if (bytes != 0)
memcpy(buffer, (m_buffer + m_pos), bytes); memcpy(buffer, (m_buffer + m_pos), bytes);
m_pos += bytes; m_pos += bytes;
return bytes;
} }
int formatted_print(std::ostream& stream, const char* format, ...) int formatted_print(std::ostream& stream, const char* format, ...)

6
data.h
View File

@@ -19,7 +19,7 @@ public:
virtual bool atEof() const = 0; virtual bool atEof() const = 0;
virtual int getByte() = 0; virtual int getByte() = 0;
virtual int getBuffer(int bytes, void* buffer) = 0; virtual void getBuffer(int bytes, void* buffer) = 0;
int get16(); int get16();
int get32(); int get32();
Pyc_INT64 get64(); Pyc_INT64 get64();
@@ -34,7 +34,7 @@ public:
bool atEof() const override; bool atEof() const override;
int getByte() override; int getByte() override;
int getBuffer(int bytes, void* buffer) override; void getBuffer(int bytes, void* buffer) override;
private: private:
FILE* m_stream; FILE* m_stream;
@@ -50,7 +50,7 @@ public:
bool atEof() const override { return (m_pos == m_size); } bool atEof() const override { return (m_pos == m_size); }
int getByte() override; int getByte() override;
int getBuffer(int bytes, void* buffer) override; void getBuffer(int bytes, void* buffer) override;
private: private:
const unsigned char* m_buffer; const unsigned char* m_buffer;