@@ -29,30 +29,35 @@ THTensor * THPTensor_(newWithMetadataFileRaw)(int fd, THStorage *storage)
29
29
void THPStorage_ (writeFileRaw)(THStorage *self, int fd)
30
30
{
31
31
real *data;
32
+ int64_t size = self->size ;
32
33
#ifndef THC_GENERIC_FILE
33
34
data = self->data ;
34
35
#else
35
- std::unique_ptr<char []> cpu_data (new char [self-> size * sizeof (real)]);
36
+ std::unique_ptr<char []> cpu_data (new char [size * sizeof (real)]);
36
37
data = (real*)cpu_data.get ();
37
- THCudaCheck (cudaMemcpy (data, self->data , self-> size * sizeof (real), cudaMemcpyDeviceToHost));
38
+ THCudaCheck (cudaMemcpy (data, self->data , size * sizeof (real), cudaMemcpyDeviceToHost));
38
39
#endif
39
- SYSCHECK (write (fd, &self->size , sizeof (long )));
40
+ ssize_t result = write (fd, &size, sizeof (int64_t ));
41
+ if (result != sizeof (int64_t ))
42
+ throw std::system_error (result, std::system_category ());
40
43
// fast track for bytes and little endian
41
44
if (sizeof (real) == 1 || THP_nativeByteOrder () == THPByteOrder::THP_LITTLE_ENDIAN) {
42
45
char *bytes = (char *) data;
43
- uint64_t remaining = sizeof (real) * self-> size ;
46
+ int64_t remaining = sizeof (real) * size;
44
47
while (remaining > 0 ) {
45
48
ssize_t result = write (fd, bytes, remaining);
46
49
if (result < 0 )
47
50
throw std::system_error (result, std::system_category ());
48
51
bytes += result;
49
52
remaining -= result;
50
53
}
54
+ if (remaining != 0 )
55
+ throw std::system_error (result, std::system_category ());
51
56
} else {
52
- int64_t buffer_size = std::min (self-> size , (long )5000 );
57
+ int64_t buffer_size = std::min (size, (long )5000 );
53
58
std::unique_ptr<uint8_t []> le_buffer (new uint8_t [buffer_size * sizeof (real)]);
54
- for (int64_t i = 0 ; i < self-> size ; i += buffer_size) {
55
- size_t to_convert = std::min (self-> size - i, buffer_size);
59
+ for (int64_t i = 0 ; i < size; i += buffer_size) {
60
+ size_t to_convert = std::min (size - i, buffer_size);
56
61
if (sizeof (real) == 2 ) {
57
62
THP_encodeInt16Buffer ((uint8_t *)le_buffer.get (),
58
63
(const int16_t *)data + i,
@@ -77,14 +82,17 @@ void THPStorage_(writeFileRaw)(THStorage *self, int fd)
77
82
THStorage * THPStorage_ (readFileRaw)(int fd, THStorage *_storage)
78
83
{
79
84
real *data;
80
- long size;
81
- SYSCHECK (read (fd, &size, sizeof (long )));
82
-
85
+ int64_t size;
86
+ ssize_t result = read (fd, &size, sizeof (int64_t ));
87
+ if (result != sizeof (int64_t ))
88
+ throw std::system_error (result, std::system_category ());
83
89
THStoragePtr storage;
84
90
if (_storage == nullptr ) {
85
91
storage = THStorage_ (newWithSize)(LIBRARY_STATE size);
86
92
} else {
87
- THPUtils_assert (_storage->size == size, " storage has wrong size" );
93
+ THPUtils_assert (_storage->size == size,
94
+ " storage has wrong size: expected %ld got %ld" ,
95
+ size, _storage->size );
88
96
storage = _storage;
89
97
}
90
98
@@ -98,14 +106,16 @@ THStorage * THPStorage_(readFileRaw)(int fd, THStorage *_storage)
98
106
// fast track for bytes and little endian
99
107
if (sizeof (real) == 1 || THP_nativeByteOrder () == THPByteOrder::THP_LITTLE_ENDIAN) {
100
108
char *bytes = (char *) data;
101
- uint64_t remaining = sizeof (real) * storage->size ;
109
+ int64_t remaining = sizeof (real) * storage->size ;
102
110
while (remaining > 0 ) {
103
111
ssize_t result = read (fd, bytes, remaining);
104
- if (result < 0 )
112
+ if (result <= 0 ) // 0 means EOF, which is also an error
105
113
throw std::system_error (result, std::system_category ());
106
114
bytes += result;
107
115
remaining -= result;
108
116
}
117
+ if (remaining != 0 )
118
+ throw std::system_error (result, std::system_category ());
109
119
} else {
110
120
int64_t buffer_size = std::min (size, (long )5000 );
111
121
std::unique_ptr<uint8_t []> le_buffer (new uint8_t [buffer_size * sizeof (real)]);
0 commit comments