Skip to content

Commit

Permalink
Do not expand file path since its not necessary for glTF asset path(U…
Browse files Browse the repository at this point in the history
…RI) and for security reason(`wordexp`).
  • Loading branch information
syoyo committed Aug 16, 2022
1 parent 544969b commit 52ff00a
Showing 1 changed file with 44 additions and 20 deletions.
64 changes: 44 additions & 20 deletions tiny_gltf.h
Expand Up @@ -26,6 +26,7 @@
// THE SOFTWARE.

// Version:
// - v2.6.0 Disable expanding file path for security(no use of awkward `wordexp` anymore).
// - v2.5.0 Add SetPreserveImageChannels() option to load image data as is.
// - v2.4.3 Fix null object output when when material has all default
// parameters.
Expand Down Expand Up @@ -108,7 +109,11 @@ namespace tinygltf {
#define TINYGLTF_COMPONENT_TYPE_INT (5124)
#define TINYGLTF_COMPONENT_TYPE_UNSIGNED_INT (5125)
#define TINYGLTF_COMPONENT_TYPE_FLOAT (5126)
#define TINYGLTF_COMPONENT_TYPE_DOUBLE (5130) // OpenGL double type. Note that some of glTF 2.0 validator does not support double type even the schema seems allow any value of integer: https://github.com/KhronosGroup/glTF/blob/b9884a2fd45130b4d673dd6c8a706ee21ee5c5f7/specification/2.0/schema/accessor.schema.json#L22
#define TINYGLTF_COMPONENT_TYPE_DOUBLE \
(5130) // OpenGL double type. Note that some of glTF 2.0 validator does not
// support double type even the schema seems allow any value of
// integer:
// https://github.com/KhronosGroup/glTF/blob/b9884a2fd45130b4d673dd6c8a706ee21ee5c5f7/specification/2.0/schema/accessor.schema.json#L22

#define TINYGLTF_TEXTURE_FILTER_NEAREST (9728)
#define TINYGLTF_TEXTURE_FILTER_LINEAR (9729)
Expand Down Expand Up @@ -613,7 +618,8 @@ struct Sampler {
int wrapT =
TINYGLTF_TEXTURE_WRAP_REPEAT; // ["CLAMP_TO_EDGE", "MIRRORED_REPEAT",
// "REPEAT"], default "REPEAT"
//int wrapR = TINYGLTF_TEXTURE_WRAP_REPEAT; // TinyGLTF extension. currently not used.
// int wrapR = TINYGLTF_TEXTURE_WRAP_REPEAT; // TinyGLTF extension. currently
// not used.

Value extras;
ExtensionMap extensions;
Expand Down Expand Up @@ -1302,8 +1308,10 @@ class TinyGLTF {
///
/// Loads glTF ASCII asset from string(memory).
/// `length` = strlen(str);
/// Set warning message to `warn` for example it fails to load asserts.
/// Returns false and set error string to `err` if there's an error.
/// `base_dir` is a search path of glTF asset(e.g. images). Path Must be an
/// expanded path (e.g. no tilde(`~`), no environment variables). Set warning
/// message to `warn` for example it fails to load asserts. Returns false and
/// set error string to `err` if there's an error.
///
bool LoadASCIIFromString(Model *model, std::string *err, std::string *warn,
const char *str, const unsigned int length,
Expand All @@ -1322,6 +1330,8 @@ class TinyGLTF {
///
/// Loads glTF binary asset from memory.
/// `length` = strlen(str);
/// `base_dir` is a search path of glTF asset(e.g. images). Path Must be an
/// expanded path (e.g. no tilde(`~`), no environment variables).
/// Set warning message to `warn` for example it fails to load asserts.
/// Returns false and set error string to `err` if there's an error.
///
Expand Down Expand Up @@ -1605,7 +1615,7 @@ class TinyGLTF {
#endif

#elif !defined(__ANDROID__) && !defined(__OpenBSD__)
#include <wordexp.h>
//#include <wordexp.h>
#endif

#if defined(__sparcv9) || defined(__powerpc__)
Expand Down Expand Up @@ -1933,10 +1943,9 @@ bool Sampler::operator==(const Sampler &other) const {
return this->extensions == other.extensions && this->extras == other.extras &&
this->magFilter == other.magFilter &&
this->minFilter == other.minFilter && this->name == other.name &&
this->wrapS == other.wrapS &&
this->wrapT == other.wrapT;
this->wrapS == other.wrapS && this->wrapT == other.wrapT;

//this->wrapR == other.wrapR
// this->wrapR == other.wrapR
}
bool Scene::operator==(const Scene &other) const {
return this->extensions == other.extensions && this->extras == other.extras &&
Expand Down Expand Up @@ -2042,8 +2051,7 @@ static std::string GetBaseDir(const std::string &filepath) {

static std::string GetBaseFilename(const std::string &filepath) {
auto idx = filepath.find_last_of("/\\");
if (idx != std::string::npos)
return filepath.substr(idx + 1);
if (idx != std::string::npos) return filepath.substr(idx + 1);
return filepath;
}

Expand Down Expand Up @@ -2605,6 +2613,18 @@ bool FileExists(const std::string &abs_filename, void *) {
}

std::string ExpandFilePath(const std::string &filepath, void *) {
// https://github.com/syoyo/tinygltf/issues/368
//
// No file path expansion in built-in FS function anymore, since glTF URI
// should not contain tilde('~') and environment variables, and for security
// reason(`wordexp`).
//
// Users need to supply `base_dir`(in `LoadASCIIFromString`,
// `LoadBinaryFromMemory`) in expanded absolute path.

return filepath;

#if 0
#ifdef _WIN32
// Assume input `filepath` is encoded in UTF-8
std::wstring wfilepath = UTF8ToWchar(filepath);
Expand Down Expand Up @@ -2652,6 +2672,7 @@ std::string ExpandFilePath(const std::string &filepath, void *) {

return s;
#endif
#endif
}

bool ReadWholeFile(std::vector<unsigned char> *out, std::string *err,
Expand Down Expand Up @@ -4242,20 +4263,20 @@ static bool ParseSparseAccessor(Accessor *accessor, std::string *err,
const json &values_obj = GetValue(values_iterator);

int indices_buffer_view = 0, indices_byte_offset = 0, component_type = 0;
if (!ParseIntegerProperty(&indices_buffer_view, err, indices_obj, "bufferView",
true, "SparseAccessor")) {
if (!ParseIntegerProperty(&indices_buffer_view, err, indices_obj,
"bufferView", true, "SparseAccessor")) {
return false;
}
ParseIntegerProperty(&indices_byte_offset, err, indices_obj, "byteOffset",
false);
if (!ParseIntegerProperty(&component_type, err, indices_obj, "componentType",
true, "SparseAccessor")) {
true, "SparseAccessor")) {
return false;
}

int values_buffer_view = 0, values_byte_offset = 0;
if (!ParseIntegerProperty(&values_buffer_view, err, values_obj, "bufferView",
true, "SparseAccessor")) {
true, "SparseAccessor")) {
return false;
}
ParseIntegerProperty(&values_byte_offset, err, values_obj, "byteOffset",
Expand Down Expand Up @@ -5094,12 +5115,13 @@ static bool ParseSampler(Sampler *sampler, std::string *err, const json &o,
int magFilter = -1;
int wrapS = TINYGLTF_TEXTURE_WRAP_REPEAT;
int wrapT = TINYGLTF_TEXTURE_WRAP_REPEAT;
//int wrapR = TINYGLTF_TEXTURE_WRAP_REPEAT;
// int wrapR = TINYGLTF_TEXTURE_WRAP_REPEAT;
ParseIntegerProperty(&minFilter, err, o, "minFilter", false);
ParseIntegerProperty(&magFilter, err, o, "magFilter", false);
ParseIntegerProperty(&wrapS, err, o, "wrapS", false);
ParseIntegerProperty(&wrapT, err, o, "wrapT", false);
//ParseIntegerProperty(&wrapR, err, o, "wrapR", false); // tinygltf extension
// ParseIntegerProperty(&wrapR, err, o, "wrapR", false); // tinygltf
// extension

// TODO(syoyo): Check the value is alloed one.
// (e.g. we allow 9728(NEAREST), but don't allow 9727)
Expand All @@ -5108,7 +5130,7 @@ static bool ParseSampler(Sampler *sampler, std::string *err, const json &o,
sampler->magFilter = magFilter;
sampler->wrapS = wrapS;
sampler->wrapT = wrapT;
//sampler->wrapR = wrapR;
// sampler->wrapR = wrapR;

ParseExtensionsProperty(&(sampler->extensions), err, o);
ParseExtrasProperty(&(sampler->extras), o);
Expand Down Expand Up @@ -7171,7 +7193,7 @@ static void SerializeGltfSampler(Sampler &sampler, json &o) {
if (sampler.minFilter != -1) {
SerializeNumberProperty("minFilter", sampler.minFilter, o);
}
//SerializeNumberProperty("wrapR", sampler.wrapR, o);
// SerializeNumberProperty("wrapR", sampler.wrapR, o);
SerializeNumberProperty("wrapS", sampler.wrapS, o);
SerializeNumberProperty("wrapT", sampler.wrapT, o);

Expand Down Expand Up @@ -7534,8 +7556,10 @@ static void WriteBinaryGltfStream(std::ostream &stream,
const uint32_t content_size = uint32_t(content.size());
const uint32_t binBuffer_size = uint32_t(binBuffer.size());
// determine number of padding bytes required to ensure 4 byte alignment
const uint32_t content_padding_size = content_size % 4 == 0 ? 0 : 4 - content_size % 4;
const uint32_t bin_padding_size = binBuffer_size % 4 == 0 ? 0 : 4 - binBuffer_size % 4;
const uint32_t content_padding_size =
content_size % 4 == 0 ? 0 : 4 - content_size % 4;
const uint32_t bin_padding_size =
binBuffer_size % 4 == 0 ? 0 : 4 - binBuffer_size % 4;

// 12 bytes for header, JSON content length, 8 bytes for JSON chunk info.
// Chunk data must be located at 4-byte boundary, which may require padding
Expand Down

0 comments on commit 52ff00a

Please sign in to comment.