Skip to content

Commit 85ae584

Browse files
authored
Fix return value of VFS seek function (#18561)
1 parent 149347a commit 85ae584

5 files changed

Lines changed: 37 additions & 14 deletions

File tree

libretro-common/include/streams/file_stream_transforms.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ int rfclose(RFILE* stream);
8989
int64_t rftell(RFILE* stream);
9090

9191
/** @see https://en.cppreference.com/w/c/io/fseek */
92-
int64_t rfseek(RFILE* stream, int64_t offset, int origin);
92+
int rfseek(RFILE* stream, int64_t offset, int origin);
9393

9494
/** @see https://en.cppreference.com/w/c/io/fread */
9595
int64_t rfread(void* buffer,

libretro-common/streams/file_stream_transforms.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ int64_t rftell(RFILE* stream)
8383
return filestream_tell(stream);
8484
}
8585

86-
int64_t rfseek(RFILE* stream, int64_t offset, int origin)
86+
int rfseek(RFILE* stream, int64_t offset, int origin)
8787
{
8888
int seek_position = -1;
8989

@@ -103,7 +103,7 @@ int64_t rfseek(RFILE* stream, int64_t offset, int origin)
103103
break;
104104
}
105105

106-
return filestream_seek(stream, offset, seek_position);
106+
return filestream_seek(stream, offset, seek_position) == -1 ? -1 : 0;
107107
}
108108

109109
int64_t rfread(void* buffer,

libretro-common/vfs/vfs_implementation.c

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -242,11 +242,23 @@ int64_t retro_vfs_file_seek_internal(
242242
#endif
243243
#ifdef ATLEAST_VC2005
244244
/* VC2005 and up have a special 64-bit fseek */
245-
return _fseeki64(stream->fp, offset, whence);
245+
if (_fseeki64(stream->fp, offset, whence) != 0)
246+
return -1;
247+
if ((val = _ftelli64(stream->fp)) < 0)
248+
return -1;
249+
return val;
246250
#elif defined(HAVE_64BIT_OFFSETS)
247-
return fseeko(stream->fp, (off_t)offset, whence);
251+
if (fseeko(stream->fp, (off_t)offset, whence) != 0)
252+
return -1;
253+
if ((val = ftello(stream->fp)) < 0)
254+
return -1;
255+
return val;
248256
#else
249-
return fseek(stream->fp, (long)offset, whence);
257+
if (fseek(stream->fp, (long)offset, whence) != 0)
258+
return -1;
259+
if ((val = ftell(stream->fp)) < 0)
260+
return -1;
261+
return val;
250262
#endif
251263
}
252264
#ifdef HAVE_MMAP
@@ -718,11 +730,17 @@ int64_t retro_vfs_file_tell_impl(libretro_vfs_implementation_file *stream)
718730
#endif
719731
#ifdef ATLEAST_VC2005
720732
/* VC2005 and up have a special 64-bit ftell */
721-
return _ftelli64(stream->fp);
733+
if ((val = _ftelli64(stream->fp)) < 0)
734+
return -1;
735+
return val;
722736
#elif defined(HAVE_64BIT_OFFSETS)
723-
return ftello(stream->fp);
737+
if ((val = ftello(stream->fp)) < 0)
738+
return -1;
739+
return val;
724740
#else
725-
return ftell(stream->fp);
741+
if ((val = ftell(stream->fp)) < 0)
742+
return -1;
743+
return val;
726744
#endif
727745
}
728746
#ifdef HAVE_MMAP

libretro-common/vfs/vfs_implementation_cdrom.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
*/
2222

2323
#include <vfs/vfs_implementation.h>
24+
#include <vfs/vfs_implementation_cdrom.h>
2425
#include <file/file_path.h>
2526
#include <compat/fopen_utf8.h>
2627
#include <string/stdstring.h>
@@ -139,7 +140,7 @@ int64_t retro_vfs_file_seek_cdrom(
139140
else
140141
return -1;
141142

142-
return 0;
143+
return retro_vfs_file_tell_cdrom(stream);
143144
}
144145

145146
void retro_vfs_file_open_cdrom(

libretro-common/vfs/vfs_implementation_uwp.cpp

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -136,30 +136,34 @@ int64_t retro_vfs_file_truncate_impl(libretro_vfs_implementation_file* stream, i
136136

137137
int64_t retro_vfs_file_tell_impl(libretro_vfs_implementation_file* stream)
138138
{
139+
int64_t val;
140+
139141
if (!stream)
140142
return -1;
141143

142144
if ((stream->hints & RFILE_HINT_UNBUFFERED) == 0)
143145
return _ftelli64(stream->fp);
144-
if (lseek(stream->fd, 0, SEEK_CUR) < 0)
146+
if ((val = lseek(stream->fd, 0, SEEK_CUR)) < 0)
145147
return -1;
146148

147-
return 0;
149+
return val;
148150
}
149151

150152
int64_t retro_vfs_file_seek_internal(
151153
libretro_vfs_implementation_file* stream,
152154
int64_t offset, int whence)
153155
{
156+
int64_t val;
157+
154158
if (!stream)
155159
return -1;
156160

157161
if ((stream->hints & RFILE_HINT_UNBUFFERED) == 0)
158162
return _fseeki64(stream->fp, offset, whence);
159-
if (lseek(stream->fd, (off_t)offset, whence) < 0)
163+
if ((val = lseek(stream->fd, (off_t)offset, whence)) < 0)
160164
return -1;
161165

162-
return 0;
166+
return val;
163167
}
164168

165169
int64_t retro_vfs_file_seek_impl(libretro_vfs_implementation_file* stream,

0 commit comments

Comments
 (0)