aboutsummaryrefslogtreecommitdiff
path: root/src/projections/ob_tran.cpp
diff options
context:
space:
mode:
authorEven Rouault <even.rouault@spatialys.com>2019-03-20 18:58:04 +0100
committerEven Rouault <even.rouault@spatialys.com>2019-03-20 19:58:25 +0100
commitc223eb7753c9241defcfba361ade49f1b20e6fd3 (patch)
tree039fdc689f18acc731aca31ca2b023af2f10913e /src/projections/ob_tran.cpp
parent81ee400af413e4b2449213d269c1422b8611e3aa (diff)
downloadPROJ-c223eb7753c9241defcfba361ade49f1b20e6fd3.tar.gz
PROJ-c223eb7753c9241defcfba361ade49f1b20e6fd3.zip
ob_tran: detect potential recursion
Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=12266 Credit to OSS Fuzz
Diffstat (limited to 'src/projections/ob_tran.cpp')
-rw-r--r--src/projections/ob_tran.cpp16
1 files changed, 10 insertions, 6 deletions
diff --git a/src/projections/ob_tran.cpp b/src/projections/ob_tran.cpp
index 6daae394..f9eaa6f0 100644
--- a/src/projections/ob_tran.cpp
+++ b/src/projections/ob_tran.cpp
@@ -154,6 +154,11 @@ static ARGS ob_tran_target_params (paralist *params) {
if (0!=strncmp (args.argv[i], "o_proj=", 7))
continue;
args.argv[i] += 2;
+ if (strcmp(args.argv[i], "proj=ob_tran") == 0 ) {
+ pj_dealloc (args.argv);
+ args.argc = 0;
+ args.argv = nullptr;
+ }
break;
}
@@ -164,7 +169,6 @@ static ARGS ob_tran_target_params (paralist *params) {
PJ *PROJECTION(ob_tran) {
double phip;
- char *name;
ARGS args;
PJ *R; /* projection to rotate */
@@ -176,15 +180,15 @@ PJ *PROJECTION(ob_tran) {
P->destructor = destructor;
/* get name of projection to be translated */
- if (!(name = pj_param(P->ctx, P->params, "so_proj").s))
+ if (pj_param(P->ctx, P->params, "so_proj").s == nullptr)
return destructor(P, PJD_ERR_NO_ROTATION_PROJ);
- /* avoid endless recursion */
- if( strcmp(name, "ob_tran") == 0 )
- return destructor(P, PJD_ERR_FAILED_TO_FIND_PROJ);
-
/* Create the target projection object to rotate */
args = ob_tran_target_params (P->params);
+ /* avoid endless recursion */
+ if (args.argv == nullptr ) {
+ return destructor(P, PJD_ERR_FAILED_TO_FIND_PROJ);
+ }
R = pj_init_ctx (pj_get_ctx(P), args.argc, args.argv);
pj_dealloc (args.argv);